利用者:Syunsyunminmin/script/XfD-handler.js
表示
< 利用者:Syunsyunminmin | script
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ Cmd と ⇧ Shift を押しながら R を押す。
詳細についてはWikipedia:キャッシュを消すをご覧ください。
//<nowiki>
$(function(){mw.config.get("wgPageName").startsWith("Wikipedia:削除依頼/")&&!mw.config.get("wgPageName").startsWith("Wikipedia:削除依頼/ログ")&&mw.loader.using(["mediawiki.util","mediawiki.Title","@wikimedia/codex"],function(t){function e(){var t=v.votemenu.concat();t.unshift({value:"コメント"},{value:"保留"});const e=document.body.appendChild(document.createElement("div"));m.createMwApp({data:function(){return{showDialog:!1,defaultAction:{label:"閉じる"},primaryAction:{label:"実行",actionType:"progressive"},voteValue:"コメント",votemenuItems:t,commentValue:"",previewValue:""}},template:'\n\t\t\t\t<cdx-dialog v-model:open="showDialog"\n\t\t\t\t\ttitle="投票ダイアログ"\n\t\t\t\t\tclose-button-label="閉じる"\n\t\t\t\t\t:default-action="defaultAction"\n\t\t\t\t\t:primary-action="primaryAction"\n\t\t\t\t\t@default="showDialog = false"\n\t\t\t\t\t@primary="onPrimaryAction"\n\t\t\t\t>\n\t\t\t\t\t<cdx-label\n\t\t\t\t\t\tinput-id="xfdh-v-v"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t票またはコメント\n\t\t\t\t\t\t<template #description><a href="https://ja-two.iwiki.icu/wiki/Template:AFD" target="_blank"><span v-pre>{{AFD}}</span></a>テンプレートに使用されます。既定ではコメントが選択されます。自身の票を選択してください。</template>\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<cdx-select\n\t\t\t\t\t\tv-model:selected="voteValue"\n\t\t\t\t\t\t:menu-items="votemenuItems"\n\t\t\t\t\t\tid="xfdh-v-v"\n\t\t\t\t\t\t@update:selected="changed()"\n\t\t\t\t\t></cdx-select>\n\t\t\t\t\t<br />\n\t\t\t\t\t<cdx-label\n\t\t\t\t\t\tinput-id="xfdh-v-c"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t追加コメント\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<cdx-text-area\n\t\t\t\t\t\tv-model="commentValue"\n\t\t\t\t\t\tid="xfdh-v-c"\n\t\t\t\t\t\t@change="changed()"\n\t\t\t\t\t\tautosize\n\t\t\t\t\t\tplaceholder="コメントがあれば入力してください。"\n\t\t\t\t\t/>\n\t\t\t\t\t<cdx-label\n\t\t\t\t\t\tinput-id="xfdh-v-p"\n\t\t\t\t\t\t>\n\t\t\t\t\t\tプレビュー\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<cdx-text-area\n\t\t\t\t\t\tid="xfdh-v-p"\n\t\t\t\t\t\tv-model="previewValue"\n\t\t\t\t\t\tautosize\n\t\t\t\t\t\treadonly\n\t\t\t\t\t/>\n\t\t\t\t</cdx-dialog>\n\t\t\t',methods:{openDialog(){this.showDialog=!0},onPrimaryAction(){this.showDialog=!1,r("\n* {{AFD|"+this.voteValue+"}} "+this.commentValue+"--~~~~",this.voteValue)},changed(){this.previewValue="* {{AFD|"+this.voteValue+"}} "+this.commentValue+"--~~~~"}},mounted(){document.getElementById("xfdh-action-vote").addEventListener("click",this.openDialog)},unMounted(){document.getElementById("xfdh-action-vote").removeEventListener(this.openDialog)}}).component("cdx-button",h.CdxButton).component("cdx-dialog",h.CdxDialog).component("cdx-select",h.CdxSelect).component("cdx-label",h.CdxLabel).component("cdx-text-area",h.CdxTextArea).mount(e)}function n(){const t=document.body.appendChild(document.createElement("div")),e=o(),n=[],s=[{value:"その他"}];for(const t of v.votemenu)"一部"!==t.value&&s.push(t);for(const t of e)n.push({label:t,value:t});m.createMwApp({data:function(){return{showMainDialog:!1,showPreviewDialog:!1,checkboxes:n,defaultAction:{label:"閉じる"},primaryAction:{label:"実行",actionType:"progressive"},resultValue:"削除",templateValue:"対処",closemenuItems:s,closeCheckedValues:[],closetempItems:v.adminTemp,commentValue:"",previewValue:"",otherResultValue:"",previewContent:"",delnoteCheckedValue:!0,rmtagCheckedValue:!0,closeModeValues:!0,needCheckValue:!1,needCheckInput:!1}},template:`\n\t\t\t\t<cdx-dialog v-model:open="showMainDialog"\n\t\t\t\t\ttitle="対処ダイアログ"\n\t\t\t\t\tclose-button-label="閉じる"\n\t\t\t\t\t:default-action="defaultAction"\n\t\t\t\t\t:primary-action="primaryAction"\n\t\t\t\t\t@default="showMainDialog = false"\n\t\t\t\t\t@primary="onPrimaryAction"\n\t\t\t\t>\n\t\t\t\t\t<cdx-label>\n\t\t\t\t\t\t審議対象のページ\n\t\t\t\t\t\t<template #description>削除依頼の審議対象となったページを選択してください。</template>\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<div style="max-height: 200px; overflow-y: auto;">\n\t\t\t\t\t<cdx-checkbox\n\t\t\t\t\t\tv-model="closeCheckedValues"\n\t\t\t\t\t\tv-for="checkbox in checkboxes"\n\t\t\t\t\t\t:key="'checkbox-' + checkbox.value"\n\t\t\t\t\t\t:input-value="checkbox.value"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ checkbox.label }}\n\t\t\t\t\t</cdx-checkbox>\n\t\t\t\t\t</div>\n\t\t\t\t\t<cdx-label\n\t\t\t\t\t\tinput-id="xfdh-c-v"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t審議結果\n\t\t\t\t\t\t<template #description><span v-pre>{{</span><a href="${mw.util.getUrl("Template:Vfd top")}" target="_blank">Vfd top</a><span v-pre>}}</span>テンプレートおよび<span v-pre>{{</span><a href="${mw.util.getUrl("Template:削除依頼ログ")}" target="_blank">削除依頼ログ</a><span v-pre>}}</span>に使用されます。\n\t\t\t\t\t\tノートページに追加する審議記録の結果が異なる場合、それぞれ別に実行してください。\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<cdx-select\n\t\t\t\t\t\tv-model:selected="resultValue"\n\t\t\t\t\t\t:menu-items="closemenuItems"\n\t\t\t\t\t\tid="xfdh-c-v"\n\t\t\t\t\t></cdx-select>\n\t\t\t\t\t<cdx-text-input v-model="otherResultValue" aria-label="審議結果の詳細" v-if="resultValue == 'その他'" placeholder="Aを削除、Bは存続"></cdx-text-input>\n\t\t\t\t\t<br />\n\t\t\t\t\t<cdx-label>\n\t\t\t\t\t\tモード\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<cdx-checkbox\n\t\t\t\t\t\tv-model="closeModeValues"\n\t\t\t\t\t>\n\t\t\t\t\t\t削除依頼を閉じる\n\t\t\t\t\t</cdx-checkbox>\n\t\t\t\t\t<cdx-field\n\t\t\t\t\t\tv-if="closeModeValues"\n\t\t\t\t\t>\n\t\t\t\t\t<cdx-label\n\t\t\t\t\t\tinput-id="xfdh-c-t"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t対処テンプレート\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<cdx-select\n\t\t\t\t\t\tv-model:selected="templateValue"\n\t\t\t\t\t\t:menu-items="closetempItems"\n\t\t\t\t\t\tid="xfdh-c-t"\n\t\t\t\t\t\t@update:selected="changed()"\n\t\t\t\t\t></cdx-select>\n\t\t\t\t\t<cdx-label\n\t\t\t\t\t\tinput-id="xfdh-c-c"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t追加コメント\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<cdx-text-area\n\t\t\t\t\t\tv-model="commentValue"\n\t\t\t\t\t\tid="xfdh-c-c"\n\t\t\t\t\t\t@change="changed()"\n\t\t\t\t\t\tautosize\n\t\t\t\t\t\tplaceholder="コメントがあれば入力してください。"\n\t\t\t\t\t/>\n\t\t\t\t\t<cdx-label\n\t\t\t\t\t\tinput-id="xfdh-c-p"\n\t\t\t\t\t\t>\n\t\t\t\t\t\tコメントプレビュー\n\t\t\t\t\t</cdx-label>\n\t\t\t\t\t<cdx-text-area\n\t\t\t\t\t\tid="xfdh-c-p"\n\t\t\t\t\t\tv-model="previewValue"\n\t\t\t\t\t\tautosize\n\t\t\t\t\t\treadonly\n\t\t\t\t\t/>\n\t\t\t\t\t<br />\n\t\t\t\t\t<cdx-checkbox\n\t\t\t\t\t\tv-model="needCheckValue"\n\t\t\t\t\t\t:disabled="needCheckInput"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span v-pre>{{</span><a href="${mw.util.getUrl("Template:確認待ち")}" target="_blank">確認待ち</a><span v-pre>}}</span>を追加する\n\t\t\t\t\t</cdx-checkbox>\n\t\t\t\t\t<cdx-button\n\t\t\t\t\t\t@click="openPreviewDialog"\n\t\t\t\t\t>\n\t\t\t\t\t\t全体プレビュー\n\t\t\t\t\t</cdx-button>\n\t\t\t\t\t</cdx-field>\n\t\t\t\t\t<br />\n\t\t\t\t\t<cdx-checkbox\n\t\t\t\t\t\tv-model="delnoteCheckedValue"\n\t\t\t\t\t>\n\t\t\t\t\t\tノートページに<span v-pre>{{</span><a href="${mw.util.getUrl("Template:削除依頼ログ")}" target="_blank">削除依頼ログ</a><span v-pre>}}</span>を追加する\n\t\t\t\t\t</cdx-checkbox>\n\t\t\t\t\t<cdx-checkbox\n\t\t\t\t\t\tv-model="rmtagCheckedValue"\n\t\t\t\t\t>\n\t\t\t\t\t\tページから削除依頼タグを除去する\n\t\t\t\t\t</cdx-checkbox>\n\t\t\t\t</cdx-dialog>\n\n\t\t\t\t<cdx-dialog v-model:open="showPreviewDialog"\n\t\t\t\t\ttitle="プレビュー"\n\t\t\t\t\tclose-button-label="Close"\n\t\t\t\t\t:default-action="defaultAction"\n\t\t\t\t\t@default="closePreviewDialog"\n\t\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-html="previewContent"\n\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t\t</cdx-dialog>\n\t\t\t`,methods:{openDialog(){this.showMainDialog=!0},async openPreviewDialog(){this.showMainDialog=!1;const t=c(this.templateValue,this.commentValue),e=await l(a(this),t,{needCheck:this.needCheckValue});this.previewContent=await i(e),this.showPreviewDialog=!0},closePreviewDialog(){this.showMainDialog=!0,this.showPreviewDialog=!1},async onPrimaryAction(){this.showMainDialog=!1,await d(this)},async changed(){this.previewValue=c(this.templateValue,this.commentValue),"対処"!==this.templateValue?this.needCheckInput=!0:this.needCheckInput=!1}},watch:{},mounted(){document.getElementById("xfdh-action-close").addEventListener("click",this.openDialog)},unMounted(){document.getElementById("xfdh-action-close").removeEventListener(this.openDialog)}}).component("cdx-button",h.CdxButton).component("cdx-dialog",h.CdxDialog).component("cdx-checkbox",h.CdxCheckbox).component("cdx-select",h.CdxSelect).component("cdx-label",h.CdxLabel).component("cdx-text-area",h.CdxTextArea).component("cdx-text-input",h.CdxTextInput).component("cdx-field",h.CdxField).mount(t)}function a(t){var e;return e="その他"===t.resultValue?t.otherResultValue:t.resultValue,e}function o(){const t=[];return $("#mw-content-text a").each(function(){const e=$(this).attr("href"),n=mw.util.getParamValue("action",e);if("history"===n){const n=mw.util.getParamValue("title",e);t.includes(n)||t.push(n)}}),t}async function i(t,e=v.pageName){const n=await v.api.parse(t,{disablelimitreport:1,format:"json",preview:1,pst:1,text:t,title:e});return n}async function l(t,e,{title:n=v.pageName,needCheck:a=!1}={}){const o=/(^===.*===$)/m,i=/<noinclude\s*>\s*\[\[\s*(?:category|カテゴリ)\s*:\s*緊急案件\s*\|\s*(?:\{\{[^}]*\}\}|[^}\]])*\s*\]\]<\/noinclude>\n?/i,l=/\{\{\s*確認待ち\s*(\|[^}]*)?\}\}\n?/,c=await v.api.get({action:"query",format:"json",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"*",titles:n}),s=c.query.pages[0].revisions[0].slots.main.content;var r=s;if(a)r=s.replace(o,"$1\n{{確認待ち}}").replace(i,""),r+="\n"+e;else{var d="{{subst:Vfd top|"+t+"}}";r=s.replace(o,"$1\n"+d).replace(i,"").replace(l,""),r+="\n"+e+"\n{{subst:Vfd bottom}}"}return r}function c(t,e){var n="**";return"確認"===t&&(n+="*"),n+=" {{AFD|"+t+"}} "+e+"--~~~~",n}async function s(t,e,n,{nocreate:a=!1,watchlist:o="watch"}={}){var i={action:"edit",format:"json",formatversion:"2",summary:n+v.summaryAd,text:e,title:t,watchlist:o};a&&(i.nocreate=1);const l=await v.api.postWithToken("csrf",i);return"error"in l?(mw.notify($(`<span><a href="${mw.util.getUrl(t)}" target="_blank">${t}</a> の編集中にエラーが発生しました。<br />エラー内容: ${l.error.info}</span>`),{autoHide:!1,title:"[エラー] "+l.error.code,type:"error"}),"error"):(mw.notify($(`<span><a href="${mw.util.getUrl(t)}" target="_blank">${t}</a> の編集に成功しました。</span>`),{title:t}),"success")}function r(t,e){var n="";n="コメント"===e?"コメント":"投票: "+e,v.api.postWithToken("csrf",{action:"edit",appendtext:t,summary:n+v.summaryAd,nocreate:!0,title:v.pageName,format:"json"}).then(function(){mw.notify("投票に成功しました。")},function(t,e){mw.notify($("<div>"+t+"<br />"+e.error.info+"</div>"),{autoHide:!1,title:"エラー",type:"error"})})}async function d(t){if(0!==t.closeCheckedValues.length||!t.delnoteCheckedValue&&!t.rmtagCheckedValue){for(let e=0;e<t.closeCheckedValues.length;e++){const n=t.closeCheckedValues[e];t.rmtagCheckedValue&&await p(n),t.delnoteCheckedValue&&await u(n,a(t))}if(t.closeModeValues){const n=await l(a(t),c(t.templateValue,t.commentValue),{needCheck:t.needCheckValue});var e="";"対処"===t.templateValue?(e="対処",t.needCheckValue?e+="、確認待ち":e+="、終了"):e="確認"===t.templateValue?"確認、終了":"終了";const o=await s(v.pageName,n,e);return o}}else mw.notify("削除依頼対象のページが1つも指定されていません",{type:"error"})}async function p(t){const e=await v.api.get({action:"query",format:"json",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"*",titles:t}),n=Object.prototype.hasOwnProperty.call(e.query.pages[0],"missing");if(n)return void mw.notify($(`<span><a href="${mw.util.getUrl(t)}" target="_blank">${t}</a> が存在しません。<br />このページの削除依頼タグの除去をスキップします。</span>`),{autoHide:!1,title:"[警告] "+t,type:"warn"});const a=e.query.pages[0].revisions[0].slots.main.content,o="<!-- 削除についての議論が終了するまで、下記のメッセージ部分は除去しないでください。もしあなたがこのテンプレートを除去した場合、差し戻されます。またページが保護されることもあります。 -->",i="<!-- 削除についての議論が終了するまで、上記部分は削除しないでください。 -->",l=a.includes(o),c=a.includes(i),r=/\{\{\s*([Cc]opyrights?|[Cc]opyvio|著作権(侵害(指摘)?)?)\s*(\|[^}]*\s*)?\}\}/,d=r.test(a),p=/\{\{\s*[sS]akujo\/本体\s*\|\s*\d{4}年\d{1,2}月\d{1,2}日\s*\|\s*(<nowiki>.*(?!<\/nowiki>).*<\/nowiki>|[^}])*\}\}\n?/,u=p.test(a);var m=a.replace(o,"").replace(i,"").replace(p,"").replace(r,"").trim();if(!u)return void mw.notify($(`<span><a href="${mw.util.getUrl(t)}" target="_blank">${t}</a> で削除依頼タグが検出できませんでした。</span><br /><span>既に除去されたか、そもそも削除審議の対象ではないかもしれません。</span>`),{autoHide:!1,title:"[エラー] "+t,type:"error"});if(!l||!c){var h=$(`<span><a href="${mw.util.getUrl(t)}" target="_blank">${t}</a> の削除依頼タグの上下にあるコメントのどちらか、または両方が検出できませんでした。</span><br /><span>コメントが除去できていない可能性があります。手動で確認してください。</span>`),x="[警告] "+t;mw.notify(h,{autoHide:!1,title:x,type:"warn"})}var g="-sakujo";d&&(g+=", -copyrights");const f=await s(t,m,g);return f}async function u(t,e){const n=v.pageName.slice(15),a=new mw.Title(t),o=a.getTalkPage().getPrefixedText(),i=a.isTalkPage(),l=await v.api.get({action:"query",format:"json",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"*",titles:o}),c=Object.prototype.hasOwnProperty.call(l.query.pages[0],"missing");var r=await v.api.get({action:"query",format:"json",prop:"revisions",titles:v.pageName,formatversion:"2",rvprop:"timestamp",rvslots:"*",rvlimit:"1",rvdir:"newer"});r=r.query.pages[0].revisions[0].timestamp,r=new Date(r),r=`${r.getFullYear()}年${r.getMonth()+1}月${r.getDate()}日`;var d,p="";if(c)d=p="{{subst:Dpn|page="+n+"|2="+e+"|date="+r+(i?"|ノート=1":"")+"}}\n\n";else{const a=l.query.pages[0].revisions[0].slots.main.content,c=a.match(/(\{\{削除依頼ログ(?:<nowiki>.*<\/nowiki>|[^}}])*\}\})/gs);if(null!==c)for(const l of c){const c=/talk\s*=\s*true/,s=c.test(l),v=l.match(/\|(?:full)?page(?<num>\d+)/g),g=new RegExp("\\|\\s*page\\d+\\s*=\\s*"+n+"\\s*\\|").test(l);if(g){var u=$(`<span>既に削除依頼ログが <a href="${mw.util.getUrl(o)}" target="_blank">${o}</a> へ追加されているようです。</span><br /><span>ログの追加をスキップします。</span>`),m="[警告] "+t;return void mw.notify(u,{autoHide:!1,title:m,type:"warn"})}var h=1;for(const t of v){var x=t.match(/\d+/);x=Number(x[0]),h<=x&&(h=x+1)}(!s&&!i||s&&i)&&(p=l.slice(0,-2)+"{{subst:Dpn|page="+n+"|2="+e+"|date="+r+"|n="+h+"}}\n}}",d=a.replace(l,p))}else p="{{subst:Dpn|page="+n+"|2="+e+"|date="+r+(i?"|ノート=1":"")+"}}\n",d=p+a}console.log(p);const g=await s(o,d,"+{{削除依頼ログ}}");return g}const m=t("vue"),h=t("@wikimedia/codex");var v={summaryAd:" ([[User:Syunsyunminmin/script/XfD-handler.js|xfd-handler]])",api:new mw.Api(),pageName:mw.config.get("wgPageName"),hasDelPerm:mw.config.get("wgUserGroups").includes("sysop")||mw.config.get("wgUserGroups").includes("eliminator"),votemenu:[{value:"削除"},{value:"全削除"},{label:"一部 削除/存続",value:"一部"},{value:"即時削除"},{value:"全即時削除"},{value:"存続"},{value:"全存続"},{value:"即時存続"},{value:"全即時存続"},{value:"版指定削除"},{value:"即時版指定削除"},{value:"中立"},{value:"緊急削除"},{value:"緊急版指定削除"},{value:"緊急即時削除"},{value:"緊急即時版指定削除"},{value:"履歴統合"},{value:"プロジェクトへ移動"},{value:"特定版削除"},{value:"緊急特定版削除"}],adminTemp:[{value:"対処"},{value:"確認"},{value:"議論終了"},{value:"却下"},{value:"失効"}]},x=$("<span>").attr("id","xfdh-actionlist").append($("<span>").addClass("mw-editsection-bracket").text("[")).append($("<a>").attr({class:"xfdh-actionlink",id:"xfdh-action-vote",name:"vote",title:"投票する"}).append($("<span>").text("投票")));v.hasDelPerm&&x.append($("<span>").addClass("mw-editsection-divider").text(" | ")).append($("<a>").attr({class:"xfdh-actionlink",id:"xfdh-action-close",name:"close",title:"削除依頼を閉じる"}).append($("<span>").text("閉じる"))),x.append($("<span>").addClass("mw-editsection-bracket").text("]")),$("#mw-content-text .mw-editsection").append(x),$(".mw-editsection-divider").show(),e(),v.hasDelPerm&&n()})});
//</nowiki>