MediaWiki:Gadget-friendlytag.js: Perbedaan antara revisi

Konten dihapus Konten ditambahkan
Repo at d9666d4: Update Twinkle from upstream
Repo at a491314: tracking branch 'upstream/master'; Add untag functionality (#485); fix bug when processing items with type=div; Cleanup regex, put tags under AfD notices, fix prod regex, put under salt and endorsed prod (#579); Remove globalize/India; Put new tags under salt and endorsed prod; Put tags under AfD notices, fix prod detection, tidy regex
Baris 1:
//<nowiki>
 
(function($) {
 
(function($){
 
 
Baris 29 ⟶ 28:
else if( [0, 118].indexOf(mw.config.get('wgNamespaceNumber')) !== -1 && mw.config.get('wgCurRevisionId') ) {
Twinkle.tag.mode = 'article';
// Can't remove tags when not viewing current version
Twinkle.addPortletLink( Twinkle.tag.callback, "Tag", "friendly-tag", "Beri tag pemeliharaan ke artikel" );
Twinkle.tag.canRemove = (mw.config.get('wgCurRevisionId') === mw.config.get('wgRevisionId')) &&
// Disabled on latest diff because the diff slider could be used to slide
// away from the latest diff without causing the script to reload
!mw.config.get('wgDiffNewId');
Twinkle.addPortletLink( Twinkle.tag.callback, "Tag", "friendly-tag", "Berikan atau hapus tag pemeliharaan ke artikel" );
}
};
 
Twinkle.tag.checkedTags = [];
 
Twinkle.tag.callback = function friendlytagCallback() {
Baris 70 ⟶ 76:
]
});
 
if (! Twinkle.tag.canRemove) {
var divElement = document.createElement('div');
divElement.innerHTML = 'For removal of existing tags, please open Tag menu from the current version of article';
form.append({
type: 'div',
name: 'untagnotice',
label: divElement
});
}
 
form.append({
Baris 148 ⟶ 164:
 
if (Twinkle.tag.mode === "article") {
 
Twinkle.tag.alreadyPresentTags = [];
 
if (Twinkle.tag.canRemove) {
// Look for existing maintenance tags in the lead section and put them in array
 
// All tags are HTML table elements that are direct children of .mw-parser-output,
// except when they are within {{multiple issues}}
$('.mw-parser-output').children().each( function parsehtml(i,e) {
 
// break out on encountering the first heading, which means we are no
// longer in the lead section
if (e.tagName === 'H2')
return false;
 
// The ability to remove tags depends on the template's {{ambox}} |name=
// parameter bearing the template's correct name (preferably) or a name that at
// least redirects to the actual name
 
// All tags have their first class name as "box-" + template name
if (e.className.indexOf('box-') === 0) {
if (e.classList[0] === 'box-Multiple_issues') {
$(e).find('.ambox').each(function(idx, e) {
var tag = e.classList[0].slice(4).replace(/_/g,' ');
Twinkle.tag.alreadyPresentTags.push(tag);
});
return true; // continue
}
 
var tag = e.classList[0].slice(4).replace(/_/g,' ');
Twinkle.tag.alreadyPresentTags.push(tag);
}
} );
 
// {{Uncategorized}} and {{Improve categories}} are usually placed at the end
if ($(".box-Uncategorized").length) {
Twinkle.tag.alreadyPresentTags.push('Uncategorized');
}
if ($(".box-Improve_categories").length) {
Twinkle.tag.alreadyPresentTags.push('Improve categories');
}
 
}
 
// fake a change event on the sort dropdown, to initialize the tag list
var evt = document.createEvent("Event");
evt.initEvent("change", true, true);
result.sortorder.dispatchEvent(evt);
 
} else {
// Redirects and files: Add a link to each template's description page
Morebits.quickForm.getElements(result, Twinkle.tag.mode + "Tags").forEach(generateLinks);
}
};
 
Twinkle.tag.checkedTags = [];
 
Twinkle.tag.updateSortOrder = function(e) {
var sortorder = e.target.value;
 
Twinkle.tag.checkedTags = e.target.form.getChecked("articleTags");
if (!Twinkle.tag.checkedTags) {
Baris 174 ⟶ 235:
}
switch (tag) {
case "cleanupCleanup":
checkbox.subgroup = {
name: 'cleanup',
Baris 183 ⟶ 244:
};
break;
case "closeClose paraphrasing":
checkbox.subgroup = {
name: 'closeParaphrasing',
Baris 191 ⟶ 252:
};
break;
case "copyCopy edit":
checkbox.subgroup = {
name: 'copyEdit',
Baris 200 ⟶ 261:
};
break;
case "copypasteCopypaste":
checkbox.subgroup = {
name: 'copypaste',
Baris 209 ⟶ 270:
};
break;
case "expandExpand language":
checkbox.subgroup = [ {
name: 'expandLanguageLangCode',
Baris 223 ⟶ 284:
];
break;
case "expertExpert needed":
checkbox.subgroup = [
{
name: 'expertNeeded',
type: 'input',
label: 'Nama ProyekWiki terkait: ',
tooltip: 'Opsional. Berikan nama ProyekWiki yang dapat membantu merekrut pengguna ahli. Jangan berikan awalan "WikiProject" atau "ProyekWiki".'
},
{
name: 'expertNeededReason',
type: 'input',
label: 'Alasan: ',
tooltip: 'Short explanation describing the issue. Either Reason or Talk link is required.'
// TODO: Translate
},
tooltip: 'Short explanation describing the issue. Either Reason or Talk link is required.'
}, {
name: 'expertNeededTalk',
{
name type: 'expertNeededTalkinput',
type label: 'inputDiskusi pembicaraan: ',
tooltip: 'Name of the section of this article\'s talk page where the issue is being discussed. Do not give a link, just the name of the section. Either Reason or Talk link is required.'
label: 'Diskusi pembicaraan: ',
// TODO: Translate}
tooltip: 'Name of the section of this article\'s talk page where the issue is being discussed. Do not give a link, just the name of the section. Either Reason or Talk link is required.'
}
];
break;
case "globalizeGlobalize":
checkbox.subgroup = {
name: 'globalize',
Baris 264 ⟶ 323:
{ label: "{{globalize/France}}: artikel berisi konten yang dibuat terutama dalam sudut pandang masyarakat Peranc", value: "globalize/France" },
{ label: "{{globalize/Germany}}: article deals primarily with the German viewpoint", value: "globalize/Germany" },
{ label: "{{globalize/India}}: article deals primarily with the Indian viewpoint", value: "globalize/India" },
{ label: "{{globalize/Middle East}}: article deals primarily with the Middle Eastern viewpoint", value: "globalize/Middle East" },
{ label: "{{globalize/North America}}: article deals primarily with the North American viewpoint", value: "globalize/North America" },
Baris 279 ⟶ 337:
};
break;
case "historyHistory merge":
checkbox.subgroup = [
{
Baris 301 ⟶ 359:
];
break;
case "mergeMerge":
case "mergeMerge from":
case "mergeMerge to":
var otherTagName = "mergeMerge";
switch (tag)
{
case "mergeMerge from":
otherTagName = "digabungkanMerge keto";
break;
case "mergeMerge to":
otherTagName = "digabungMerge darifrom";
break;
}
Baris 338 ⟶ 396:
type: 'textarea',
label: 'Alasan penggabungan (akan dikirimkan ke ' +
(tag === "digabungkanMerge kefrom" ? 'artikel lainnya' : 'artikel ini') + ' halaman pembicaraan):',
tooltip: 'Opsional, namun sangat disarankan. Kosongkan jika tidak diinginkan. Hanya tersedia jika nama artikel tunggal diberikan.'
});
}
break;
// case "notNot English":
case "notNot Indonesian":
case "roughRough translation":
checkbox.subgroup = [
{
Baris 354 ⟶ 412:
}
];
// if (tag === "notNot English") {
if (tag === "notNot Indonesian") {
checkbox.subgroup.push({
name: 'translationNotify',
Baris 368 ⟶ 426:
});
}
if (mw.config.get('wgNamespaceNumber') === 0) {
checkbox.subgroup.push({
name: 'translationPostAtPNT',
type: 'checkbox',
list: [
{
label: 'List this article at Wikipedia:Pages needing translation into English (PNT)',
// TODO: Translate
checked: true
label: 'List this article at Wikipedia:Pages needing translation into English (PNT)',
checked: true}
}]
]});
checkbox.subgroup.push({
});
name: 'translationComments',
checkbox.subgroup.push({
name type: 'translationCommentstextarea',
type label: 'textareaAdditional comments to post at PNT',
tooltip: 'Optional, and only relevant if "List this article ..." above is checked.'
// TODO: Translate
});
label: 'Additional comments to post at PNT',
}
tooltip: 'Optional, and only relevant if "List this article ..." above is checked.'
})break;
case "Notability":
}
break;
case "notability":
checkbox.subgroup = {
name: 'notability',
Baris 416 ⟶ 472:
}
return checkbox;
};
 
var makeCheckboxesForAlreadyPresentTags = function() {
container.append({ type: "header", id: "tagHeader0", label: "Tags already present" });
var subdiv = container.append({ type: "div", id: "tagSubdiv0" });
var checkboxes = [];
Twinkle.tag.alreadyPresentTags.forEach( function(tag) {
var description = Twinkle.tag.article.tags[tag];
var checkbox =
{
value: tag,
label: "{{" + tag + "}}" + ( description ? (": " + description) : ""),
checked: true
//, subgroup: { type: 'input', name: 'removeReason', label: 'Reason', tooltip: 'Enter reason for removing this tag' }
// TODO: add option for providing reason for removal
};
 
checkboxes.push(checkbox);
} );
subdiv.append({
type: "checkbox",
name: "alreadyPresentArticleTags",
list: checkboxes
});
};
 
Baris 425 ⟶ 505:
$.each(array, function(k, tag) {
var description = Twinkle.tag.article.tags[tag];
if (Twinkle.tag.alreadyPresentTags.indexOf(tag) === -1) {
checkboxes.push(makeCheckbox(tag, description));
checkboxes.push(makeCheckbox(tag, description));
}
});
subdiv.append({
Baris 434 ⟶ 516:
};
 
if(Twinkle.tag.alreadyPresentTags.length > 0) {
var i = 0;
makeCheckboxesForAlreadyPresentTags();
}
var i = 1;
// go through each category and sub-category and append lists of checkboxes
$.each(Twinkle.tag.article.tagCategories, function(title, content) {
Baris 451 ⟶ 536:
// alphabetical sort order
else {
if(Twinkle.tag.alreadyPresentTags.length > 0) {
makeCheckboxesForAlreadyPresentTags();
container.append({ type: "header", id: "tagHeader1", label: "Available tags" });
}
var checkboxes = [];
$.each(Twinkle.tag.article.tags, function(tag, description) {
if (Twinkle.tag.alreadyPresentTags.indexOf(tag) === -1) {
checkboxes.push(makeCheckbox(tag, description));
checkboxes.push(makeCheckbox(tag, description));
}
});
container.append({
Baris 477 ⟶ 568:
$workarea.find("div").filter(":has(span.quickformDescription)").css({ 'margin-top': '0.4em' });
 
Morebits.quickForm.getElements(e.target.form, "articleTags").forEach(generateLinks);
// add a link to each template's description page
$.each(var alreadyPresentTags = Morebits.quickForm.getElements(e.target.form, "articleTagsalreadyPresentArticleTags"), function(index, checkbox) {;
if (alreadyPresentTags) {
var $checkbox = $(checkbox);
alreadyPresentTags.forEach(generateLinks);
var link = Morebits.htmlNode("a", ">");
}
link.setAttribute("class", "tag-template-link");
};
var linkto = Morebits.string.toUpperCaseFirstChar(checkbox.values);
 
link.setAttribute("href", mw.util.getUrl(
/**
(linkto.indexOf(":") === -1 ? "Template:" : "") +
* Adds a link to each template's description page
(linkto.indexOf("|") === -1 ? linkto : linkto.slice(0,linkto.indexOf("|")))
* @param {Morebits.quickForm.element} checkbox associated with the template
));
*/
link.setAttribute("target", "_blank");
var generateLinks = function(checkbox) {
$checkbox.parent().append(["\u00A0", link]);
var link = Morebits.htmlNode("a", ">");
});
link.setAttribute("class", "tag-template-link");
var tagname = checkbox.values;
link.setAttribute("href", mw.util.getUrl(
(tagname.indexOf(":") === -1 ? "Template:" : "") +
(tagname.indexOf("|") === -1 ? tagname : tagname.slice(0,tagname.indexOf("|")))
));
link.setAttribute("target", "_blank");
$(checkbox).parent().append(["\u00A0", link]);
};
 
Baris 501 ⟶ 600:
 
Twinkle.tag.article.tags = {
"advertAdvert": "artikel ditulis seperti iklan",
"allAll plot": "artikel hampir semuanya ringkasan alur",
"autobiographyAutobiography": "artikel adalah otobiografi yang tidak ditulis secara netral",
"BLP sources": "artikel tokoh yang masih hidup perlu referensi lebih banyak untuk diperiksa",
"BLP unsourced": "artikel tokoh yang masih hidup yang tidak punya referensi",
"citationCitation style": "artikel yang kutipannya tidak jelas atau tak konsisten",
"cleanupCleanup": "artikel memerlukan perapian",
"Cleanup bare URLs": "article uses bare URLs for references, which are prone to link rot",
"cleanup reorganize": "artikel memerlukan pengubahan struktur agar sesuai dengan pedoman Wikipedia",
"Cleanup-PR": "article reads like a press release or news release",
"cleanup rewrite": "article may need to be rewritten entirely to comply with Wikipedia's quality standards", // TODO
"closeCleanup paraphrasingreorganize": "artikel mengandungmemerlukan parafrasapengubahan yangstruktur miripagar sesuai dengan sumber tidak bebas berhakpedoman ciptaWikipedia",
"Cleanup rewrite": "article may need to be rewritten entirely to comply with Wikipedia's quality standards",
"Cleanup tense": "article is written in an incorrect tense",
"Close paraphrasing": "artikel mengandung parafrasa yang mirip dengan sumber tidak bebas berhak cipta",
"COI": "pembuat artikel memiliki konflik kepentingan",
"condenseCondense": "artikel mungkin punya banyak kepala bagian yang membagi-bagi isinya",
"confusingConfusing": "artikel tidak memiliki isi yang jelas (membingungkan)",
"contextContext": "konteks isi artikel tidak mencukupi",
"copyCopy edit": "artikel butuh perbaikan pada tata bahasa, gaya, relasi antarparagrag, dan/atau ejaan",
"copypasteCopypaste": "artikel terkesan disalin dari sebuah sumber",
"Current": "article documents a current event",
"dead end": "artikel tidak punya hubungan dengan artikel lain",
"Disputed": "akurasi aktual isi halaman dipertanyakan",
"current": "article documents a current event", // TODO
"Essay-like": "artikel ditulis seperti esai atau opini",
"disputed": "akurasi aktual isi halaman dipertanyakan",
"essay-likeExpand language": "artikel ditulisdapat dikembangkan dengan materi sepertidari esaiWikipedia ataubahasa opinilain",
"expandExpert languageneeded": "artikel dapatperlu dikembangkandilihat denganoleh materipengguna dariyang Wikipediaahli bahasadi lainbidang ini",
"External links": "pranala luar artikel tidak mengikuti pedoman dan kebijakan",
"expert needed": "artikel perlu dilihat oleh pengguna yang ahli di bidang ini",
"external linksFanpov": "pranala luar artikel tidak mengikutimirip pedomandengan dansitus kebijakanpenggemar",
"fanpovFiction": "artikel miriptidak dengandapat situsdibedakan penggemarantara nyata atau fiksi",
"fictionGlobalize": "artikel tidak dapatmewakili dibedakansudut antarapandang nyataumum atausubjek fiksitersebut",
"GOCEinuse": "article is currently undergoing a major copy edit by the Guild of Copy Editors",
"globalize": "artikel tidak mewakili sudut pandang umum subjek tersebut",
"History merge": "another page should be history merged into this one",
// "GOCEinuse": "article is currently undergoing a major copy edit by the Guild of Copy Editors",
"Hoax": "artikel berisi informasi palsu",
"history merge": "another page should be history merged into this one", // TODO
"hoaxImprove categories": "artikel berisibutuh informasikategori palsutambahan",
"improve categoriesIncomprehensible": "artikel butuhsulit untuk dipahami atau kategoritidak tambahankomprehensif",
"In-universe": "subjek artikel adalah fiksi dan butuh gaya penulisan dari sudut pandang nonfiksi",
"incomprehensible": "artikel sulit untuk dipahami atau tidak komprehensif",
"In use": "artikel dalam pengembangan dalam waktu dekat",
"in-universe": "subjek artikel adalah fiksi dan butuh gaya penulisan dari sudut pandang nonfiksi",
"inLead usemissing": "artikel dalamtidak pengembanganmemiliki dalambagian waktupengantar dekatdan perlu ditulis",
"leadLead missingrewrite": "pengantar artikel tidak memiliki bagian pengantar dan perlusesuai ditulispedoman",
"leadLead rewritetoo long": "pengantar artikel tidaksangat panjang dan harus dibuat sesuailebih pedomanringkas",
"leadLead too longshort": "pengantar artikel sangat panjangpendek dan harus dibuat lebih ringkasdikembangkan",
"Like resume": "article is written like a resume",
"lead too short": "pengantar artikel sangat pendek dan harus dikembangkan",
"Long plot": "ringkasan alur di artikel terlalu panjang",
"like resume": "article is written like a resume", // TODO
"linkrotManual": "sumber referensigaya artikel sudah mati, danmirip penulisannyadengan harusbuku diperbaikipedoman",
"Merge": "artikel ini perlu digabungkan ke artikel lain",
"long plot": "ringkasan alur di artikel terlalu panjang",
"manualMerge from": "gaya artikel miriplain denganharus bukudigabungkan ke artikel pedomanini",
"mergeMerge to": "artikel ini perluharus digabungkan ke artikel lain",
"More citations needed": "article needs additional references or sources for verification",
"merge from": "artikel lain harus digabungkan ke artikel ini",
"mergeMore tofootnotes": "artikel inisudah haruspunya digabungkanreferensi, kenamun artikelhanya punya sedikit catatan lainkaki",
"No footnotes": "artikel punya referensi, namun tidak punya catatan kaki",
// "metricate": "article exclusively uses non-SI units of measurement",
"moreNo citations neededplot": "article needsis additionalmissing referencesa orplot sources for verificationsummary", // TODO
"Non-free": "artikel mungkin mengandung materi yang berhak cipta yang tidak digunakan sebagaimana mestinya",
"more footnotes": "artikel sudah punya referensi, namun hanya punya sedikit catatan kaki",
"new unreviewed articleNotability": "tandaisubjek artikel untuktidak diperiksamemenuhi nantikelayakan",
"Not English": "article is written in a language other than English and needs translation",
"news release": "gaya artikel mirip seperti berita",
"noOne footnotessource": "artikel punyahanya referensi,merujuk namunpada tidaksebuah punyasumber catatan kakisaja",
"Original research": "artikel memiliki penggunaan riset asli klaim yang tidak terperiksa",
"no plot": "article is missing a plot summary",
"Orphan": "artikel tidak memiliki hubungan dengan artikel lain",
"non-free": "artikel mungkin mengandung materi yang berhak cipta yang tidak digunakan sebagaimana mestinya",
"Over-coverage": "artikel mengandung anggapan atau cakupan tidak sesuai terhadap satu bagian atau lebih",
"notability": "subjek artikel tidak memenuhi kelayakan",
"Overlinked": "artikel banyak mengandung pranala duplikat dan/atau tidak berhubungan",
// "not English": "article is written in a language other than English and needs translation",
"notOverly Indonesiandetailed": "artikel tidakmengandung ditulisjumlah dalamdetail bahasayang Indonesiaterlalu dan perlu diterjemahkanbanyak",
"Over-quotation": "article contains too many or too-lengthy quotations for an encyclopedic entry",
"one source": "artikel hanya merujuk pada sebuah sumber saja",
"Peacock": "artikel mengandung istilah hiperbola yang mempromosikan subjek tanpa informasi lengkap",
"original research": "artikel memiliki penggunaan riset asli klaim yang tidak terperiksa",
"orphan": "artikel tidak memiliki hubungan dengan artikel lain",
"over-coverage": "artikel mengandung anggapan atau cakupan tidak sesuai terhadap satu bagian atau lebih",
"over-quotation": "article contains too many or too-lengthy quotations for an encyclopedic entry",
"overlinked": "artikel banyak mengandung pranala duplikat dan/atau tidak berhubungan",
"overly detailed": "artikel mengandung jumlah detail yang terlalu banyak",
"peacock": "artikel mengandung istilah hiperbola yang mempromosikan subjek tanpa informasi lengkap",
"POV": "sudut pandang penulisan artikel tidak netral",
"primaryPrimary sources": "artikel terlalu mengandalkan sumber primer, dan butuh sumber tambahan",
"proseProse": "artikel mengandung format yang lebih sesuai ditulis dalam bentuk prosa",
"recentismRecentism": "artikel ini terlalu condong dengan peristiwa terkini",
"refimproveRough translation": "artikel perlusangat jelek sumberpenerjemahannya tambahandan untukmemerlukan diperiksaperbaikan",
"rough translationSections": "artikel sangat jelek penerjemahannyaperlu dandibagi memerlukandalam perbaikansubbagian",
"Self-published": "artikel mengandung sumber yang mungkin tak sesuai untuk sumber yang diterbitkan oleh diri sendiri",
"sections": "artikel perlu dibagi dalam subbagian",
"self-publishedTechnical": "artikel mengandung sumberbanyak yang mungkin tak sesuai untuk sumberistilah yang diterbitkan oleh diri sendirirumit",
"technicalThird-party": "artikel mengandungterlalu banyakmengandalkan istilahsumber yangkedua, rumitdan butuh sumber ketiga",
"tenseTone": "artikelgaya ditulis dalam gayapenulisan tidaktak sesuai",
"third-partyToo few opinions": "artikel terlalu mengandalkantidak sumbermengandung kedua,keseluruhan dansudut butuhpandang sumberyang ketigapenting",
"toneUncategorized": "gayaartikel penulisantidak takada sesuaikategori",
"tooUnder few opinionsconstruction": "artikel tidak mengandung keseluruhan sudutsedang pandangdalam yangtahap pentingpengembangan",
"Underlinked": "artikel perlu lebih banyak pranala wiki",
"tugas sekolah": "artikel yang sedang digunakan untuk penilaian di sekolah/universitas",
"Undue weight": "article lends undue weight to certain ideas, incidents, or controversies",
"uncategorized": "artikel tidak ada kategori",
"Unfocused": "artikel kurang memfokuskan subjek atau punya topik yang lebih dari satu",
"under construction": "artikel sedang dalam tahap pengembangan",
"underlinkedUnreferenced": "artikel perlutidak lebihpunya banyakreferensi pranalasama wikisekali",
"Unreliable sources": "sumber artikel mungkin tidak dapat dipercaya",
// "undue weight": "article lends undue weight to certain ideas, incidents, or controversies",
"Undisclosed paid": "article may have been created or edited in return for undisclosed payments",
"unfocused": "artikel kurang memfokuskan subjek atau punya topik yang lebih dari satu",
"unreferencedUpdate": "artikel tidakmemerlukan punyainformasi referensiyang samalebih sekaliaktual",
"unreliableVery sourceslong": "sumber artikel mungkin tidak dapatsangaaaat dipercayapanjang",
"Weasel": "kenetralan artikel diganggu oleh penggunaan kata bersayap",
"undisclosed paid": "article may have been created or edited in return for undisclosed payments",
"updateDead end": "artikel memerlukantidak informasipunya yanghubungan lebihdengan artikel aktuallain",
"Linkrot": "sumber referensi artikel sudah mati, dan penulisannya harus diperbaiki",
"very long": "artikel sangaaaat panjang",
"New unreviewed article": "tandai artikel untuk diperiksa nanti",
"weasel": "kenetralan artikel diganggu oleh penggunaan kata bersayap"
"News release": "gaya artikel mirip seperti berita",
"Not Indonesian": "artikel tidak ditulis dalam bahasa Indonesia dan perlu diterjemahkan",
"Refimprove": "artikel perlu sumber tambahan untuk diperiksa",
"Tense": "artikel ditulis dalam gaya tidak sesuai",
"Tugas sekolah": "artikel yang sedang digunakan untuk penilaian di sekolah/universitas"
};
 
Baris 598 ⟶ 699:
"Tag rapikan dan pemeliharaan": {
"Perapian secara umum": [
"cleanupCleanup", // has a subgroup with text input
"cleanupCleanup rewrite",
"copyCopy edit" // has a subgroup with text input
],
"Mengandung konten yang tidak diinginkan": [
"closeClose paraphrasing",
"copypasteCopypaste", // has a subgroup with text input
"externalExternal links",
"nonNon-free"
],
"Struktur, format, dan pengantar": [
"cleanupCleanup reorganize",
"condenseCondense",
"leadLead missing",
"leadLead rewrite",
"leadLead too long",
"leadLead too short",
"sectionsSections",
"veryVery long"
],
"Perapian terkait isi fiksi": [
"allAll plot",
"fictionFiction",
"inIn-universe",
"longLong plot",
"noNo plot"
]
},
"Masalah konten secara umum": {
"Kepentingan dan kelayakan": [
"notabilityNotability" // has a subgroup with subcategories
],
"Gaya penulisan": [
"advertAdvert",
"essay-likeCleanup tense",
"fanpovEssay-like",
"like resumeFanpov",
"manualLike resume",
"news releaseManual",
"overCleanup-quotationPR",
"proseOver-quotation",
"technicalProse",
"tenseTechnical",
"toneTone"
],
"Makna": [
"confusingConfusing",
"incomprehensibleIncomprehensible",
"unfocusedUnfocused"
],
"Detail dan informasi": [
"contextContext",
"expertExpert needed",
"overlyOverly detailed",
"undueUndue weight"
],
"Keaktualan": [
"currentCurrent",
"updateUpdate"
],
"Netralitas, kecondongan dan akurasi faktual": [
"autobiographyAutobiography",
"COI",
"disputedDisputed",
"hoaxHoax",
"globalizeGlobalize", // has a subgroup with subcategories
"overOver-coverage",
"peacockPeacock",
"POV",
"recentismRecentism",
"tooToo few opinions",
"undisclosedUndisclosed paid",
"weaselWeasel"
],
"Pemeriksaan dan sumber": [
"BLP sources",
"BLP unsourced",
"moreMore citations needed",
"oneOne source",
"originalOriginal research",
"primaryPrimary sources",
"selfSelf-published",
"thirdThird-party",
"unreferencedUnreferenced",
"unreliableUnreliable sources"
]
},
"Masalah konten tertentu": {
"Bahasa": [
"notNot Indonesian", // has a subgroup with several options
"roughRough translation", // has a subgroup with several options
"expandExpand language"
],
"Pranala dan tautan": [
"orphanOrphan",
"overlinkedOverlinked",
"underlinkedUnderlinked"
],
"Teknik pemberian referensi": [
"citationCitation style",
"linkrotCleanup bare URLs",
"moreMore footnotes",
"noNo footnotes"
],
"Kategori": [
"improveImprove categories",
"uncategorizedUncategorized"
]
},
"Penggabungan": [
"History merge",
"Merge", // these three have a subgroup with several options
"historyMerge mergefrom",
"mergeMerge fromto",
"merge to"
],
"Informasi halaman": [
"GOCEinuse",
"inIn use",
"tugasTugas sekolah",
"underUnder construction"
]
};
 
// Contains those article tags that *do not* work inside {{multiple issues}}.
Twinkle.tag.multipleIssuesExceptions = [
'Copypaste',
'Expand language',
'GOCEinuse',
'History merge',
'Improve categories',
'In use',
'Merge',
'Merge from',
'Merge to',
'Not English',
'Rough translation',
'Uncategorized',
'Under construction'
];
 
// Tags for REDIRECTS start here
Baris 1.019 ⟶ 1.138:
{ label: '{{Vector version available}}', value: 'Vector version available' }
];
Twinkle.tag.file.replacementList.forEach(function (el) {
el.subgroup = {
type: 'input',
Baris 1.027 ⟶ 1.146:
}
});
 
 
// Contains those article tags that *do not* work inside {{multiple issues}}.
Twinkle.tag.multipleIssuesExceptions = [
'copypaste',
'expand language',
'GOCEinuse',
'history merge',
'improve categories',
'in use',
'merge',
'merge from',
'merge to',
'not Indonesian',
// 'not English',
'rough translation',
'uncategorized',
'under construction'
];
 
 
Twinkle.tag.callbacks = {
mainarticle: function articleCallback( pageobj ) {
var params = pageobj.getCallbackParameters(),
tagRe, tagText = '', summaryText = 'Added',
tags = [], groupableTags = [], i, totalTags;
 
// Remove tags that become superfluous with this action
var pageText = pageobj.getPageText().replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
var summaryText;
var params = pageobj.getCallbackParameters();
 
/**
* Saves the page following the removal of tags if any. The last step.
* Called from removeTags()
*/
var postRemoval = function() {
 
if (params.tagsToRemove.length) {
// Finish summary text
summaryText += ' tag' + ( params.tagsToRemove.length > 1 ? 's' : '') + ' from article';
 
// Remove empty {{multiple issues}} if found
pageText = pageText.replace(/\{\{(multiple ?issues|article ?issues|mi)\s*\|\s*\}\}\n?/im, '');
// Remove single-element {{multiple issues}} if found
pageText = pageText.replace(/\{\{(?:multiple ?issues|article ?issues|mi)\s*\|\s*(\{\{[^}]+\}\})\s*\}\}/im, '$1');
}
 
// avoid truncated summaries
if (summaryText.length > (254 - Twinkle.getPref('summaryAd').length)) {
summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, "$1");
}
 
pageobj.setPageText(pageText);
pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
pageobj.setWatchlist(Twinkle.getFriendlyPref('watchTaggedPages'));
pageobj.setMinorEdit(Twinkle.getFriendlyPref('markTaggedPagesAsMinor'));
pageobj.setCreateOption('nocreate');
pageobj.save(function() {
// special functions for merge tags
if (params.mergeReason) {
// post the rationale on the talk page (only operates in main namespace)
var talkpageText = "\n\n== Proposed merge with [[" + params.nonDiscussArticle + "]] ==\n\n";
talkpageText += params.mergeReason.trim() + " ~~~~";
 
var talkpage = new Morebits.wiki.page("Talk:" + params.discussArticle, "Posting rationale on talk page");
talkpage.setAppendText(talkpageText);
talkpage.setEditSummary('Proposing to merge [[:' + params.nonDiscussArticle + ']] ' +
(params.mergeTag === 'Merge' ? 'with' : 'into') + ' [[:' + params.discussArticle + ']]' +
Twinkle.getPref('summaryAd'));
talkpage.setWatchlist(Twinkle.getFriendlyPref('watchMergeDiscussions'));
talkpage.setCreateOption('recreate');
talkpage.append();
}
if (params.mergeTagOther) {
// tag the target page if requested
var otherTagName = "Merge";
if (params.mergeTag === 'Merge from') {
otherTagName = "Merge to";
} else if (params.mergeTag === 'Merge to') {
otherTagName = "Merge from";
}
var newParams = {
tags: [otherTagName],
tagsToRemove: [],
tagsToRemain: [],
mergeTarget: Morebits.pageNameNorm,
discussArticle: params.discussArticle,
talkDiscussionTitle: params.talkDiscussionTitle
};
var otherpage = new Morebits.wiki.page(params.mergeTarget, "Tagging other page (" +
params.mergeTarget + ")");
otherpage.setCallbackParameters(newParams);
otherpage.load(Twinkle.tag.callbacks.article);
}
 
// post at WP:PNT for {{not English}} and {{rough translation}} tag
if (params.translationPostAtPNT) {
var pntPage = new Morebits.wiki.page('Wikipedia:Pages needing translation into English',
"Listing article at Wikipedia:Pages needing translation into English");
pntPage.setFollowRedirect(true);
pntPage.setCallbackParameters({
template: params.tags.indexOf('Rough translation') !== -1 ? "duflu" : "needtrans",
lang: params.translationLanguage,
reason: params.translationComments
});
pntPage.load(function friendlytagCallbacksTranslationListPage(pageobj) {
var old_text = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
var statelem = pageobj.getStatusElement();
 
var templateText = "{{subst:" + params.template + "|pg=" + Morebits.pageNameNorm + "|Language=" +
(params.lang || "uncertain") + "|Comments=" + params.reason.trim() + "}} ~~~~";
 
var text, summary;
if (params.template === "duflu") {
text = old_text + "\n\n" + templateText;
summary = "Translation cleanup requested on ";
} else {
text = old_text.replace(/\n+(==\s?Translated pages that could still use some cleanup\s?==)/,
"\n\n" + templateText + "\n\n$1");
summary = "Translation" + (params.lang ? (" from " + params.lang) : "") + " requested on ";
}
 
if (text === old_text) {
statelem.error('failed to find target spot for the discussion');
return;
}
pageobj.setPageText(text);
pageobj.setEditSummary(summary + " [[:" + Morebits.pageNameNorm + "]]" + Twinkle.getPref('summaryAd'));
pageobj.setCreateOption('recreate');
pageobj.save();
});
}
if (params.translationNotify) {
pageobj.lookupCreator(function(innerPageobj) {
var initialContrib = innerPageobj.getCreator();
 
// Disallow warning yourself
if (initialContrib === mw.config.get('wgUserName')) {
innerPageobj.getStatusElement().warn("You (" + initialContrib + ") created this page; skipping user notification");
return;
}
 
var userTalkPage = new Morebits.wiki.page('User talk:' + initialContrib,
'Notifying initial contributor (' + initialContrib + ')');
var notifytext = "\n\n== Your article [[" + Morebits.pageNameNorm + "]]==\n" +
"{{subst:uw-notenglish|1=" + Morebits.pageNameNorm +
(params.translationPostAtPNT ? "" : "|nopnt=yes") + "}} ~~~~";
userTalkPage.setAppendText(notifytext);
userTalkPage.setEditSummary("Notice: Please use English when contributing to the English Wikipedia." +
Twinkle.getPref('summaryAd'));
userTalkPage.setCreateOption('recreate');
userTalkPage.setFollowRedirect(true);
userTalkPage.append();
});
}
});
 
if( params.patrol ) {
pageobj.patrol();
}
};
 
/**
* Removes the existing tags that were deselected (if any)
* Calls postRemoval() when done
*/
var removeTags = function removeTags() {
 
if (params.tagsToRemove.length === 0) {
// finish summary text from adding of tags, in this case where there are
// no tags to be removed
summaryText += ' tag' + ( tags.length > 1 ? 's' : '' ) + ' to article';
 
postRemoval();
return;
}
 
Morebits.status.info( 'Info', 'Removing deselected tags that were already present' );
 
if (params.tags.length > 0) {
summaryText += ( tags.length ? (' tag' + ( tags.length > 1 ? 's' : '' )) : '' ) + ', and removed';
} else {
summaryText = 'Removed';
}
 
var getRedirectsFor = [];
 
// Remove the tags from the page text, if found in its proper name,
// otherwise moves it to `getRedirectsFor` array earmarking it for
// later removal
params.tagsToRemove.forEach(function removeTag(tag, tagIndex) {
 
var tag_re = new RegExp('\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]+)?\\}\\}\\n?');
if (tag === 'Globalize') {
// special case to catch occurrences like {{Globalize/UK}}, etc
tag_re = new RegExp('\\{\\{[gG]lobalize/?[^}]*\\}\\}\\n?');
}
 
if(tag_re.test(pageText)) {
pageText = pageText.replace(tag_re,'');
} else {
getRedirectsFor.push('Template:' + tag);
}
 
// Producing summary text for current tag removal
if ( tagIndex > 0 ) {
if( tagIndex === (params.tagsToRemove.length - 1) ) {
summaryText += ' and';
} else if ( tagIndex < (params.tagsToRemove.length - 1) ) {
summaryText += ',';
}
}
summaryText += ' {{[[Template:' + tag + '|' + tag + ']]}}';
});
 
if (! getRedirectsFor.length) {
postRemoval();
return;
}
 
// Remove tags which appear in page text as redirects
var api = new Morebits.wiki.api("Getting template redirects", {
"action": "query",
"prop": "linkshere",
"titles": getRedirectsFor.join('|'),
"redirects": 1, // follow redirect if the class name turns out to be a redirect page
"lhnamespace": "10", // template namespace only
"lhshow": "redirect",
"lhlimit": "max"
}, function removeRedirectTag(apiobj) {
 
$(apiobj.responseXML).find('page').each(function(idx,page) {
var removed = false;
$(page).find('lh').each(function(idx, el) {
var tag = $(el).attr('title').slice(9);
var tag_re = new RegExp('\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]*)?\\}\\}\\n?');
if (tag_re.test(pageText)) {
pageText = pageText.replace(tag_re, '');
removed = true;
return false; // break out of $.each
}
});
if (!removed) {
Morebits.status.warn('Info', 'Failed to find {{' +
$(page).attr('title').slice(9) + '}} on the page... excluding');
}
 
});
 
postRemoval();
 
});
api.post();
 
};
 
if (! params.tags.length) {
removeTags();
return;
}
 
// Executes first: addition of selected tags
summaryText = 'Added';
var tagRe, tagText = '', tags = [], groupableTags = [], groupableExistingTags = [], totalTags;
 
/**
var addTag = function friendlytagAddTag( tagIndex, tagName ) {
* Updates `tagText` with the syntax of `tagName` template with its parameters
* @param {number} tagIndex
* @param {string} tagName
*/
var addTag = function articleAddTag( tagIndex, tagName ) {
var currentTag = "";
if( tagName === 'uncategorizedUncategorized' || tagName === 'improveImprove categories' ) {
pageText += '\n\n{{' + tagName + '|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}';
} else {
if( tagName === 'globalizeGlobalize' ) {
currentTag += '{{' + params.globalize;
} else {
currentTag += ( Twinkle.tag.mode === 'redirect' ? '\n' : '' ) + '{{' + tagName;
}
 
// fill in other parameters, based on the tag
if( tagName === 'notability' && params.notability !== 'none' ) {
currentTag += '|' + params.notability;
}
 
// prompt for other parameters, based on the tag
switch( tagName ) {
case 'cleanupCleanup':
currentTag += '|reason=' + params.cleanup;
break;
case 'closeClose paraphrasing':
currentTag += '|source=' + params.closeParaphrasing;
break;
case 'copyCopy edit':
if (params.copyEdit) {
currentTag += '|for=' + params.copyEdit;
}
break;
case 'copypasteCopypaste':
if (params.copypaste) {
currentTag += '|url=' + params.copypaste;
}
break;
case 'expandExpand language':
currentTag += '|topic=';
currentTag += '|langcode=' + params.expandLanguageLangCode;
Baris 1.097 ⟶ 1.432:
}
break;
case 'expertExpert needed':
if (params.expertNeeded) {
currentTag += '|1=' + params.expertNeeded;
Baris 1.108 ⟶ 1.443:
}
break;
case 'newsNews release':
currentTag += '|1=article';
break;
case 'not IndonesianNotability':
if (params.notability !== 'none' ) {
case 'rough translation':
currentTag += '|' + params.notability;
}
break;
case 'Not Indonesian':
case 'Not English':
case 'Rough translation':
if (params.translationLanguage) {
currentTag += '|1=' + params.translationLanguage;
Baris 1.120 ⟶ 1.461:
}
break;
case 'historyHistory merge':
currentTag += '|originalpage=' + params.histmergeOriginalPage;
if (params.histmergeReason) {
Baris 1.129 ⟶ 1.470:
}
break;
case 'mergeMerge':
case 'mergeMerge to':
case 'mergeMerge from':
if (params.mergeTarget) {
// normalize the merge target for now and later
Baris 1.142 ⟶ 1.483:
if (!params.discussArticle) {
// discussArticle is the article whose talk page will contain the discussion
params.discussArticle = (tagName === "mergeMerge to" ? params.mergeTarget : mw.config.get('wgTitle'));
// nonDiscussArticle is the article which won't have the discussion
params.nonDiscussArticle = (tagName === "mergeMerge to" ? mw.config.get('wgTitle') : params.mergeTarget);
params.talkDiscussionTitle = 'Diusulkan digabung dengan ' + params.nonDiscussArticle;
}
currentTag += '|discuss=Talk:' + params.discussArticle + '#' + params.talkDiscussionTitle;
}
}
break;
case 'R from alternative language':
if(params.altLangFrom) {
currentTag += '|from=' + params.altLangFrom;
}
if(params.altLangTo) {
currentTag += '|to=' + params.altLangTo;
}
break;
Baris 1.163 ⟶ 1.496:
}
 
currentTag += (Twinkle.tag.mode === 'redirect') ? '}}' : '|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}\n';
tagText += currentTag;
}
Baris 1.175 ⟶ 1.508:
}
 
summaryText += ' {{[[:';
if( tagName === 'globalizeGlobalize' ) {
summaryText += "Template:" + params.globalize + '|' + params.globalize;
} else if( tagName.indexOf("|") !== -1 ) {
//if it is a custom tag with a parameter
var slicedTagName = tagName.slice(0,tagName.indexOf("|"));
if( tagName.indexOf(":") !== -1 ) {
summaryText += slicedTagName;
} else {
summaryText += "Template:" + slicedTagName + "|" + slicedTagName;
}
} else if( tagName.indexOf(":") !== -1 ) {
summaryText += tagName;
} else {
// if it is a custom tag with a parameter
summaryText += "Template:" + tagName + "|" + tagName;
if( tagName.indexOf("|") !== -1 ) {
tagName = tagName.slice(0,tagName.indexOf("|"));
}
summaryText += (tagName.indexOf(":") !== -1 ? tagName : ("Template:" + tagName + "|" + tagName));
}
summaryText += ']]}}';
 
};
 
/**
if( Twinkle.tag.mode !== 'redirect' ) {
* Adds the tags which go outside {{multiple issues}}, either because
// Check for preexisting tags and separate tags into groupable and non-groupable arrays
* these tags aren't supported in {{multiple issues}} or because
params.tags.forEach(function(tag) {
* {{multiple issues}} is not being added to the page at all
tagRe = new RegExp ( '\\{\\{' + tag + '(\\||\\}\\})', 'im' );
*/
if( !tagRe.exec( pageText ) ) {
var addUngroupedTags = function() {
if( Twinkle.tag.multipleIssuesExceptions.indexOf(tag) === -1 ) {
totalTags = tags.length;
groupableTags = groupableTags.concat( tag );
$.each(tags, addTag);
} else {
 
tags = tags.concat( tag );
// Smartly insert the new tags after any hatnotes or
}
// afd, csd, or prod templates or hatnotes. Regex is
// extra complicated to allow for templates with
// parameters and to handle whitespace properly.
pageText = pageText.replace(
new RegExp(
// leading whitespace
'^\\s*' +
// capture template(s)
'(?:((?:\\s*' +
// AfD is special, as the tag includes html comments before and after the actual template
'(?:<!--.*AfD.*\\n\\{\\{Article for deletion\\/dated.*\\}\\}\\n<!--.*\\n<!--.*AfD.*(?:\\s*\\n))?|' + // trailing whitespace/newline needed since this subst's a newline
// begin template format
'\\{\\{\\s*(?:' +
// CSD
'db|delete|db-.*?|speedy deletion-.*?|' +
// PROD
'(?:proposed deletion|prod blp)\\/dated\\n(?:\\s+\\|(?:concern|user|timestamp|help).*)+|' +
// various hatnote templates
'about|correct title|dablink|distinguish|for|other\\s?(?:hurricaneuses|people|persons|places|uses(?:of)?)|redirect(?:-acronym)?|see\\s?(?:also|wiktionary)|selfref|the' +
// not a hatnote, but sometimes under a CSD or AfD
'|salt|proposed deletion endorsed' +
// end main template name, optionally with a number (such as redirect2)
')\\d*\\s*' +
// template parameters
'(\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?' +
// end template format
'\\}\\})+' +
// end capture
'(?:\\s*\\n)?)' +
// trailing whitespace
'\\s*)?',
'i'), "$1" + tagText
);
 
removeTags();
};
 
// Separate tags into groupable ones (`groupableTags`) and non-groupable ones (`tags`)
params.tags.forEach(function(tag) {
tagRe = new RegExp( '\\{\\{' + tag + '(\\||\\}\\})', 'im' );
// regex check for preexistence of tag can be skipped if in canRemove mode
if( Twinkle.tag.canRemove || !tagRe.exec( pageText ) ) {
// condition Twinkle.tag.article.tags[tag] to ensure that its not a custom tag
// Custom tags are assumed non-groupable, since we don't know whether MI template supports them
if( Twinkle.tag.article.tags[tag] && Twinkle.tag.multipleIssuesExceptions.indexOf(tag) === -1 ) {
groupableTags.push( tag );
} else {
tags.push( tag );
// Allow multiple {{merge from}} and {{histmerge}} per page
}
if(tag === 'merge from' || tag === 'history merge') {
} else {
tags = tags.concat( tag );
if (tag === 'Merge from' || tag === 'History merge') {
} else {
tags.push( tag );
Morebits.status.warn( 'Informasi', 'Ditemukan tag {{' + tag +
} else {
'}} di artikel tersebut... membatalkan...' );
Morebits.status.warn( 'Info', 'Ditemukan tag {{' + tag +
// don't do anything else with merge tags
'}} di artikel tersebut... membatalkan' );
if ( ['merge', 'merge to'].indexOf(tag) !== -1 ) {
// don't do anything else with merge tags
params.mergeTarget = params.mergeReason = params.mergeTagOther = null;
if ( ['Merge', 'Merge to'].indexOf(tag) !== -1 ) {
}
params.mergeTarget = params.mergeReason = params.mergeTagOther = null;
}
}
});
});
 
// To-be-retained existing tags that are groupable
var miTest = /\{\{(multiple ?issues|article ?issues|mi)(?!\s*\|\s*section\s*=)[^}]+\{/im.exec(pageText);
params.tagsToRemain.forEach( function(tag) {
if (Twinkle.tag.multipleIssuesExceptions.indexOf(tag) === -1) {
groupableExistingTags.push(tag);
}
});
 
var miTest = /\{\{(multiple ?issues|article ?issues|mi)(?!\s*\|\s*section\s*=)[^}]+\{/im.exec(pageText);
if( miTest && groupableTags.length > 0 ) {
Morebits.status.info( 'Informasi', 'Menambah tag yang lain ke dalam tag {{multiple issues}}' );
 
if( miTest && groupableTags.sort(length > 0 ); {
Morebits.status.info( 'Info', 'Menambah tag yang lain ke dalam tag {{multiple issues}}' );
tagText = "";
 
tagText = "";
totalTags = groupableTags.length;
$.each(groupableTags, addTag);
 
summaryTexttotalTags += ' tag' + ( groupableTags.length > 1 ? 's' : '' ) + ' (within {{[[Template:multiple issues|multiple issues]]}})';
$.each(groupableTags, addTag);
if( tags.length > 0 ) {
summaryText += ', dan';
}
 
summaryText += ' tag' + ( groupableTags.length > 1 ? 's' : '' ) + ' (dalam {{[[Template:multiple issues|multiple issues]]}})';
var miRegex = new RegExp("(\\{\\{\\s*" + miTest[1] + "\\s*(?:\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?)\\}\\}\\s*", "im");
if( tags.length > 0 ) {
pageText = pageText.replace(miRegex, "$1" + tagText + "}}\n");
tagTextsummaryText += ""', dan';
}
 
var miRegex = new RegExp("(\\{\\{\\s*" + miTest[1] + "\\s*(?:\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?)\\}\\}\\s*", "im");
} else if( params.group && groupableTags.length >= 2 ) {
pageText = pageText.replace(miRegex, "$1" + tagText + "}}\n");
Morebits.status.info( 'Informasi', 'Mengelompokkan tag yang didukung ke dalam {{multiple issues}}' );
tagText = "";
 
groupableTags.sortaddUngroupedTags();
tagText += '{{multiple issues|\n';
 
} else if( params.group && !miTest && (groupableExistingTags.length + groupableTags.length) >= 2 ) {
Morebits.status.info( 'Info', 'Mengelompokkan tag yang didukung ke dalam {{multiple issues}}' );
 
tagText += '{{Multiple issues|\n';
 
/**
* Adds newly added tags to MI
*/
var addNewTagsToMI = function() {
totalTags = groupableTags.length;
$.each(groupableTags, addTag);
if (groupableTags.length) {
 
summaryText += ' tagtags (dalam {{[[Template:multiple issues|multiple issues]]}})';
} else {
summaryText += ' {{[[Template:multiple issues|multiple issues]]}}';
}
if( tags.length > 0 ) {
summaryText += ', dan';
}
tagText += '}}\n';
 
} else {
addUngroupedTags();
tags = tags.concat( groupableTags );
};
 
} else {
 
// Redirect tagging: Check for pre-existing tags
var getRedirectsFor = [];
for( i = 0; i < params.tags.length; i++ ) {
 
tagRe = new RegExp( '(\\{\\{' + params.tags[i] + '(\\||\\}\\}))', 'im' );
// Reposition the tags on the page into {{multiple issues}}, if found with its
if( !tagRe.exec( pageText ) ) {
// proper name, else moves it to `getRedirectsFor` array to be handled later
tags = tags.concat( params.tags[i] );
groupableExistingTags.forEach(function repositionTagIntoMI(tag) {
var tag_re = new RegExp('(\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]+)?\\}\\}\\n?)');
if (tag_re.test(pageText)) {
tagText += tag_re.exec(pageText)[1];
pageText = pageText.replace(tag_re, '');
} else {
getRedirectsFor.push('Template:' + tag);
Morebits.status.warn( 'Informasi', 'Ditemukan {{' + params.tags[i] +
'}} dalam pengalihan... mengabaikan...' );
}
});
 
if(! getRedirectsFor.length) {
addNewTagsToMI();
return;
}
 
var api = new Morebits.wiki.api("Getting template redirects", {
"action": "query",
"prop": "linkshere",
"titles": getRedirectsFor.join('|'),
"redirects": 1,
"lhnamespace": "10", // template namespace only
"lhshow": "redirect",
"lhlimit": "max"
}, function replaceRedirectTag(apiobj) {
$(apiobj.responseXML).find('page').each(function(idx, page) {
var found = false;
$(page).find('lh').each(function(idx, el) {
var tag = $(el).attr('title').slice(9);
var tag_re = new RegExp('(\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]*)?\\}\\}\\n?)');
if(tag_re.test(pageText)) {
tagText += tag_re.exec(pageText)[1];
pageText = pageText.replace(tag_re, '');
found = true;
return false; // break out of $.each
}
});
if (!found) {
Morebits.status.warn('Info', 'Failed to find the existing {{' +
$(page).attr('title').slice(9) + '}} on the page... skip repositioning');
}
});
addNewTagsToMI();
});
api.post();
 
} else {
tags = tags.concat( groupableTags );
addUngroupedTags();
}
 
},
tags.sort();
totalTags = tags.length;
$.each(tags, addTag);
 
if( redirect: Twinkle.tag.modefunction === 'redirect' (pageobj) {
var params = pageobj.getCallbackParameters(),
// Check for all Rcat shell redirects (from #433)
pageText = pageobj.getPageText(),
if (pageText.match(/{{(?:redr|this is a redirect|r(?:edirect)?(?:.?cat.*)?[ _]?sh)/i)) {
tagRe, tagText = '', summaryText = 'Added',
// Regex courtesy [[User:Kephir/gadgets/sagittarius.js]] at [[Special:PermaLink/831402893]]
tags = [], i;
var oldTags = pageText.match(/(\s*{{[A-Za-z ]+\|)((?:[^|{}]*|{{[^|}]*}})+)(}})\s*/i);
 
pageText = pageText.replace(oldTags[0], oldTags[1]+tagText+oldTags[2]+oldTags[3]);
for( i = 0; i < params.tags.length; i++ ) {
tagRe = new RegExp( '(\\{\\{' + params.tags[i] + '(\\||\\}\\}))', 'im' );
if( !tagRe.exec( pageText ) ) {
tags.push( params.tags[i] );
} else {
Morebits.status.warn( 'Info', 'Found {{' + params.tags[i] +
// Fold any pre-existing Rcats into taglist and under Rcatshell
'}} on the redirect already...excluding' );
var pageTags = pageText.match(/\n{{R(?:edirect)? .*?}}/img);
}
var oldPageTags ='';
}
if (pageTags) {
 
pageTags.forEach(function(pageTag) {
var pageReaddTag = newfunction RegExpredirectAddTag(pageTag tagIndex, 'img'tagName ); {
tagText += "\n{{" + tagName;
pageText = pageText.replace(pageRe,'');
if (tagName === 'R from alternative language') {
oldPageTags = oldPageTags.concat(pageTag);
if(params.altLangFrom) {
});
tagText += '|from=' + params.altLangFrom;
}
if(params.altLangTo) {
tagText += '|to=' + params.altLangTo;
}
pageText += '\n{{Redirect category shell|' + tagText + oldPageTags + '\n}}';
}
tagText += '}}';
 
if ( tagIndex > 0 ) {
if( tagIndex === (tags.length - 1) ) {
summaryText += ' and';
} else if ( tagIndex < (tags.length - 1) ) {
summaryText += ',';
}
}
 
summaryText += ' {{[[:' + (tagName.indexOf(":") !== -1 ? tagName : ("Template:" + tagName + "|" + tagName)) + ']]}}';
};
 
tags.sort();
$.each(tags, addTag);
 
// Check for all Rcat shell redirects (from #433)
if (pageText.match(/{{(?:redr|this is a redirect|r(?:edirect)?(?:.?cat.*)?[ _]?sh)/i)) {
// Regex courtesy [[User:Kephir/gadgets/sagittarius.js]] at [[Special:PermaLink/831402893]]
var oldTags = pageText.match(/(\s*{{[A-Za-z ]+\|)((?:[^|{}]*|{{[^|}]*}})+)(}})\s*/i);
pageText = pageText.replace(oldTags[0], oldTags[1] + tagText + oldTags[2] + oldTags[3]);
} else {
// Fold any pre-existing Rcats into taglist and under Rcatshell
// Smartly insert the new tags after any csd or prod templates
var pageTags = pageText.match(/\n{{R(?:edirect)? .*?}}/img);
// or hatnotes; afd not yet supported since it places a comment
var oldPageTags ='';
// not a template first. Regex is more complicated than it needs to be,
if (pageTags) {
// which allows templates as parameters and to handle whitespace properly.
pageTags.forEach(function(pageTag) {
pageText = pageText.replace(/^\s*(?:((?:\s*\{\{\s*(?:db|delete|db-.*?|speedy deletion-.*?|(?:proposed deletion|prod blp)\/dated|about|correct title|dablink|distinguish|for|other\s?(?:hurricaneuses|people|persons|places|uses(?:of)?)|redirect(?:-acronym)?|see\s?(?:also|wiktionary)|selfref|the)\d*\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\})+(?:\s*\n)?)\s*)?/i,
var pageRe = new RegExp(pageTag, 'img');
"$1" + tagText);
pageText = pageText.replace(pageRe,'');
oldPageTags += pageTag;
});
}
pageText += '\n{{Redirect category shell|' + tagText + oldPageTags + '\n}}';
}
 
summaryText += ( tags.length > 0 ? ' tag' + ( tags.length > 1 ? 's' : '' ) : '' ) +
summaryText += ( tags.length > 0 ? ' tag' + ( tags.length > 1 ? 's' : '' ) : '' ) + ' to redirect';
' to ' + Twinkle.tag.mode;
 
// avoid truncated summaries
Baris 1.313 ⟶ 1.777:
pageobj.setMinorEdit(Twinkle.getFriendlyPref('markTaggedPagesAsMinor'));
pageobj.setCreateOption('nocreate');
pageobj.save(function() {;
// special functions for merge tags
if (params.mergeReason) {
// post the rationale on the talk page (only operates in main namespace)
var talkpageText = "\n\n== Usulan penggabungan dengan [[" + params.nonDiscussArticle + "]] ==\n\n";
talkpageText += params.mergeReason.trim() + " ~~~~";
 
var talkpage = new Morebits.wiki.page("Talk:" + params.discussArticle, "Mengirimkan alasan ke halaman pembicaraan");
talkpage.setAppendText(talkpageText);
talkpage.setEditSummary('Usulkan penggabungan [[:' + params.nonDiscussArticle + ']] ' +
(tags.indexOf("merge") !== -1 ? 'with' : 'dengan') + ' [[' + params.discussArticle + ']]' +
Twinkle.getPref('summaryAd'));
talkpage.setWatchlist(Twinkle.getFriendlyPref('watchMergeDiscussions'));
talkpage.setCreateOption('recreate');
talkpage.append();
}
if (params.mergeTagOther) {
// tag the target page if requested
var otherTagName = "merge";
if (tags.indexOf("merge from") !== -1) {
otherTagName = "merge to";
} else if (tags.indexOf("merge to") !== -1) {
otherTagName = "merge from";
}
var newParams = {
tags: [otherTagName],
mergeTarget: Morebits.pageNameNorm,
discussArticle: params.discussArticle,
talkDiscussionTitle: params.talkDiscussionTitle
};
var otherpage = new Morebits.wiki.page(params.mergeTarget, "Menandai halaman lain (" +
params.mergeTarget + ")");
otherpage.setCallbackParameters(newParams);
otherpage.load(Twinkle.tag.callbacks.main);
}
 
// post at WP:PNT for {{not English}} and {{rough translation}} tag
if (params.translationPostAtPNT) {
var pntPage = new Morebits.wiki.page('Wikipedia:Pages needing translation into English',
"Listing article at Wikipedia:Pages needing translation into English");
pntPage.setFollowRedirect(true);
pntPage.setCallbackParameters({
template: params.tags.indexOf("rough translation") !== -1 ? "duflu" : "needtrans",
lang: params.translationLanguage,
reason: params.translationComments
});
pntPage.load(Twinkle.tag.callbacks.translationListPage);
}
if (params.translationNotify) {
pageobj.lookupCreator(function(innerPageobj) {
var initialContrib = innerPageobj.getCreator();
 
// Disallow warning yourself
if (initialContrib === mw.config.get('wgUserName')) {
innerPageobj.getStatusElement().warn("Anda (" + initialContrib + ") yang membuat halaman ini; lewati pemberitahuan pengguna");
return;
}
 
var userTalkPage = new Morebits.wiki.page('User talk:' + initialContrib,
'Notifying initial contributor (' + initialContrib + ')');
var notifytext = "\n\n== Artikel Anda [[" + Morebits.pageNameNorm + "]]==\n" +
"{{subst:uw-notenglish|1=" + Morebits.pageNameNorm +
(params.translationPostAtPNT ? "" : "|nopnt=yes") + "}} ~~~~";
userTalkPage.setAppendText(notifytext);
userTalkPage.setEditSummary("Pemberitahuan: Gunakan bahasa Inggris ketika menulis di Wikipedia bahasa Indonesia." +
Twinkle.getPref('summaryAd'));
userTalkPage.setCreateOption('recreate');
userTalkPage.setFollowRedirect(true);
userTalkPage.append();
});
}
});
 
if( params.patrol ) {
pageobj.patrol();
}
},
 
translationListPage: function friendlytagCallbacksTranslationListPage(pageobj) {
var old_text = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
var statelem = pageobj.getStatusElement();
 
var templateText = "{{subst:" + params.template + "|pg=" + Morebits.pageNameNorm + "|Language=" +
(params.lang || "uncertain") + "|Comments=" + params.reason.trim() + "}} ~~~~";
 
var text, summary;
if (params.template === "duflu") {
text = old_text + "\n\n" + templateText;
summary = "Perapian terjemahan telah diminta di ";
} else {
text = old_text.replace(/\n+(==\s?Translated pages that could still use some cleanup\s?==)/,
"\n\n" + templateText + "\n\n$1");
summary = "Penerjemahan" + (params.lang ? (" dari " + params.lang) : "") + " telah diminta di ";
}
 
if (text === old_text) {
statelem.error('gagal menemukan tujuan untuk berdiskusi');
return;
}
pageobj.setPageText(text);
pageobj.setEditSummary(summary + " [[:" + Morebits.pageNameNorm + "]]" + Twinkle.getPref('summaryAd'));
pageobj.setCreateOption('recreate');
pageobj.save();
},
 
Baris 1.529 ⟶ 1.895:
 
var name_prefix = Twinkle.tag.mode + 'Tags.';
$(form).find("[name^='" + name_prefix + "']:not(div)").each(function(idx,el) {
// el are the HTMLInputElements, el.name gives the name attribute
params[el.name.slice(name_prefix.length)] =
Baris 1.537 ⟶ 1.903:
switch (Twinkle.tag.mode) {
case 'article':
params.tagsToRemove = form.getUnchecked('alreadyPresentArticleTags') || [];
params.tagsToRemain = form.getChecked('alreadyPresentArticleTags') || [];
 
params.group = form.group.checked;
 
// Validation
if ((params.tags.indexOf("merge") !== -1) || (params.tags.indexOf("merge from") !== -1) || (params.tags.indexOf("merge to") !== -1)) {
if( ( (params.tags.indexOf("mergeMerge") !== -1) +|| (params.tags.indexOf("mergeMerge from") !== -1) +||
(params.tags.indexOf("mergeMerge to") !== -1)) > 1 ) {
if( ((params.tags.indexOf("Merge") !== -1) + (params.tags.indexOf("Merge from") !== -1) +
(params.tags.indexOf("Merge to") !== -1)) > 1 ) {
alert( 'Please select only one of {{merge}}, {{merge from}}, and {{merge to}}. If several merges are required, use {{merge}} and separate the article names with pipes (although in this case Twinkle cannot tag the other articles automatically).' );
return;
Baris 1.554 ⟶ 1.925:
}
}
if( (params.tags.indexOf("notNot Indonesian") !== -1) && (params.tags.indexOf("roughRough translation") !== -1) ) {
alert( 'Please select only one of {{not Indonesian}} and {{rough translation}}.' );
return;
}
if( params.tags.indexOf('historyHistory merge') !== -1 && params.histmergeOriginalPage.trim() === '') {
alert( 'You must specify a page to be merged for the {{history merge}} tag.' );
return;
}
if( params.tags.indexOf('cleanupCleanup') !== -1 && params.cleanup.trim() === '') {
alert( 'You must specify a reason for the {{cleanup}} tag.' );
return;
}
if( params.tags.indexOf('expandExpand language') !== -1 && params.expandLanguageLangCode.trim() === '') {
alert('You must specify language code for the {{expand language}} tag.');
return;
Baris 1.609 ⟶ 1.980:
}
 
// File/redirect: return if no tags selected
if( !params.tags.length ) {
// Article: return if no tag is selected and no already present tag is deselected
if( params.tags.length === 0 && (Twinkle.tag.mode !== 'article' || params.tagsToRemove.length === 0)) {
alert( 'Setidaknya Anda harus memiliki satu tag!' );
return;
Baris 1.625 ⟶ 1.998:
var wikipedia_page = new Morebits.wiki.page(Morebits.pageNameNorm, "Menandai " + Twinkle.tag.mode);
wikipedia_page.setCallbackParameters(params);
switch wikipedia_page.load(Twinkle.tag.callbacks[Twinkle.tag.mode]) {;
 
case 'article':
/* falls through */
case 'redirect':
wikipedia_page.load(Twinkle.tag.callbacks.main);
return;
case 'file':
wikipedia_page.load(Twinkle.tag.callbacks.file);
return;
default:
alert("Twinkle.tag: moda tak dikenal " + Twinkle.tag.mode);
break;
}
};
 
})(jQuery);
 
 
//</nowiki>