Sort a book's tag in alphabetical order
// ==UserScript==
// @name LibraryThing alphabetize book tags
// @namespace https://greasyfork.org/en/users/11592-max-starkenburg
// @description Sort a book's tag in alphabetical order
// @include http*://*librarything.tld/addbooks
// @include http*://*librarything.tld/catalog_bottom.php*
// @include http*://*librarything.tld/work/*
// @version 1
// @grant none
// ==/UserScript==
var url = document.URL;
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var field, tags;
// Reused sort function
function sortTags(tagList) {
return tagList.split(", ").sort(function(a,b) {
return a.localeCompare(b);
}).join(", ");
}
// "Add books" pages
if (url.indexOf("/addbooks") > -1) {
var observer = new MutationObserver(function(mutations, observer) {
var fields = document.getElementsByName("form_tags");
for (var i=0; i<fields.length; i++) {
editableTags = fields[i].value;
fields[i].value = sortTags(editableTags);
}
var briefs = document.getElementsByClassName("briefinfo");
for (var l=0; l<briefs.length; l++) {
displayTagsSpan = briefs[l].getElementsByTagName("span")[0];
displayTagsSpan.textContent = sortTags(displayTagsSpan.textContent);
}
});
observer.observe(document.getElementById("bookframe"), {
childList: true
});
}
// Catalog pages
if (url.indexOf("/catalog_bottom.php") > -1) {
var tagsHeader = document.getElementById("head_tags");
if (tagsHeader) {
var tagsRow = [].indexOf.call(tagsHeader.parentNode.children, tagsHeader);
var rows = document.getElementById("lt_catalog_list").getElementsByTagName("tr");
for (var j=0; j<rows.length; j++) {
cell = rows[j].getElementsByTagName("td")[tagsRow];
cell.innerHTML = sortTags(cell.innerHTML);
cell.addEventListener("dblclick", function(event) {
field = event.target.getElementsByTagName("textarea")[0];
tags = field.value;
field.value = sortTags(tags);
});
}
}
}
// Book pages
if (url.indexOf("/work/") > -1) {
// Edit book page
if (url.indexOf("/edit/") > -1) {
field = document.getElementById("form_tags");
tags = field.value;
field.value = sortTags(tags);
var displayTags = field.nextSibling.getElementsByTagName("div")[1];
var displayTagsText = displayTags.textContent;
var currentTagsLabel = displayTagsText.split(": ")[0];
displayTagsText = displayTagsText.substring(displayTagsText.indexOf(": ") + 1);
displayTags.textContent = currentTagsLabel + ": " + sortTags(displayTagsText);
// Book details page
} else if (url.indexOf("/details/") > -1) {
field = document.getElementById("bookedit_tags");
tags = field.innerHTML;
field.innerHTML = sortTags(tags);
// Main work page (which sometimes just has a URL like, e.g. /work/NNNN/NNNN)
} else {
var tagEdit = document.getElementById("tagEditSpan");
var tagTrigger = tagEdit.getElementsByTagName("a")[0];
tagTrigger.addEventListener("click", function(event) {
field = event.target.parentNode.parentNode.getElementsByTagName("textarea")[0];
tags = field.value;
field.value = sortTags(tags);
});
var tagEditList = tagEdit.parentNode.getElementsByTagName("span")[0];
tagEditList.innerHTML = sortTags(tagEditList.innerHTML);
}
}