Skip to content
Open
2 changes: 1 addition & 1 deletion collections/familysearchjson.js
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ function parseFamilySearchJSON(htmlstring, familymembers, relation) {
spouse = jsonrel[x]["parent1"]["id"];
image = jsonrel[x]["parent1"]["portraitUrl"] || "";
}
if (spouse !== "") {
if (spouse) {
var data = parseFSJSONUnion(jsonrel[x]["event"]);
var valid = processFamilySearchJSON(spouse, "spouse", famid, image, data);
if (valid) {
Expand Down
248 changes: 143 additions & 105 deletions collections/myheritage.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ registerCollection({
return url;
},
"collectionMatch": function(url) {
return (startsWithMH(url,"person-") || startsWithMH(url,"member-") || startsWithMH(url,"site-family-tree-"));
return (startsWithMH(url,"person-") || startsWithMH(url,"member-") || startsWithMH(url,"site-family-tree-") || startsWithMH(url,"profile-"));
},
"parseData": function(url) {
if (startsWithHTTP(url,"https://www.myheritage.com/site-family-tree-") && !url.endsWith("-info")) {
Expand All @@ -20,6 +20,10 @@ registerCollection({
if (url.contains("#!profile-")) {
focusURLid = url.substring(url.indexOf('#!profile-') + 10);
focusURLid = focusURLid.substring(0, focusURLid.indexOf('-'));
} else if (url.contains("/profile-")) {
focusURLid = url.substring(url.indexOf('/profile-') + 9)
focusURLid = focusURLid.substring(0, focusURLid.indexOf("/"))
focusURLid = focusURLid.substring(focusURLid.indexOf('-') + 1); // <Site-Id>-<Profile-Id>
} else if (url.contains("rootIndivudalID=")) {
focusURLid = getParameterByName('rootIndivudalID', url);
} else {
Expand All @@ -37,8 +41,8 @@ registerCollection({
this.parseProfileData = "";
return;
}
var parsed = $(request.source.replace(/<img[^>]*>/ig, ""));
var fperson = parsed.find("span.FL_LabelxxLargeBold");
const parsed = $(request.source.replace(/<img[^>]*>/ig, ""));
const fperson = parsed.find("span.FL_LabelxxLargeBold");
focusname = fperson.text();
focusrange = "";
},
Expand All @@ -47,40 +51,55 @@ registerCollection({

function parseMyHeritage(htmlstring, familymembers, relation) {
relation = relation || "";
var splitdata = htmlstring.replace(/<img/ig, "<gmi").split("Immediate family");
var parsed = $(splitdata[0]);
while (splitdata.length > 2) {
splitdata[1] += splitdata.pop();
}
var aboutdata = "";
var profiledata = {};
var focusdaterange = "";
var fperson = parsed.find("span.FL_LabelxxLargeBold");
var focusperson = fperson.text();
const parsed = $(htmlstring.replace(/<img/ig, "<gmi"));
// let splitdata = htmlstring.replace(/<img/ig, "<gmi").split("Immediate family");
// let parsed = $(splitdata[0]);
// while (splitdata.length > 2) {
// splitdata[1] += splitdata.pop();
// }

const header = parsed.find("div.profile_page_header");

const aboutdata = "";
const profiledata = {};
const focusdaterange = "";

let fperson = header.find("div.person_name");

const focusperson = fperson.text();
$("#readstatus").html(escapeHtml(focusperson));
var genderval = "unknown";
if (htmlstring.contains("PK_Silhouette PK_SilhouetteSize192 PK_Silhouette_S_192_F_A_LTR") ||
htmlstring.contains("PK_Silhouette PK_SilhouetteSize150 PK_Silhouette_S_150_F_A_LTR") ||
htmlstring.contains("PK_Silhouette PK_SilhouetteSize96 PK_Silhouette_S_96_F_A_LTR")) {
genderval = "female";
} else if (htmlstring.contains("PK_Silhouette PK_SilhouetteSize192 PK_Silhouette_S_192_M_A_LTR") ||
htmlstring.contains("PK_Silhouette PK_SilhouetteSize150 PK_Silhouette_S_150_M_A_LTR") ||
htmlstring.contains("PK_Silhouette PK_SilhouetteSize96 PK_Silhouette_S_96_M_A_LTR")) {
genderval = "male";
} else if (focusperson.contains("(born")) {
genderval = "female";
} else if (isPartner(relation.title)) {
genderval = reverseGender(focusgender);
let genderval = "unknown";

let photo_element = parsed.find(".profile_page_header").find(".person_photo").find(".profile_photo_element.svg_silhouette")
if (photo_element.length === 1) {
if (photo_element[0].classList.contains("svg_silhouette_F_A")) {
genderval = "female";
} else if (photo_element[0].classList.contains("svg_silhouette_M_A")) {
genderval = "male";
}
}

if (!genderval) {
if (focusperson.contains("(born")) {
genderval = "female";
} else if (isPartner(relation.title)) {
genderval = reverseGender(focusgender);
}
}
var imagedata = parsed.find("#profilePhotoImg");

const photoWrapper = header.find(".profile_photo_wrapper");

const imagedata = photoWrapper.find(".profile_photo_element.actual_photo");
if (exists(imagedata[0])) {
var imglink = $(imagedata[0]).attr('src');
if (exists(imglink[0])) {
var thumb = imglink;
var image = thumb;
const styleAttribute = $(photoWrapper[0]).attr('style');

if (exists(styleAttribute[0])) {
const imglink = styleAttribute.match(/url\((.*?)\)/)[1].replace(/['"]/g, '');
const thumb = imglink;
let image = thumb;
if (!thumb.endsWith("spacer.gif")) {
if (htmlstring.contains("profilePhotoFullUrl")) {
var imgtemp = htmlstring.match(/profilePhotoFullUrl = '(.*?)';/i);
const imgtemp = htmlstring.match(/profilePhotoFullUrl = '(.*?)';/i);
if (exists(imgtemp) && imgtemp.length > 1) {
image = imgtemp[1];
}
Expand All @@ -101,60 +120,74 @@ function parseMyHeritage(htmlstring, familymembers, relation) {
if (focusdaterange !== "") {
profiledata["daterange"] = focusdaterange;
}
var burialdtflag = false;
var buriallcflag = false;
var deathdtflag = false;

fperson = parsed.find('tr');
for (var i = 0; i < fperson.length; i++) {
var row = $(fperson[i]).find('td.FL_LabelBold');
if (row.length > 0) {
var rowtitle = $(row[0]).text().toLowerCase();
var dateval = $(row[0]).next('td').text().trim();
var eventval = $(fperson[i]).find('span.map_callout_link');

data = [];
if (exists(dateval)) {
if (dateval.indexOf("(") !== -1) {
dateval = dateval.substring(0, dateval.indexOf("("));
}
dateval = cleanDate(dateval);
if (dateval !== "") {
data.push({date: dateval});
}
const burialdtflag = false;
let buriallcflag = false;
let deathdtflag = false;

const events = header.find(".events").find(".event")
const eventsDic = []

events.each(function(index, element) {
const label = element.getElementsByClassName("label")[0].textContent.replaceAll(":", "").trim();
const dateElements = element.getElementsByClassName("date");
let date = null;
if (dateElements && dateElements.length > 0) {
date = dateElements[0].textContent;
}

const placeElements = element.getElementsByClassName("place");
let place = null;
if (placeElements && placeElements.length > 0) {
place = placeElements[0].textContent;
}

eventsDic.push({label: label, date: date, place: place});
});

eventsDic.forEach((value) => {

let label = value.label.toLowerCase();
let date = value.date;
let place = value.place;

data = [];
if (exists(date)) {
if (date.indexOf("(") !== -1) {
date = date.substring(0, date.indexOf("("));
}
if (exists(eventval) && eventval.length > 0) {
var eventlocation = $(eventval).text().trim();
if (eventlocation !== "") {
data.push({id: geoid, location: eventlocation});
geoid++;
}
date = cleanDate(date);
if (date !== "") {
data.push({date: date});
}
if (rowtitle.startsWith("born")) {
if (!$.isEmptyObject(data)) {
profiledata["birth"] = data;
}
} else if (rowtitle.startsWith("died")) {
if (!$.isEmptyObject(data)) {
if (exists(getDate(data))) {
deathdtflag = true;
}
profiledata["death"] = data;
}
} else if (rowtitle.startsWith("burial")) {
if (!$.isEmptyObject(data)) {
if (exists(getLocation(data))) {
buriallcflag = true;
}
profiledata["burial"] = data;
}
if (exists(place) && place.length > 0) {
data.push({id: geoid, location: place});
geoid++;
}
if (label.startsWith("born")) {
if (!$.isEmptyObject(data)) {
profiledata["birth"] = data;
}
} else if (label.startsWith("died")) {
if (!$.isEmptyObject(data)) {
if (exists(getDate(data))) {
deathdtflag = true;
}
} else if (rowtitle.startsWith("baptism") || rowtitle.startsWith("christening")) {
if (!$.isEmptyObject(data)) {
profiledata["baptism"] = data;
profiledata["death"] = data;
}
} else if (label.startsWith("burial")) {
if (!$.isEmptyObject(data)) {
if (exists(getLocation(data))) {
buriallcflag = true;
}
profiledata["burial"] = data;
}
} else if (label.startsWith("baptism") || label.startsWith("christening")) {
if (!$.isEmptyObject(data)) {
profiledata["baptism"] = data;
}
}
}
});

profiledata["name"] = focusperson;
profiledata["status"] = relation.title;
Expand All @@ -164,43 +197,43 @@ function parseMyHeritage(htmlstring, familymembers, relation) {
var famid = 0;
}

var siblingparents = [];
if (exists(splitdata[1])) {
splitdata = splitdata[1].split("FirstColumn");
parsed = $(splitdata[0]);
const siblingparents = [];
const immediateFamily = parsed.find("div.immediate_family");

if (exists(immediateFamily[0])) {
// ---------------------- Family Data --------------------
fperson = parsed.find('a.FL_LinkBold');
for (var i = 0; i < fperson.length; i++) {
var member = $(fperson[i]);
var title = member.next('br').next('span.FL_LabelDimmed').text().trim();
title = title.replace("His", "").replace("Her", "").trim().toLowerCase();
var url = member.attr("href");
var itemid = "";
const relatives = immediateFamily[0].getElementsByClassName("family_relative")

for (let value of relatives) {
const name = value.getElementsByClassName("relative_name")[0].textContent.trim();
const relationship = value.getElementsByClassName("relative_relationship")[0].textContent.replace("His", "").replace("Her", "").trim().toLowerCase();
const years = value.getElementsByClassName("relative_years")[0].textContent.trim();
const url = ""; // How to get URLs?
let itemid;
if (url.contains("#!profile-")) {
itemid = url.substring(url.indexOf('#!profile-') + 10);
itemid = itemid.substring(0, itemid.indexOf('-'));
} else if (url.contains("rootIndivudalID=")) {
itemid = getParameterByName('rootIndivudalID', url);
} else {
itemid = decodeURIComponent(url.substring(url.indexOf('-') + 1));
itemid = itemid.substring(0, itemid.indexOf('_'));
itemid = itemid.substring(focusURLid.indexOf('-') + 1, focusURLid.indexOf('/'))
}

if (exists(title)) {
if (exists(relationship)) {
if (familymembers) {
if (isParent(title) || isSibling(title) || isChild(title) || isPartner(title)) {
var name = member.text().trim();
if (isParent(relationship) || isSibling(relationship) || isChild(relationship) || isPartner(relationship)) {
if (exists(url)) {
if (!exists(alldata["family"][title])) {
alldata["family"][title] = [];
if (!exists(alldata["family"][relationship])) {
alldata["family"][relationship] = [];
}
var subdata = {name: name, title: title};
const subdata = {name: name, title: relationship};
subdata["url"] = url;
subdata["itemId"] = itemid;
subdata["profile_id"] = famid;
if (isParent(title)) {
if (isParent(relationship)) {
parentlist.push(itemid);
} else if (isPartner(title)) {
} else if (isPartner(relationship)) {
myhspouse.push(famid);
}
unionurls[famid] = itemid;
Expand All @@ -209,15 +242,15 @@ function parseMyHeritage(htmlstring, familymembers, relation) {
}
}
} else if (isChild(relation.title)) {
if (isParent(title)) {
if (isParent(relationship)) {
if (focusURLid !== itemid) {
childlist[relation.proid] = $.inArray(itemid, unionurls);
profiledata["parent_id"] = $.inArray(itemid, unionurls);
break;
return;
}
}
} else if (isSibling(relation.title)) {
if (isParent(title)) {
if (isParent(relationship)) {
siblingparents.push(itemid);
}
} else if (isPartner(relation.title)) {
Expand All @@ -228,6 +261,7 @@ function parseMyHeritage(htmlstring, familymembers, relation) {
}
}
}

if (exists(relation.title) && isSibling(relation.title) && siblingparents.length > 0) {
profiledata["halfsibling"] = !recursiveCompare(parentlist, siblingparents);
}
Expand Down Expand Up @@ -257,8 +291,12 @@ function getMyHeritageFamily(famid, url, subdata) {
url: url,
variable: subdata
}, function (response) {
var arg = response.variable;
var person = parseMyHeritage(response.source, false, {"title": arg.title, "proid": arg.profile_id, "itemId": arg.itemId});
const arg = response.variable;
let person = parseMyHeritage(response.source, false, {
"title": arg.title,
"proid": arg.profile_id,
"itemId": arg.itemId
});
if (person === "") {
familystatus.pop();
return;
Expand Down