Last active
February 1, 2024 08:11
-
-
Save GuyKh/46f79a9c9809c45290856f98dffd3ed5 to your computer and use it in GitHub Desktop.
MyHeritage Names Research to Profile link
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name MyHeritage Names Research to Profile link | |
// @namespace https://www.myheritage.com/ | |
// @version 0.4.1 | |
// @description Jump from MyHeritage Research directly to profiles/sites | |
// @author Guy Khmelnitsky | |
// @match https://www.myheritage.com/research* | |
// @grant none | |
// ==/UserScript== | |
const urlRegex = /([\w+]+:\/\/)?([\w\d-]+\.)*[\w-]+[.:]\w+([\/?=&#.]?[\w-]+)*\/?/gm | |
const returnUrlRecordRegex = /(record-[0-9]+-[0-9]+-[0-9]+-[0-9]+)/gm | |
window.addEventListener('load', function() { | |
setTimeout(() => { | |
'use strict'; | |
String.prototype.formatUnicorn = String.prototype.formatUnicorn || | |
function () { | |
"use strict"; | |
var str = this.toString(); | |
if (arguments.length) { | |
var t = typeof arguments[0]; | |
var key; | |
var args = ("string" === t || "number" === t) ? | |
Array.prototype.slice.call(arguments) | |
: arguments[0]; | |
for (key in args) { | |
str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]); | |
} | |
} | |
return str; | |
}; | |
const parseItemId = function(input) { | |
const split = input.split("-"); | |
const siteId = parseInt(split[0]); | |
const multiplier = parseInt(split[1]); | |
const personId = parseInt(split[2]); | |
const fullPersonId = 1000000*multiplier +personId; | |
return [siteId, fullPersonId]; | |
} | |
const getMyHeritageFamilyLinkFromItemId = function(hrefLink, link) { | |
let parsedItemId; | |
if (hrefLink.startsWith("javascript:") && hrefLink.includes("itemId=")){ | |
parsedItemId = parseItemId(hrefLink.split("itemId=")[1].split("'")[0]); | |
} else { | |
const urlParams = new URLSearchParams(hrefLink.split("?")[1]); | |
if (!urlParams.has("itemId")) { | |
return null; | |
} | |
parsedItemId = parseItemId(urlParams.get("itemId")); | |
} | |
var siteId = parsedItemId[0]; | |
var fullPersonId = parsedItemId[1]; | |
const record_name = link.getElementsByClassName("record_name_text")[0].innerText; | |
const firstName = record_name.split(" ")[0].toLowerCase().trim(); | |
const lastName = record_name.substring(firstName.length + 1).replace(" ", "_").toLowerCase().trim(); | |
const name = (firstName + "_" + lastName).replaceAll("/", "_"); | |
return "https://www.myheritage.com/person-{personId}_{siteId}_{siteId}/{name}".formatUnicorn({"name": name, "personId": fullPersonId, "siteId": siteId}); | |
} | |
const getMyHeritageFamilyLinkFromReturnUrl = function(hrefLink, link) { | |
hrefLink = decodeURIComponent(hrefLink); | |
let parsedReturnUrl = ["", ""]; | |
hrefLink.match(returnUrlRecordRegex).forEach((url) => { | |
url = url.replace("record-1-", ""); | |
parsedReturnUrl = parseItemId(url) | |
}) | |
var siteId = parsedReturnUrl[0]; | |
var fullPersonId = parsedReturnUrl[1]; | |
const record_name = link.getElementsByClassName("record_name_text")[0].innerText; | |
const firstName = record_name.split(" ")[0].toLowerCase().trim(); | |
const lastName = record_name.substring(firstName.length + 1).replace(" ", "_").toLowerCase().trim(); | |
const name = (firstName + "_" + lastName).replaceAll("/", "_"); | |
return "https://www.myheritage.com/person-{personId}_{siteId}_{siteId}/{name}".formatUnicorn({"name": name, "personId": fullPersonId, "siteId": siteId}); | |
} | |
const record_cards = document.getElementsByClassName("record_card"); | |
Array.from(record_cards).forEach((record_card) => { | |
let link; | |
let myHeritageFamilyLink = ""; | |
if (record_card.getElementsByClassName("collection_name")[0].innerText.startsWith("MyHeritage Family Trees")) { | |
link = record_card.getElementsByClassName("record_title")[0].getElementsByTagName("a")[0]; | |
const hrefLink = link.getAttribute("href"); | |
if (hrefLink.includes("itemId=")){ | |
myHeritageFamilyLink = getMyHeritageFamilyLinkFromItemId(hrefLink, link); | |
} else if (hrefLink.includes("return_url=")){ | |
myHeritageFamilyLink = getMyHeritageFamilyLinkFromReturnUrl(hrefLink, link); | |
} else { | |
const thumbnail = record_card.getElementsByClassName("record_thumbnail"); | |
let siteId; | |
if (thumbnail.length === 1) { | |
thumbnail[0].getAttribute("style").match(urlRegex).forEach((url) => { | |
let parts = url.split("/"); | |
siteId = parts[6] | |
}) | |
myHeritageFamilyLink = "https://www.myheritage.com/site-{siteId}/".formatUnicorn({"siteId": siteId}); | |
} | |
} | |
} else if (record_card.getElementsByClassName("collection_name")[0].innerText.startsWith("MyHeritage Family Sites")) { | |
link = record_card.getElementsByClassName("record_title")[0].getElementsByTagName("a")[0]; | |
const hrefLink = link.getAttribute("href"); | |
const urlParams = new URLSearchParams(hrefLink.split("?")[1]); | |
const siteId = parseInt(urlParams.get("itemId")); | |
myHeritageFamilyLink = "https://www.myheritage.com/site-{siteId}/".formatUnicorn({"siteId": siteId}); | |
} | |
if (myHeritageFamilyLink) { | |
link.href = myHeritageFamilyLink; | |
record_card.replaceWith(record_card.cloneNode(true)); | |
} | |
}); | |
}, 2000); | |
}, false) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment