// ==UserScript==
// @name URLs Need Titles
// @namespace UNT
// @description When you paste a URL to a friend, it is useful if it contains the title of the page. This script adds these missing titles for common websites using # part of URL. In other words, it turns non-semantic URLs into semantic URLs!
// @version 1.3.3
// @include http://*/*
// @include https://*/*
// @grant none
// ==/UserScript==
// For example, this script will change this address:
//
// http://www.imdb.com/title/tt1155592/
//
// into this address:
//
// http://www.imdb.com/title/tt1155592/#Man_on_Wire_(2008)
//
// which is far more useful to paste to other people.
var overwriteExistingHash = true;
var rules = [
/* An example rule:
{
changeTitle: true / false, Some of the rules do not change the URL,
but change the page title instead. This
can be useful for bookmarking.
hostMatch: "youtube.TLD", All subdomains will be accepted, e.g.
somewhere.youtube.com. TLD will match one
or two toplevel domain elements, e.g.
"youtube.ath.cx" or "youtube.net".
pathMatch: "/watch", This regex will be wrapped with ^..$ so use
.* at either end for wildcards. Note that
path does not include the search part of
the URL, "?q=squash&type=image". Filtering
on this part of the URL may be added later.
If left blank all paths will be accepted.
getTitle: function(){...} A function which returns a sensible title
for this page. If left blank will just
grab document.title.
}
*/
{
hostMatch: "youtube.TLD",
pathMatch: "/watch",
getTitle: function(){
return document.title.replace(/ - YouTube$/,'').replace(/^\([\d]*\) /, '');
}
},
{
hostMatch: "xkcd.TLD",
pathMatch: ".*[0-9]+/",
getTitle: function(){ return document.title.replace(/^xkcd: /,''); }
},
{
hostMatch: "imdb.TLD",
pathMatch: ".*title.*",
getTitle: function(){ return document.title.replace(/ - IMDb/,''); }
},
{
hostMatch: "pouet.net",
pathMatch: ".*",
getTitle: function(){ return document.title.replace(/ :: pouët.net$/,''); }
},
{
hostMatch: "userscripts.org",
pathMatch: "/scripts/show/.*",
getTitle: function(){ return document.title.replace(" for Greasemonkey",''); }
},
{
hostMatch: "bbc.co.uk",
pathMatch: "/news/.*",
getTitle: function(){ return document.title.replace(/BBC News - /,''); }
},
{
hostMatch: "imgur.com",
pathMatch: "/.+",
getTitle: function(){ return document.title.replace(/ - Imgur/,''); }
},
{
hostMatch: "9gag.com",
pathMatch: "/gag/.*",
getTitle: function(){ return document.title.replace(/ - 9GAG$/,''); }
},
{
changeUrl: true,
changeTitle: true,
hostMatch: "codepen.io",
pathMatch: "/..*", /* Not the front page */
getTitle: function(){
// They stopped putting " - CodePen" at the end of their titles. We shall put it back, to aid bookmarking.
if (!document.title.match(/CodePen$/)) {
document.title = document.title + ' - CodePen';
}
return document.title.replace(/ - CodePen$/,'');
}
},
{
hostMatch: "unrealadmin.org",
getTitle: function(){ return document.title.replace(/ - The Unreal Admins Page .*/,''); }
},
{
hostMatch: "vim.org",
getTitle: function(){
// When viewing user profile page
if (document.location.pathname.indexOf("/profile.php") >= 0) {
var username = document.evaluate("//td[string(.)='user name']/following-sibling::*",document,null,6,null).snapshotItem(0).textContent; // maybe I should start using jquery
return username+"'s profile";
}
// Otherwise (good when viewing a script page)
return document.title.replace(/ - .*/,'');
}
},
// This was not updating the URL, but the window title, to include the repo description.
// Mid 2016: They are actually doing this now, so this script is no longer needed.
//{
// changeTitle: true,
// hostMatch: "github.com",
// pathMatch: "/[^/]*/[^/]*/*",
// getTitle: function(){
// //var repoDescriptionElems = document.getElementsByClassName("repository-description");
// // Late 2015
// var repoDescriptionElems = document.getElementsByClassName("repository-meta-content");
// if (repoDescriptionElems) {
// var repoDescription = repoDescriptionElems[0].textContent.trim();
// // For a while their titles were "<author_name>/<repo_name> <weird-dot> GitHub" but right now they just have the repo path.
// document.title = document.title.replace(/(\s+[^ ]*\s+GitHub|)$/, '') + " - "+repoDescription;
// }
// return null;
// }
//},
{
changeTitle: true,
hostMatch: "engineers.sg",
pathMatch: "/video/.*",
getTitle: function(){
var titleElement = document.querySelector('h4');
if (titleElement && titleElement.textContent) {
document.title = titleElement.textContent + " - Engineers.SG";
}
return null;
}
}
];
function check() {
if (document.location.hash && !overwriteExistingHash) {
return;
}
rules.forEach(checkRule);
}
function checkRule(rule) {
var hostRegexp = '(^|\\.)' + rule.hostMatch.replace(/\.TLD$/, "(\\.[^.]*$|\\.[^.]*\\.[^.]*$)") + '$';
if (document.location.host.match(hostRegexp)) {
if (rule.pathMatch) {
var pathRegexp = '^' + rule.pathMatch + '$';
if (!document.location.pathname.match(pathRegexp)) {
return false;
}
}
var newTitle = ( rule.getTitle ? rule.getTitle() : document.title );
if (newTitle == '' || newTitle == null) {
console.log("Failed to get new title for "+document.location+" from "+document.title);
}
setTitle(newTitle);
}
}
function setTitle(title) {
if (title) {
// "_"s paste better into IRC, since " "s become "%20"s which are hard to read. The second and third parts trim "_"s and newlines from the start and end of the string.
title = title.replace(/ /g,'_').replace(/^[\r\n_]*/,'').replace(/[\r\n_]*$/,'');
var strippedHref = document.location.href.replace(/#.*/,'');
if (history.replaceState) {
// Does not cause YouTube to reload the page
history.replaceState(undefined, document.title, strippedHref + '#' + title);
} else {
// Does not alter browser history
document.location.replace(strippedHref + '#' + title);
// Was sometimes a better alternative when Chrome was crashing
//document.location.hash = title;
}
}
}
// 2010/11: Waiting a bit can prevent crashing (e.g. YouTube in Chrome).
setTimeout(check,5000);
// vim: ts=4 sw=4 expandtab