Scripts:Animepage:Sourcecode1: Difference between revisions
Jump to navigation
Jump to search
(Version 20050809.01) |
(Fix for recent site changes which broke decimal vote) |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
<pre> | <pre> | ||
// AniDB-Site-Enhancements | // AniDB-Site-Enhancements: Full | ||
// - Select all files of a group | // - Select all files of a group | ||
// - Replace vote-dropdowns with textfields (enter integers from 100 to 1000) | // - Replace vote-dropdowns with textfields (enter integers from 100 to 1000) | ||
// | // | ||
// Version | // Version 20051210.01 | ||
// works with FF1.5 and greasemonkey 0.6.4 | |||
// Copyright (c) 2005, Lupin III. | // Copyright (c) 2005, Lupin III. | ||
// Released under the GPL license | // Released under the GPL license | ||
// http://www.gnu.org/copyleft/gpl.html | // http://www.gnu.org/copyleft/gpl.html | ||
// | // | ||
// Thanks to | |||
// TechNiko for the webspace | |||
// visnu for some advice on speedups for long animelists | |||
// | // | ||
// ==UserScript== | // ==UserScript== | ||
// @name AniDB-Site-Enhancer | // @name AniDB-Site-Enhancer: Full | ||
// @namespace lupin_sanseis_scripts | // @namespace lupin_sanseis_scripts | ||
// @description selects all files of a release group, replaces vote dropdowns with textfields | // @description selects all files of a release group, replaces vote dropdowns with textfields | ||
// @include http://anidb.info/* | // @include http://anidb.info/perl-bin/animedb.pl?show=anime&* | ||
// ==/UserScript== | // ==/UserScript== | ||
Line 29: | Line 33: | ||
function group_selects () { | function group_selects () { | ||
// look up the grouplist table (using the bold "Group Info:" as an anchor, as it's fast to find) | |||
var group_table = document.evaluate("//b/text()[starts-with(.,'Group') and contains(., 'Info:')]/../../../..", document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue; | |||
// when css convert of page happens // | |||
var group_table = document.evaluate("//div[class="anime_group"]/table", document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue; | |||
// will want checking though... // | |||
if (group_table == null){ | |||
return; | |||
} | |||
// search for trs of the group-list-table | // search for trs of the group-list-table | ||
var trs = document.evaluate("//tr | var trs = document.evaluate(".//tr", group_table, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); | ||
var regexp = /gid=(\d+)"/; | var regexp = /gid=(\d+)"/; | ||
Line 47: | Line 61: | ||
input.setAttribute('type', 'checkbox'); | input.setAttribute('type', 'checkbox'); | ||
input.setAttribute('id', 'toggle_gid_'+gid); | input.setAttribute('id', 'toggle_gid_'+gid); | ||
input.setAttribute(' | input.setAttribute('value', gid); | ||
input.addEventListener('click', toggle, false); | |||
td.appendChild(input); | td.appendChild(input); | ||
} else | } else | ||
Line 90: | Line 105: | ||
// finally add the function for the checkbox onclick-handler to the document | // finally add the function for the checkbox onclick-handler to the document | ||
function toggle(_gid) { | |||
var _gid = this.getAttribute('value'); | |||
for (var i=0; i < checkbox_names[_gid].length; i++) { | for (var i=0; i < checkbox_names[_gid].length; i++) { | ||
document.getElementsByName(checkbox_names[_gid][i])[0].checked = document.getElementById('toggle_gid_'+_gid).checked; | document.getElementsByName(checkbox_names[_gid][i])[0].checked = document.getElementById('toggle_gid_'+_gid).checked; | ||
Line 105: | Line 121: | ||
function decimal_vote() { | function decimal_vote() { | ||
// replace vote-dropdowns with textfields | // replace vote-dropdowns with textfields | ||
var selects = document.evaluate("//select[ | var selects = document.evaluate("//select[@name = 'votea.rate']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); | ||
for (var i = 0; i < selects.snapshotLength; i++) { | for (var i = 0; i < selects.snapshotLength; i++) { | ||
var textfield = document.createElement('input'); | var textfield = document.createElement('input'); | ||
Line 118: | Line 134: | ||
window.addEventListener("load", initialize(), false); | window.addEventListener("load", initialize(), false); | ||
})();</pre> | })(); </pre> |
Latest revision as of 01:27, 10 March 2015
// AniDB-Site-Enhancements: Full // - Select all files of a group // - Replace vote-dropdowns with textfields (enter integers from 100 to 1000) // // Version 20051210.01 // works with FF1.5 and greasemonkey 0.6.4 // Copyright (c) 2005, Lupin III. // Released under the GPL license // http://www.gnu.org/copyleft/gpl.html // // Thanks to // TechNiko for the webspace // visnu for some advice on speedups for long animelists // // ==UserScript== // @name AniDB-Site-Enhancer: Full // @namespace lupin_sanseis_scripts // @description selects all files of a release group, replaces vote dropdowns with textfields // @include http://anidb.info/perl-bin/animedb.pl?show=anime&* // ==/UserScript== (function() { // 2D-array containing all the checkbox names corresponding to a group checkbox_names = new Object(); function initialize() { // use '//' to disable unwanted functions group_selects(); decimal_vote(); } function group_selects () { // look up the grouplist table (using the bold "Group Info:" as an anchor, as it's fast to find) var group_table = document.evaluate("//b/text()[starts-with(.,'Group') and contains(., 'Info:')]/../../../..", document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue; // when css convert of page happens // var group_table = document.evaluate("//div[class="anime_group"]/table", document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue; // will want checking though... // if (group_table == null){ return; } // search for trs of the group-list-table var trs = document.evaluate(".//tr", group_table, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var regexp = /gid=(\d+)"/; // walk through all rows of the table for (var i=0; i < trs.snapshotLength; i++) { var tr = trs.snapshotItem(i); // create an adittional column to add to the end of the row var td = document.createElement("td"); if (match = regexp.exec(tr.innerHTML)) { // found a group-id, so create the subarray for the checkboxnames and the checkbox var gid = match[1]; checkbox_names[gid] = new Array(); var input = document.createElement('input'); input.setAttribute('type', 'checkbox'); input.setAttribute('id', 'toggle_gid_'+gid); input.setAttribute('value', gid); input.addEventListener('click', toggle, false); td.appendChild(input); } else if (tr.innerHTML.match(/Group Info:/i)) { td.setAttribute('bgcolor', '#b0b0b0'); td.appendChild(document.createTextNode('toggle all')); } tr.appendChild(td); } // if checkbox_names still contains no elements, it's no animelisting --> exit function var found = false; for (var gid in checkbox_names) { found = true; break; } if (!found) { return; } // walk through all checkboxes in the page // if the checkboxname is like madd.f.xyz, try to find the gid in the same table-row // and add the checkboxname to the corresponding array var checkboxes = document.evaluate("//input[@type='checkbox' and starts-with(@name, 'madd.f.')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var regexp = /gid=(\d+)/; for (var i=0; i < checkboxes.snapshotLength; i++) { var tr = checkboxes.snapshotItem(i).parentNode.parentNode; if (match = regexp.exec(tr.innerHTML)) { var gid = match[1]; if (checkbox_names[gid]) { checkbox_names[gid].push(checkboxes.snapshotItem(i).name); } } } // add a title attribute to the created checkboxes for (var gid in checkbox_names) { document.getElementById('toggle_gid_'+gid).setAttribute('title', 'Toggle all files of this anime-group ('+checkbox_names[gid].length+' files)'); document.getElementById('toggle_gid_'+gid).parentNode.appendChild(document.createTextNode('('+checkbox_names[gid].length+')')); } // expand the grouplist too when expanding all file-entries (change href of plus icon) var as = document.evaluate("//a[contains(@href, 'expandall') and .//*[contains(@title, 'all entries')]]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i=0; i < as.snapshotLength; i++) { as.snapshotItem(i).href += '&showallag=1'; } // finally add the function for the checkbox onclick-handler to the document function toggle(_gid) { var _gid = this.getAttribute('value'); for (var i=0; i < checkbox_names[_gid].length; i++) { document.getElementsByName(checkbox_names[_gid][i])[0].checked = document.getElementById('toggle_gid_'+_gid).checked; } if (document.getElementById('toggle_gid_'+_gid).checked) { alert('Selected ' + checkbox_names[_gid].length + ' files. Please check for correctness!'); } else { alert('Removed all checkmarks for this group!'); } } } function decimal_vote() { // replace vote-dropdowns with textfields var selects = document.evaluate("//select[@name = 'votea.rate']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0; i < selects.snapshotLength; i++) { var textfield = document.createElement('input'); textfield.setAttribute('type', 'text'); textfield.setAttribute('size', '25'); textfield.setAttribute('name', 'votea.rate'); textfield.setAttribute('value', 'vote from 100 to 1000'); selects.snapshotItem(i).parentNode.replaceChild(textfield, selects.snapshotItem(i)); } } window.addEventListener("load", initialize(), false); })();