User:Dudemanfellabra/AssessNRHP.js
// global vars
var Articles=[]
var currentlyDisplayed=""
var CheckDefaults={"autoload":false, "ignoreconfirm":false, "watchtarget":true}
function MaintenanceButton() {
var button=document.createElement("input")
button.setAttribute("type", "button");
if (mw.config.get('wgPageName')=="Wikipedia:WikiProject_National_Register_of_Historic_Places/to_do") {
button.setAttribute("value", "Assess quality/importance of unassessed articles");
button.setAttribute("id", "maintenancebutton");
button.setAttribute("onclick", "MaintenanceClick('maintenance')");
} else if ((mw.config.get('wgPageName').search("National_Register_of_Historic_Places_listings") != -1 || mw.config.get('wgPageName').search("National_Historic_Landmarks_in") != -1) && mw.config.get('wgNamespaceNumber')==0 && location.href.indexOf('action')==-1 && mw.config.get('wgArticleId')!=0) {
button.setAttribute("value", "Assess quality/importance of unassessed articles");
button.setAttribute("id", "untaggedbutton");
button.setAttribute("onclick", "MaintenanceClick('untagged')");
} else if (mw.config.get('wgPageName')=="Category:Pages_using_infobox_NRHP_with_unknown_parameters") {
button.setAttribute("value", "Clean up infoboxes");
button.setAttribute("id", "infoboxbutton");
button.setAttribute("onclick", "MaintenanceClick('infobox')");
} else {
return;
}
var content=document.getElementById('mw-content-text')
content.parentNode.insertBefore(button, content)
}
function MaintenanceClick(param) {
var button = document.getElementById(param+'button')
button.disabled = true
var DisplayDiv=document.createElement("div")
var content=document.getElementById("mw-content-text")
DisplayDiv.setAttribute('id', 'DisplayDiv')
DisplayDiv.setAttribute("style", "width:100%; border:1px solid black; padding:5px")
content.parentNode.insertBefore(DisplayDiv, content)
var UIDiv=document.createElement("div")
UIDiv.setAttribute('id', 'UIDiv')
UIDiv.setAttribute("style", "width:100%; height:280px; border:1px solid black; padding:5px; text-align:center; vertical-align:top")
DisplayDiv.parentNode.insertBefore(UIDiv, DisplayDiv)
if (param=="maintenance") {
QueryMaintenance()
} else if (param=="untagged") {
QueryUntagged()
} else if (param=="infobox") {
QueryInfoboxCleanup()
} else {
return;
}
}
function QueryMaintenance() {
var NoQuality = JSON.parse(
$.ajax({
dataType: "json",
url: mw.util.wikiScript('api'),
data: {
format: 'json',
rawcontinue: '',
action: 'query',
list: 'categorymembers',
cmtitle: 'Category:Unassessed National Register of Historic Places articles',
cmprop: 'title',
cmtype: 'page',
cmlimit: 'max'
},
async:false
})
.responseText
);
for (var c in NoQuality.query.categorymembers) {
Articles[Articles.length]=NoQuality.query.categorymembers[c].title.replace("Talk:","")
}
if (NoQuality["query-continue"]) {
var cmcontinue = NoQuality["query-continue"].categorymembers.cmcontinue
while (true) {
var NoQuality = JSON.parse(
$.ajax({
dataType: "json",
url: mw.util.wikiScript('api'),
data: {
format: 'json',
rawcontinue: '',
action: 'query',
list: 'categorymembers',
cmtitle: 'Category:Unassessed National Register of Historic Places articles',
cmprop: 'title',
cmtype: 'page',
cmlimit: 'max',
cmcontinue: cmcontinue
},
async:false
})
.responseText
);
for (var c in NoQuality.query.categorymembers) {
Articles[Articles.length]=NoQuality.query.categorymembers[c].title.replace("Talk:","")
}
if (NoQuality["query-continue"]) {
cmcontinue = NoQuality["query-continue"].categorymembers.cmcontinue
} else {
break;
}
}
}
// have all members of Unassessed category; now get unknown-importance
var NoImportance = JSON.parse(
$.ajax({
dataType: "json",
url: mw.util.wikiScript('api'),
data: {
format: 'json',
rawcontinue: '',
action: 'query',
list: 'categorymembers',
cmtitle: 'Category:Unknown-importance National Register of Historic Places articles',
cmprop: 'title',
cmtype: 'page',
cmlimit: 'max'
},
async:false
})
.responseText
);
for (var c in NoImportance.query.categorymembers) {
Articles[Articles.length]=NoImportance.query.categorymembers[c].title.replace("Talk:","")
}
if (NoImportance["query-continue"]) {
var cmcontinue = NoImportance["query-continue"].categorymembers.cmcontinue
while (true) {
var NoImportance = JSON.parse(
$.ajax({
dataType: "json",
url: mw.util.wikiScript('api'),
data: {
format: 'json',
rawcontinue: '',
action: 'query',
list: 'categorymembers',
cmtitle: 'Category:Unknown-importance National Register of Historic Places articles',
cmprop: 'title',
cmtype: 'page',
cmlimit: 'max',
cmcontinue: cmcontinue
},
async:false
})
.responseText
);
for (var c in NoImportance.query.categorymembers) {
Articles[Articles.length]=NoImportance.query.categorymembers[c].title.replace("Talk:","")
}
if (NoImportance["query-continue"]) {
cmcontinue = NoImportance["query-continue"].categorymembers.cmcontinue
} else {
break;
}
}
}
// have all articles; now remove duplicates (articles that are both unassessed AND unknown-importance
for (var i=0;i for (var j=i+1;j if (Articles[i]==Articles[j]) {Articles.splice(j,1);j--} } } Articles.sort() UpdateUIDiv(-1, false, false, false) } function QueryUntagged() { var wikitext=getAssessmentWikitext(mw.config.get('wgPageName')) if (wikitext=="error") { alert("Could not retrieve wikitext! Assessment script aborted!") return; } var TableStartIndex=0 var currentTable=0 while (1) { var Rows=[]; TableStartIndex=wikitext.search(/{{NRHP (former )?header/) // find next table if (TableStartIndex==-1) { break; } wikitext=wikitext.substr(TableStartIndex+1,wikitext.length-TableStartIndex) // get rid everything before current table var UnassessedStr = "" var UntaggedStr = "" var tabletext=wikitext.substr(0,wikitext.indexOf("\n|}")) tabletext=tabletext.replace(/\<\!\-\-(.|[\r\n])*?\-\-\>/g, "") // get rid of commented out rows var index, RowLocations = []; var str = "{{NRHP row" var skip = str.length var StartIndex = 0 while ((index = tabletext.indexOf(str, StartIndex)) > -1) { RowLocations.push(index); StartIndex = index + skip; } RowLocations.push(tabletext.length) // last row ends at end of table for (var i=0; i Rows.push(tabletext.substr(RowLocations[i],RowLocations[i+1]-RowLocations[i])) } var TitlesArray = []; for (var j=0; j var link=Rows[j].match(/\|[ ]*?article[ ]*?=[ ]*?.*?[\n|\|]/g) var blank=Rows[j].match(/\|[ ]*?article[ ]*?=[ ]*?[\n|\|]/g) // default to name param if article if (link==null||blank!=null) link=Rows[j].match(/\|[ ]*?name[ ]*?=[ ]*?.*?[\n|\|]/g) // blank or missing link=link[0].replace(/\|[ ]*?(article|name)[ ]*?=[ ]*?/g,"").replace(/[\n|\|]/g,"") // strip param name, final line break link=decodeURIComponent(link.split("#")[0].trim()) // corrections for weird titles TitlesArray.push(link) } for (var i=0;i for (var j=i+1;j if (TitlesArray[i]==TitlesArray[j]) {TitlesArray.splice(j,1);j--} } } toQuery=TitlesArray.length var done = "no" var loops = 0 while (done=="no") { if (toQuery>50) { var TempTitlesArray = TitlesArray.slice(50*loops,50*(loops+1)) } else { var TempTitlesArray = TitlesArray.slice(50*loops) } TempTitlesArray.sort() // query below returns results in alphabetical order var temptitle=TempTitlesArray[0] for (var k=1; k temptitle+="|"+TempTitlesArray[k] } var dabs=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'categories', clcategories: 'Category:All disambiguation pages', cllimit: 'max', titles: temptitle, redirects: 'true' }, async:false }) .responseText ); if (dabs.query.normalized) { // normalize any weird titles for (var n in dabs.query.normalized) { for (var k=0; k if (TempTitlesArray[k]==dabs.query.normalized[n].from) TempTitlesArray[k]=dabs.query.normalized[n].to } } } if (dabs.query.redirects) { // resolve any redirects for (var r in dabs.query.redirects) { for (var k=0; k if (TempTitlesArray[k]==dabs.query.redirects[r].from) TempTitlesArray[k]=dabs.query.redirects[r].to } } } for (var i=0;i for (var j=i+1;j if (TempTitlesArray[i]==TempTitlesArray[j]) {TempTitlesArray.splice(j,1);j--} } } TempTitlesArray.sort() for (var page in dabs.query.pages) { if (typeof dabs.query.pages[page].missing!="undefined") { // if unarticled, get rid of it in preparation for for (var l=0; l if (TempTitlesArray[l]==dabs.query.pages[page].title) {TempTitlesArray.splice(l,1); l--} } } if (dabs.query.pages[page].categories) { for (var category in dabs.query.pages[page].categories) { for (var l=0; l if (TempTitlesArray[l]==dabs.query.pages[page].title) {TempTitlesArray.splice(l,1);l--} } } } } // Now look at talk pages to find quality stats if (TempTitlesArray.length>0) { var temptalktitle="Talk:"+TempTitlesArray[0] for (var k=1; k temptalktitle+="|Talk:"+TempTitlesArray[k] } var QualityList=["Unassessed", "Stub", "Start", "C", "B", "GA", "A", "FA", "FL", "List", "Redirect", "Category", "Disambig", "File", "Project", "Template", "NA"] var ImportanceList=["Unknown", "Top", "High", "Mid", "Low", "Related", "NA"] var catlist="Category:Unassessed National Register of Historic Places articles" for (var i=1; i catlist+="|Category:"+QualityList[i]+"-Class National Register of Historic Places articles" } for (var i=0; i catlist+="|Category:"+ImportanceList[i]+"-importance National Register of Historic Places articles" } var talkpages=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'categories', clcategories: catlist, cllimit: 'max', titles: temptalktitle }, async:false }) .responseText ); for (var page in talkpages.query.pages) { var tagged = false if (talkpages.query.pages[page].categories) { for (var category in talkpages.query.pages[page].categories) { tagged = true var CatTitle=talkpages.query.pages[page].categories[category].title if (CatTitle.indexOf("Unassessed")!=-1||CatTitle.indexOf("Redirect")!=-1) { Articles[Articles.length]=talkpages.query.pages[page].title.replace("Talk:","") } } } if (!tagged) { Articles[Articles.length]=talkpages.query.pages[page].title.replace("Talk:","") } } } if (toQuery>50) { toQuery = toQuery-50 loops++ } else { done = "yes" } } currentTable++ } for (var i=0;i for (var j=i+1;j if (Articles[i]==Articles[j]) {Articles.splice(j,1);j--} } } Articles.sort() UpdateUIDiv(-1, false, false, false) } function QueryInfoboxCleanup() { var Infoboxes = JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', list: 'categorymembers', cmtitle: 'Category:Pages using infobox NRHP with unknown parameters', cmsort: 'sortkey', cmprop: 'title', cmtype: 'page', cmlimit: 'max' }, async:false }) .responseText ); for (var c in Infoboxes.query.categorymembers) { Articles[Articles.length]=Infoboxes.query.categorymembers[c].title } if (Infoboxes["query-continue"]) { var cmcontinue = Infoboxes["query-continue"].categorymembers.cmcontinue while (true) { var Infoboxes = JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', list: 'categorymembers', cmtitle: 'Category:Pages using infobox NRHP with unknown parameters', cmprop: 'title', cmtype: 'page', cmlimit: 'max', cmcontinue: cmcontinue }, async:false }) .responseText ); for (var c in Infoboxes.query.categorymembers) { Articles[Articles.length]=Infoboxes.query.categorymembers[c].title } if (Infoboxes["query-continue"]) { cmcontinue = Infoboxes["query-continue"].categorymembers.cmcontinue } else { break; } } } UpdateInfoboxUIDiv(-1, false, false, false) } function UpdateUIDiv(selected, autoload, ignoreconfirm, watchtarget) { var DisplayDiv=document.getElementById("DisplayDiv") var UIDiv=document.getElementById("UIDiv") UIDiv.innerHTML="" if (Articles.length==0) { UIDiv.style.verticalAlign="middle" UIDiv.innerHTML="There are no more articles to tag/assess. Good job!" DisplayDiv.innerHTML="" return; } var ListDiv=document.createElement("div") ListDiv.setAttribute("style","width:39.5%; float:left; text-align:left") ListDiv.innerHTML=" var select=document.createElement("select") select.setAttribute("size",15) select.setAttribute("id","ArticlesList") select.setAttribute("style","width:300px") for (var i=0; i var option=document.createElement("option") option.innerHTML=Articles[i] select.appendChild(option) } select.selectedIndex=selected ListDiv.appendChild(select) var buttondiv=document.createElement("div") buttondiv.setAttribute("style","width:300px; text-align:center") var prevbutton=document.createElement("input") prevbutton.setAttribute("type", "button") prevbutton.setAttribute("value", "Load previous") prevbutton.setAttribute("style","margin-top:7px") prevbutton.setAttribute("onclick", "LoadWrapper('prev')"); buttondiv.appendChild(prevbutton) var selectbutton=document.createElement("input") selectbutton.setAttribute("type", "button") selectbutton.setAttribute("value", "Load selected") selectbutton.setAttribute("style","margin-top:7px") selectbutton.setAttribute("onclick", "LoadWrapper('selected')"); buttondiv.appendChild(selectbutton) var nextbutton=document.createElement("input") nextbutton.setAttribute("type", "button") nextbutton.setAttribute("value", "Load next") nextbutton.setAttribute("style","margin-top:7px") nextbutton.setAttribute("onclick", "LoadWrapper('next')"); buttondiv.appendChild(nextbutton) ListDiv.appendChild(buttondiv) UIDiv.appendChild(ListDiv) var AssessmentDiv=document.createElement("div") AssessmentDiv.setAttribute("id","AssessmentDiv") AssessmentDiv.setAttribute("style","width:59.5%; float:right; text-align:center") UIDiv.appendChild(AssessmentDiv) if (currentlyDisplayed=="") { AssessmentDiv.innerHTML="Select an article from the list to the left and click \"Load selected\" to begin assessment." } else { AssessmentDiv.innerHTML="Loading..." var QualityList=["Unassessed", "Stub", "Start", "C", "B", "GA", "A", "FA", "FL", "List", "Redirect", "Category", "Disambig", "File", "Project", "Template", "NA"] var ImportanceList=["Unknown", "Top", "High", "Mid", "Low", "Related", "NA"] var catlist="Category:Unassessed National Register of Historic Places articles" for (var i=1; i catlist+="|Category:"+QualityList[i]+"-Class National Register of Historic Places articles" } for (var i=0; i catlist+="|Category:"+ImportanceList[i]+"-importance National Register of Historic Places articles" } var cats=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'categories', clcategories: catlist, cllimit: 'max', titles: "Talk:"+currentlyDisplayed }, async:false }) .responseText ); var tagged=false var quality = "Unassessed" var importance = "Unknown" for (var page in cats.query.pages) { if (cats.query.pages[page].categories) { tagged=true for (var category in cats.query.pages[page].categories) { var CatTitle=cats.query.pages[page].categories[category].title CatTitle=CatTitle.replace("Category:","").replace(" National Register of Historic Places articles","") if (CatTitle.indexOf("importance")!=-1) importance=CatTitle.replace("-importance","") if (CatTitle.indexOf("Class")!=-1||CatTitle.indexOf("Unassessed")!=-1) quality=CatTitle.replace("-Class","") } } } var TitleDiv=document.createElement("div") TitleDiv.setAttribute("style","width:100%; text-align:center; font-size:125%; font-weight:bold; white-space:nowrap; overflow:hidden") TitleDiv.innerHTML=currentlyDisplayed if (tagged) { var talkpage=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvlimit: 1, redirects: 'true', titles: "Talk:"+currentlyDisplayed, rvsection: 0 }, async:false }) .responseText ); for (var page in talkpage.query.pages) { var talkpagetext=talkpage.query.pages[page].revisions[0]['*'] } } else { var talkpagetext="" } var templateRedirects="WikiProject NRHP|Wikiproject NRHP|WPNRHP" var regex=new RegExp("{"+"{( |\\n)*?(WikiProject National Register of Historic Places|"+templateRedirects+")(.|\\n)*?}}","gi") existingTemplate=talkpagetext.match(regex) if (existingTemplate==null) { existingTemplate="{"+"{WikiProject National Register of Historic Places"+"|class=|importance=}}" // split to avoid transcluding } else { existingTemplate=existingTemplate[0] } regex=new RegExp("("+templateRedirects+")","gi") var newTemplate=existingTemplate.replace(regex, "WikiProject National Register of Historic Places") regex=/\|( |\n)*?class[ ]*?=(.|\n)*?(?=\||}})/gi if (newTemplate.match(regex)==null) { newTemplate=newTemplate.substr(0,newTemplate.length-2)+"|class="+"}}" } else { if (quality!="Unassessed") newTemplate=newTemplate.replace(regex,"|class="+quality) } regex=/\|( |\n)*?importance[ ]*?=(.|\n)*?(?=\||}})/gi if (newTemplate.match(regex)==null) { newTemplate=newTemplate.substr(0,newTemplate.length-2)+"|importance="+"}}" } else { if (importance!="Unknown") newTemplate=newTemplate.replace(regex,"|importance="+importance) } AssessmentDiv.style.textAlign="left" AssessmentDiv.innerHTML="" AssessmentDiv.appendChild(TitleDiv) AssessmentDiv.innerHTML+="Current assessment: var existingAssessTextarea=document.createElement("textarea") if (tagged) { existingAssessTextarea.innerHTML=existingTemplate existingAssessTextarea.value=existingTemplate } else { existingAssessTextarea.innerHTML="Talk page is not tagged with NRHP project banner." existingAssessTextarea.value="Talk page is not tagged with NRHP project banner." } existingAssessTextarea.readOnly=true existingAssessTextarea.setAttribute("style","width:500px; height:60px") existingAssessTextarea.setAttribute("id","existingAssessTextarea") AssessmentDiv.appendChild(existingAssessTextarea) AssessmentDiv.innerHTML+="Your assessment: var span=document.createElement("span") span.setAttribute("style","display:inline-block; width:175px") span.innerHTML="Quality: " var QualitySelect=document.createElement("select") QualitySelect.setAttribute("id","QualitySelect") QualitySelect.setAttribute("onchange","UpdateNewAssessTextarea()") for (var i=0; i var option=document.createElement("option") option.innerHTML=QualityList[i] if (QualityList[i]==quality) option.setAttribute("selected","selected") QualitySelect.appendChild(option) } span.appendChild(QualitySelect) AssessmentDiv.appendChild(span) AssessmentDiv.innerHTML+="Importance: " var ImportanceSelect=document.createElement("select") ImportanceSelect.setAttribute("id","ImportanceSelect") ImportanceSelect.setAttribute("onchange","UpdateNewAssessTextarea()") for (var i=0; i var option=document.createElement("option") option.innerHTML=ImportanceList[i] if (ImportanceList[i]==importance) option.setAttribute("selected","selected") ImportanceSelect.appendChild(option) } AssessmentDiv.appendChild(ImportanceSelect) AssessmentDiv.innerHTML+=" var NewAssessTextarea=document.createElement("textarea") NewAssessTextarea.value=newTemplate NewAssessTextarea.setAttribute("style","width:500px; height:60px") NewAssessTextarea.setAttribute("id","NewAssessTextarea") AssessmentDiv.appendChild(NewAssessTextarea) var EditButton=document.createElement("input") EditButton.setAttribute("type", "button"); EditButton.setAttribute("value", "Apply assessment"); EditButton.setAttribute("id", "EditButton"); EditButton.setAttribute("style","margin-top:7px") EditButton.setAttribute("onclick", "EditPageWithAssessment()"); AssessmentDiv.appendChild(EditButton) var CheckDiv=document.createElement("div") CheckDiv.setAttribute("style","display:inline-block; vertical-align:middle; margin-left:15px") var autoloadcheck=document.createElement("input") autoloadcheck.setAttribute("type","checkbox") autoloadcheck.setAttribute("id","autoloadcheck") if (CheckDefaults.autoload) autoloadcheck.setAttribute("checked","checked") var autoloadlabel=document.createElement("label") autoloadlabel.setAttribute("for", "autoloadcheck") autoloadlabel.innerHTML="Automatically load next page after successful edit" CheckDiv.appendChild(autoloadcheck) CheckDiv.appendChild(autoloadlabel) CheckDiv.innerHTML+=" var ignoreconfirmcheck=document.createElement("input") ignoreconfirmcheck.setAttribute("type","checkbox") ignoreconfirmcheck.setAttribute("id","ignoreconfirmcheck") if (CheckDefaults.ignoreconfirm) ignoreconfirmcheck.setAttribute("checked","checked") var ignoreconfirmlabel=document.createElement("label") ignoreconfirmlabel.setAttribute("for", "ignoreconfirmcheck") ignoreconfirmlabel.innerHTML="Ignore confirmation prompt" CheckDiv.appendChild(ignoreconfirmcheck) CheckDiv.appendChild(ignoreconfirmlabel) CheckDiv.innerHTML+=" var watchtargetcheck=document.createElement("input") watchtargetcheck.setAttribute("type","checkbox") watchtargetcheck.setAttribute("id","watchtargetcheck") if (CheckDefaults.watchtarget) watchtargetcheck.setAttribute("checked","checked") var watchtargetlabel=document.createElement("label") watchtargetcheck.setAttribute("for", "watchtargetcheck") watchtargetlabel.innerHTML="Watch target page" CheckDiv.appendChild(watchtargetcheck) CheckDiv.appendChild(watchtargetlabel) AssessmentDiv.appendChild(CheckDiv) } } function UpdateNewAssessTextarea() { var NewAssessTextarea=document.getElementById("NewAssessTextarea") var QualitySelect=document.getElementById("QualitySelect") var ImportanceSelect=document.getElementById("ImportanceSelect") var regex=/\|( |\n)*?class[ ]*?=(.|\n)*?(?=\||}})/gi var newQuality="" if (QualitySelect.selectedIndex!=0) newQuality=QualitySelect.options[QualitySelect.selectedIndex].innerHTML NewAssessTextarea.value = NewAssessTextarea.value.replace(regex, "|class=" + newQuality) var regex=/\|( |\n)*?importance[ ]*?=(.|\n)*?(?=\||}})/gi var newImportance="" if (ImportanceSelect.selectedIndex!=0) newImportance=ImportanceSelect.options[ImportanceSelect.selectedIndex].innerHTML NewAssessTextarea.value = NewAssessTextarea.value.replace(regex, "|importance=" + newImportance) } function UpdateInfoboxUIDiv(selected, autoload, ignoreconfirm, watchtarget) { var DisplayDiv=document.getElementById("DisplayDiv") var UIDiv=document.getElementById("UIDiv") UIDiv.innerHTML="" if (Articles.length==0) { UIDiv.style.verticalAlign="middle" UIDiv.innerHTML="There are no more articles with infoboxes needing cleanup. Good job!" DisplayDiv.innerHTML="" return; } var ListDiv=document.createElement("div") ListDiv.setAttribute("style","width:39.5%; float:left; text-align:left") ListDiv.innerHTML=" var select=document.createElement("select") select.setAttribute("size",15) select.setAttribute("id","ArticlesList") select.setAttribute("style","width:300px") for (var i=0; i var option=document.createElement("option") option.innerHTML=Articles[i] select.appendChild(option) } select.selectedIndex=selected ListDiv.appendChild(select) var buttondiv=document.createElement("div") buttondiv.setAttribute("style","width:300px; text-align:center") var prevbutton=document.createElement("input") prevbutton.setAttribute("type", "button") prevbutton.setAttribute("value", "Load previous") prevbutton.setAttribute("style","margin-top:7px") prevbutton.setAttribute("onclick", "LoadInfoboxWrapper('prev')"); buttondiv.appendChild(prevbutton) var selectbutton=document.createElement("input") selectbutton.setAttribute("type", "button") selectbutton.setAttribute("value", "Load selected") selectbutton.setAttribute("style","margin-top:7px") selectbutton.setAttribute("onclick", "LoadInfoboxWrapper('selected')"); buttondiv.appendChild(selectbutton) var nextbutton=document.createElement("input") nextbutton.setAttribute("type", "button") nextbutton.setAttribute("value", "Load next") nextbutton.setAttribute("style","margin-top:7px") nextbutton.setAttribute("onclick", "LoadInfoboxWrapper('next')"); buttondiv.appendChild(nextbutton) ListDiv.appendChild(buttondiv) UIDiv.appendChild(ListDiv) var AssessmentDiv=document.createElement("div") AssessmentDiv.setAttribute("id","AssessmentDiv") AssessmentDiv.setAttribute("style","width:59.5%; float:right; text-align:center") UIDiv.appendChild(AssessmentDiv) if (currentlyDisplayed=="") { AssessmentDiv.innerHTML="Select an article from the list to the left and click \"Load selected\" to begin cleanup." } else { AssessmentDiv.innerHTML="Loading..." var TitleDiv=document.createElement("div") TitleDiv.setAttribute("style","width:100%; text-align:center; font-size:125%; font-weight:bold; white-space:nowrap; overflow:hidden") TitleDiv.innerHTML=currentlyDisplayed var pagetext=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvlimit: 1, redirects: 'true', titles: currentlyDisplayed }, async:false }) .responseText ); for (var page in pagetext.query.pages) { pagetext=pagetext.query.pages[page].revisions[0]['*'] } var regex=new RegExp("{"+"{( |\\n)*?Infobox( |_)NRHP( |\\n)*?(?=\\|)","gi") var str = pagetext.match(regex)[0] var start=pagetext.indexOf(str) var open=1 var index=start+str.length while (open!=0 && index if (pagetext.substr(index,2)=="}}") { open-- index++ } else if (pagetext.substr(index,2)=="{{") { open++ index++ } index++ } var existingInfobox=pagetext.substr(start,index-start) AssessmentDiv.style.textAlign="left" AssessmentDiv.innerHTML="" AssessmentDiv.appendChild(TitleDiv) var OldInfoboxDiv=document.createElement("div") OldInfoboxDiv.setAttribute("style","width:300px; height:200px; float:left") OldInfoboxDiv.innerHTML+="Old infobox:" var existingInfoboxTextarea=document.createElement("textarea") existingInfoboxTextarea.innerHTML=existingInfobox existingInfoboxTextarea.value=existingInfobox existingInfoboxTextarea.readOnly=true existingInfoboxTextarea.setAttribute("style","width:295px; height:180px") existingInfoboxTextarea.setAttribute("id","existingInfoboxTextarea") OldInfoboxDiv.appendChild(existingInfoboxTextarea) AssessmentDiv.appendChild(OldInfoboxDiv) var NewInfoboxDiv=document.createElement("div") NewInfoboxDiv.setAttribute("style","width:300px; height:200px; float:right") NewInfoboxDiv.innerHTML+="New infobox: " var previewLink=document.createElement("a") previewLink.setAttribute("id","previewLink") previewLink.setAttribute("onclick","PreviewInfoboxHTML()") previewLink.innerHTML="(preview)" NewInfoboxDiv.appendChild(previewLink) var NewInfoboxTextarea=document.createElement("textarea") NewInfoboxTextarea.value=existingInfobox NewInfoboxTextarea.setAttribute("style","width:295px; height:180px; float:right") NewInfoboxTextarea.setAttribute("id","NewInfoboxTextarea") NewInfoboxDiv.appendChild(NewInfoboxTextarea) AssessmentDiv.appendChild(NewInfoboxDiv) var EditButton=document.createElement("input") EditButton.setAttribute("type", "button"); EditButton.setAttribute("value", "Update infobox"); EditButton.setAttribute("id", "EditButton"); EditButton.setAttribute("style","margin-top:7px") EditButton.setAttribute("onclick", "EditPageWithInfobox()"); AssessmentDiv.appendChild(EditButton) var CheckDiv=document.createElement("div") CheckDiv.setAttribute("style","display:inline-block; vertical-align:middle; margin-left:15px") var autoloadcheck=document.createElement("input") autoloadcheck.setAttribute("type","checkbox") autoloadcheck.setAttribute("id","autoloadcheck") if (CheckDefaults.autoload) autoloadcheck.setAttribute("checked","checked") var autoloadlabel=document.createElement("label") autoloadlabel.setAttribute("for", "autoloadcheck") autoloadlabel.innerHTML="Automatically load next page after successful edit" CheckDiv.appendChild(autoloadcheck) CheckDiv.appendChild(autoloadlabel) CheckDiv.innerHTML+=" var ignoreconfirmcheck=document.createElement("input") ignoreconfirmcheck.setAttribute("type","checkbox") ignoreconfirmcheck.setAttribute("id","ignoreconfirmcheck") if (CheckDefaults.ignoreconfirm) ignoreconfirmcheck.setAttribute("checked","checked") var ignoreconfirmlabel=document.createElement("label") ignoreconfirmlabel.setAttribute("for", "ignoreconfirmcheck") ignoreconfirmlabel.innerHTML="Ignore confirmation prompt" CheckDiv.appendChild(ignoreconfirmcheck) CheckDiv.appendChild(ignoreconfirmlabel) CheckDiv.innerHTML+=" var watchtargetcheck=document.createElement("input") watchtargetcheck.setAttribute("type","checkbox") watchtargetcheck.setAttribute("id","watchtargetcheck") if (CheckDefaults.watchtarget) watchtargetcheck.setAttribute("checked","checked") var watchtargetlabel=document.createElement("label") watchtargetcheck.setAttribute("for", "watchtargetcheck") watchtargetlabel.innerHTML="Watch target page" CheckDiv.appendChild(watchtargetcheck) CheckDiv.appendChild(watchtargetlabel) AssessmentDiv.appendChild(CheckDiv) } } function LoadWrapper(direction) { var DisplayDiv=document.getElementById('DisplayDiv') var select=document.getElementById('ArticlesList') if (direction=="selected"&&select.selectedIndex!=-1) { var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadHTML(article) } else if (direction=="next") { select.selectedIndex++ if (select.selectedIndex==-1||select.selectedIndex>=Articles.length) select.selectedIndex=0 var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadHTML(article) } else if (direction=="prev") { select.selectedIndex-- if (select.selectedIndex<0) select.selectedIndex=select.options.length-1 var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadHTML(article) } } function LoadInfoboxWrapper(direction) { var DisplayDiv=document.getElementById('DisplayDiv') var select=document.getElementById('ArticlesList') if (direction=="selected"&&select.selectedIndex!=-1) { var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadInfoboxHTML(article) } else if (direction=="next") { select.selectedIndex++ if (select.selectedIndex==-1||select.selectedIndex>=Articles.length) select.selectedIndex=0 var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadInfoboxHTML(article) } else if (direction=="prev") { select.selectedIndex-- if (select.selectedIndex<0) select.selectedIndex=select.options.length-1 var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadInfoboxHTML(article) } } function LoadHTML(article) { // loads parsed HTML content of article into innerHTML of DisplayDiv var DisplayDiv=document.getElementById('DisplayDiv') var AssessmentDiv=document.getElementById("AssessmentDiv") var autoload=document.getElementById("autoloadcheck") if (autoload!=null) CheckDefaults.autoload=autoload.checked autoload=CheckDefaults.autoload var ignoreconfirm=document.getElementById("ignoreconfirmcheck") if (ignoreconfirm!=null) CheckDefaults.ignoreconfirm=ignoreconfirm.checked ignoreconfirm=CheckDefaults.ignoreconfirm var watchtarget=document.getElementById("watchtargetcheck") if (watchtarget!=null) CheckDefaults.watchtarget=watchtarget.checked watchtarget=CheckDefaults.watchtarget AssessmentDiv.style.textAlign="center" AssessmentDiv.innerHTML="Loading..." var HTMLpage=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvparse: true, rvlimit: 1, titles: article, redirects: 'true' }, async:false }) .responseText ); currentlyDisplayed=article for (var i in HTMLpage.query.pages) { DisplayDiv.innerHTML=" } UpdateUIDiv(document.getElementById("ArticlesList").options.selectedIndex, autoload, ignoreconfirm, watchtarget) } function LoadInfoboxHTML(article) { // loads parsed HTML content of article into innerHTML of DisplayDiv var DisplayDiv=document.getElementById('DisplayDiv') var AssessmentDiv=document.getElementById("AssessmentDiv") var autoload=document.getElementById("autoloadcheck") if (autoload!=null) CheckDefaults.autoload=autoload.checked autoload=CheckDefaults.autoload var ignoreconfirm=document.getElementById("ignoreconfirmcheck") if (ignoreconfirm!=null) CheckDefaults.ignoreconfirm=ignoreconfirm.checked ignoreconfirm=CheckDefaults.ignoreconfirm var watchtarget=document.getElementById("watchtargetcheck") if (watchtarget!=null) CheckDefaults.watchtarget=watchtarget.checked watchtarget=CheckDefaults.watchtarget AssessmentDiv.style.textAlign="center" AssessmentDiv.innerHTML="Loading..." $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'parse', prop: 'text', page: article, preview: 'true', redirects: 'true' }, error: function (xhr,status,error) {xhr.errorThrown=error}, complete: function (xhr,status) {InfoboxHTMLFetched(xhr,status,article,DisplayDiv,autoload,ignoreconfirm,watchtarget)} }) } function InfoboxHTMLFetched(xhr,status,article,DisplayDiv,autoload,ignoreconfirm,watchtarget) { if (status!="success") { alert(status+": "+xhr.errorThrown) return; } var HTMLpage=JSON.parse(xhr.responseText) currentlyDisplayed=article DisplayDiv.innerHTML=" UpdateInfoboxUIDiv(document.getElementById("ArticlesList").options.selectedIndex, autoload, ignoreconfirm, watchtarget) } function PreviewInfoboxHTML() { // loads parsed HTML content of currentlyDisplayed article into innerHTML of DisplayDiv var DisplayDiv=document.getElementById('DisplayDiv') var NewInfoboxTextarea=document.getElementById("NewInfoboxTextarea") var link=document.getElementById('previewLink') link.setAttribute("onclick","") link.innerHTML="(Loading...)" var pagetext=getAssessmentWikitext(currentlyDisplayed) if (pagetext=="error") { alert("Could not retrieve preview!") return; } var regex=new RegExp("{"+"{( |\\n)*?Infobox( |_)NRHP( |\\n)*?(?=\\|)","gi") var str = pagetext.match(regex)[0] var start=pagetext.indexOf(str) var open=1 var index=start+str.length while (open!=0 && index if (pagetext.substr(index,2)=="}}") { open-- index++ } else if (pagetext.substr(index,2)=="{{") { open++ index++ } index++ } var existingInfobox=pagetext.substr(start,index-start) pagetext=pagetext.replace(existingInfobox, NewInfoboxTextarea.value) $.ajax({ dataType: "json", method: "POST", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'parse', text: pagetext, contentmodel: 'wikitext' }, error: function (xhr,status,error) {xhr.errorThrown=error}, complete: function (xhr,status) {PreviewFetched(xhr,status,DisplayDiv,link)} }) } function PreviewFetched(xhr,status,DisplayDiv,link) { if (status!="success") { alert(status+": "+xhr.errorThrown) return; } var HTMLpage=JSON.parse(xhr.responseText) DisplayDiv.innerHTML=" link.setAttribute("onclick","PreviewInfoboxHTML()") link.innerHTML="(preview)" } function EditPageWithAssessment() { var existingAssessTextarea=document.getElementById("existingAssessTextarea") var NewAssessTextarea=document.getElementById("NewAssessTextarea") var QualitySelect=document.getElementById("QualitySelect") var ImportanceSelect=document.getElementById("ImportanceSelect") var autoload=document.getElementById("autoloadcheck").checked CheckDefaults.autoload=autoload var ignoreconfirm=document.getElementById("ignoreconfirmcheck").checked CheckDefaults.ignoreconfirm=ignoreconfirm var watchtarget=document.getElementById("watchtargetcheck").checked CheckDefaults.watchtarget=watchtarget if (QualitySelect.selectedIndex==0||ImportanceSelect.selectedIndex==0) { alert("Please choose a quality AND an importance rating in order to apply the assessment.") return; } if (existingAssessTextarea.innerHTML==NewAssessTextarea.value) return; if (!ignoreconfirm) { var confirmstring="Are you sure you want to assess this article as " confirmstring+=QualitySelect.options[QualitySelect.selectedIndex].innerHTML+"-class, " confirmstring+=ImportanceSelect.options[ImportanceSelect.selectedIndex].innerHTML+"-importance?" var confirmtest=confirm(confirmstring) if (!confirmtest) return; } document.getElementById("EditButton").value="Editing..." document.getElementById("EditButton").disabled=true var talkpage=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvlimit: 1, redirects: 'true', titles: "Talk:"+currentlyDisplayed, rvsection: 0 }, async:false }) .responseText ); for (var page in talkpage.query.pages) { if (typeof talkpage.query.pages[page].missing!="undefined") { var talkpagetext="" } else { var talkpagetext=talkpage.query.pages[page].revisions[0]['*'] } } if (talkpagetext=="") { talkpagetext=NewAssessTextarea.value } else { if (existingAssessTextarea.innerHTML=="Talk page is not tagged with NRHP project banner.") { talkpagetext+="\n"+NewAssessTextarea.value } else { talkpagetext=talkpagetext.replace(existingAssessTextarea.innerHTML, NewAssessTextarea.value) } } var summary="Assessing article as "+QualitySelect.options[QualitySelect.selectedIndex].innerHTML+"-class, " summary+=ImportanceSelect.options[ImportanceSelect.selectedIndex].innerHTML+"-importance for WP:NRHP " summary+="using script." var watch="watch" if (!watchtarget) watch="unwatch" var api = new mw.Api(); api.postWithToken( "edit", { action: "edit", section:0, title: "Talk:"+currentlyDisplayed, summary: summary, watchlist: watch, text: talkpagetext } ) .done( function( data ) { document.getElementById("EditButton").value="Apply assessment" document.getElementById("EditButton").disabled=false if (data && data.edit && data.edit.result && data.edit.result == 'Success') { alert("Edit success!") for (var i=0; i if (Articles[i]==currentlyDisplayed) Articles.splice(i,1) } currentlyDisplayed="" var currentSelection=document.getElementById("ArticlesList").options.selectedIndex if (currentSelection>=Articles.length) currentSelection-- if (autoload==true) { currentSelection++ if (currentSelection>=Articles.length) { currentSelection=0 document.getElementById("ArticlesList").options.selectedIndex=0 } LoadHTML(document.getElementById("ArticlesList").options[currentSelection].innerHTML) } else { UpdateUIDiv(currentSelection, autoload, ignoreconfirm, watchtarget) } } else { alert('Edit query error:\n'+data.error.code+': '+data.error.info); } }) .fail( function() { document.getElementById("EditButton").value="Apply assessment" document.getElementById("EditButton").disabled=false alert('Ajax failure.'); }); } function EditPageWithInfobox() { var existingInfoboxTextarea=document.getElementById("existingInfoboxTextarea") var NewInfoboxTextarea=document.getElementById("NewInfoboxTextarea") var autoload=document.getElementById("autoloadcheck").checked CheckDefaults.autoload=autoload var ignoreconfirm=document.getElementById("ignoreconfirmcheck").checked CheckDefaults.ignoreconfirm=ignoreconfirm var watchtarget=document.getElementById("watchtargetcheck").checked CheckDefaults.watchtarget=watchtarget var testInfobox=NewInfoboxTextarea.value.substr(1,NewInfoboxTextarea.value.length-2).replace(/{\{(.|\n)*?}}/g,"") var allowedParamsArray=["added", "alt", "architect", "architecture", "area", "borderless", "builder", "built", "caption"] allowedParamsArray.push("coord_display", "coord_format", "coord_parameters", "coordinates", "customarchitect_title") allowedParamsArray.push("customarchitect", "decrease", "decrease_refnum", "decrease1", "decrease1_refnum", "decrease2") allowedParamsArray.push("decrease2_refnum", "decrease3", "decrease3_refnum", "delisted", "delisted_nrhp_type") allowedParamsArray.push("delisted_nrhp_type2", "delisted_nrhp_type3", "delisted_nrhp_type4", "delisted_other1_date") allowedParamsArray.push("delisted_other2_date", "delisted_other3_date", "demolished", "designated_nrhp_type") allowedParamsArray.push("designated_nrhp_type2", "designated_nrhp_type3", "designated_nrhp_type4", "designated_other1") allowedParamsArray.push("designated_other1_abbr", "designated_other1_color", "designated_other1_date") allowedParamsArray.push("designated_other1_link", "designated_other1_name", "designated_other1_num_position") allowedParamsArray.push("designated_other1_number", "designated_other1_textcolor", "designated_other2") allowedParamsArray.push("designated_other2_abbr", "designated_other2_color", "designated_other2_date") allowedParamsArray.push("designated_other2_link", "designated_other2_name", "designated_other2_num_position") allowedParamsArray.push("designated_other2_number", "designated_other2_textcolor", "designated_other3") allowedParamsArray.push("designated_other3_abbr", "designated_other3_color", "designated_other3_date") allowedParamsArray.push("designated_other3_link", "designated_other3_name", "designated_other3_num_position") allowedParamsArray.push("designated_other3_number", "designated_other3_textcolor", "district_map", "embed", "engineer") allowedParamsArray.push("governing_body", "image", "image_size", "increase", "increase_refnum", "increase1") allowedParamsArray.push("increase1_refnum", "increase2", "increase2_refnum", "increase3", "increase3_refnum") allowedParamsArray.push("label_background", "label_position", "label_size", "lat_degrees", "lat_direction", "lat_minutes") allowedParamsArray.push("lat_seconds", "latitude", "location", "locmap_label", "locmap_label_position", "locmap_relief") allowedParamsArray.push("locmapin", "long_degrees", "long_direction", "long_minutes", "long_seconds", "longitude", "map_alt") allowedParamsArray.push("map_caption", "map_label", "map_width", "mpsub", "name", "nearest_city", "nocat", "nrhp_type") allowedParamsArray.push("nrhp_type2", "nrhp_type3", "nrhp_type4", "partof", "partof_refnum", "refnum", "restored") allowedParamsArray.push("restored_by", "sigdate", "sigdate_label", "sigdate1", "sigdate1_label", "sigdate2", "sigdate2_label") allowedParamsArray.push("sigdate3", "sigdate3_label", "visitation_num", "visitation_ref", "visitation_year", "website") regex=/\|( |\n)*?.*?=/gi var usedParams=testInfobox.match(regex) var badParams=[] for (var i=0; i var allowed=false for (var j=0; j if (usedParams[i].replace(/[\| =]/g,"")==allowedParamsArray[j]) {allowed=true; break} } if (!allowed) badParams.push(usedParams[i].replace(/[\| =]/g,"")) } if (badParams.length>0) { alert('There are still unknown parameters in the infobox!\nUnknown params: "'+badParams.join('", "')+'"') return; } if (existingInfoboxTextarea.innerHTML==NewInfoboxTextarea.value) return; if (!ignoreconfirm) { var confirmstring="Are you sure you want to edit this article?" var confirmtest=confirm(confirmstring) if (!confirmtest) return; } document.getElementById("EditButton").value="Editing..." document.getElementById("EditButton").disabled=true var pagetext=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvlimit: 1, redirects: 'true', titles: currentlyDisplayed }, async:false }) .responseText ); for (var page in pagetext.query.pages) { pagetext=pagetext.query.pages[page].revisions[0]['*'] } var regex=new RegExp("{"+"{( |\\n)*?Infobox( |_)NRHP( |\\n)*?(?=\\|)","gi") var str = pagetext.match(regex)[0] var start=pagetext.indexOf(str) var open=1 var index=start+str.length while (open!=0 && index if (pagetext.substr(index,2)=="}}") { open-- index++ } else if (pagetext.substr(index,2)=="{{") { open++ index++ } index++ } var existingInfobox=pagetext.substr(start,index-start) pagetext=pagetext.replace(existingInfobox, NewInfoboxTextarea.value) var summary="Script-assisted infobox cleanup; remove unsupported parameters." var watch="watch" if (!watchtarget) watch="unwatch" var api = new mw.Api(); api.postWithToken( "edit", { action: "edit", title: currentlyDisplayed, summary: summary, watchlist: watch, text: pagetext } ) .done( function( data ) { document.getElementById("EditButton").value="Update infobox" document.getElementById("EditButton").disabled=false if (data && data.edit && data.edit.result && data.edit.result == 'Success') { alert("Edit success!") for (var i=0; i if (Articles[i]==currentlyDisplayed) Articles.splice(i,1) } currentlyDisplayed="" var currentSelection=document.getElementById("ArticlesList").options.selectedIndex if (currentSelection>=Articles.length) currentSelection-- if (autoload==true) { currentSelection++ if (currentSelection>=Articles.length) { currentSelection=0 document.getElementById("ArticlesList").options.selectedIndex=0 } LoadInfoboxHTML(document.getElementById("ArticlesList").options[currentSelection].innerHTML) } else { UpdateInfoboxUIDiv(currentSelection, autoload, ignoreconfirm, watchtarget) } } else { alert('Edit query error:\n'+data.error.code+': '+data.error.info); } }) .fail( function() { document.getElementById("EditButton").value="Apply assessment" document.getElementById("EditButton").disabled=false alert('Ajax failure.'); }); } function getAssessmentWikitext(title) { try { var output=JSON.parse( $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', titles: title, indexpageids: true, redirects: 'true' }, async:false }) .responseText ); for (page in output.query.pages) { wikitext = output.query.pages[page].revisions[0]['*']; } return wikitext } catch(err) { return "error" } } $(window).load(MaintenanceButton);
Quality: "+quality+"Importance: "+importance+"
"
"
"
"
"
need to be cleaned
"
"" + currentlyDisplayed + "
" + HTMLpage.query.pages[i].revisions[0]['*'] + ''" + currentlyDisplayed + "
" + HTMLpage.parse.text['*'] + ''" + currentlyDisplayed + "
" + HTMLpage.parse.text['*'] + ''