Skip to content
102 changes: 74 additions & 28 deletions collections/billiongraves.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,19 @@ registerCollection({
}
},
"loadPage": function(request) {
var parsed = $(request.source.replace(/<img[^>]*>/ig, ""));
focusname = parsed.find("h1[itemprop='name']").text();
let focus = parsed.find("h1[itemprop='name']").next("div")
if (focus.length > 0) {
focusrange = focus.text()
var data = getData(request.source);
focusname = data.name;

var dates = []
if (exists(data.birthDate)){
dates.push(parseDate(data.birthDate).year);
}
if (exists(data.deathDate)){
dates.push(parseDate(data.deathDate).year);
}

if (dates.length > 0) {
focusrange = dates.join("-")
}
},
"parseProfileData": parseBillionGraves
Expand All @@ -34,13 +42,23 @@ function parseBillionGraves(htmlstring, familymembers, relation) {
$("#experimentalmessage").show();
relation = relation || "";
var parsed = $(htmlstring.replace(/<img[^>]*>/ig,""));

var data = getData(htmlstring);

var dates = []
if (exists(data.birthDate)){
dates.push(parseDate(data.birthDate).year);
}
if (exists(data.deathDate)){
dates.push(parseDate(data.deathDate).year);
}

var focusdaterange = "";
let focus = parsed.find("h1[itemprop='name']").next("div")
if (focus.length > 0) {
focusdaterange = focus.text()
if (dates.length > 0) {
focusdaterange = dates.join("-")
}
var focusperson = parsed.find("h1[itemprop='name']").text();


var focusperson = data.name;
var genderval = "unknown";
if (focusperson.contains("(born")) {
genderval = "female";
Expand All @@ -66,38 +84,47 @@ function parseBillionGraves(htmlstring, familymembers, relation) {
if (exists(abouttemp)) {
aboutdata = $($.parseHTML(abouttemp.replace(/<br>/g, "\n"))).text().trim();
}
profiledata = addEvent(profiledata, "birth", parsed.find("time[itemprop='birthDate']").text(), "");
profiledata = addEvent(profiledata, "death", parsed.find("time[itemprop='deathDate']").text(), "");
cemname = parsed.find(".CemeteryName").text();
cemeteryplace = parsed.find(".CemeteryAddress").html();

if (exists(data.birthDate)) {
profiledata = addEvent(profiledata, "birth", displayDate(parseDate(data.birthDate)), '');
}

if (exists(data.deathDate)) {
profiledata = addEvent(profiledata, "death", displayDate(parseDate(data.deathDate)), "");
}
cemname = data.deathPlace.name;
cemeteryplace = data.deathPlace.address;
let locsplit = []
if (exists(cemeteryplace)) {
let cemsplit = cemeteryplace.replace('"', "").split("<br>");
for (var i = 0; i < cemsplit.length; i++) {
if (cemsplit[i].trim() !== "") {
locsplit[i] = cemsplit[i].trim();
const cemAddressTypes = Object.keys(data.deathPlace.address).filter((key) => { return !key.startsWith("@")})
for (const cemAddressType in cemAddressTypes) {
if (cemeteryplace[cemAddressType[i]] && cemeteryplace[cemAddressType[i]].trim() !== "") {
locsplit[i] = cemeteryplace[cemAddressType[i]].trim();
}
}
const addressComponents = ['addressLocality', 'addressRegion', 'addressCountry'];
addressComponents.forEach(component => {
if (cemeteryplace[component] && cemeteryplace[component].trim() !== "") {
locsplit.push(cemeteryplace[component].trim());
}
});
}
locsplit.unshift(cemname);
const cemetery = locsplit.join(", ");
profiledata = addEvent(profiledata, "burial", "", cemetery.trim());

// ---------------------- Profile Continued --------------------
parsed = $(htmlstring.replace(/<img/ig,"<gmi"));

profiledata["alive"] = false; //assume deceased
const imagedata = parsed.find("gmi");

for (var i = 0; i < imagedata.length; i++) {
let src = $(imagedata[i]).attr( "src" );
if (src.startsWith("https://s3.amazonaws.com/images.billiongraves.com/headstones/images")) {
// profiledata["image"] = src;
// profiledata["thumb"] = src.replace("/images/", "/thumbnails/");
// Haven't figure out how to allow image loading
}
if (exists(data.image)) {
const imageUrl = data.image;
profiledata["thumb"] = imageUrl;
profiledata["image"] = imageUrl.replace("&p1=128&p2=0", "");
}

// Get Image, to get a full image, ommit the last '&p1=128&p2=0' from:
// e.g. https://billiongraves.com/api/1.4/selectimage?tkn=med12345&p1=128&p2=0

const imagecredit = parsed.find("amp-img[alt='Photographer']");
if (exists(imagecredit)) {
profiledata["imagecredit"] = $(imagecredit[0]).next().find("h2").text();
Expand All @@ -115,6 +142,25 @@ function parseBillionGraves(htmlstring, familymembers, relation) {
return profiledata;
}

function getData(htmlstring) {
return JSON.parse(htmlstring.split('<script type="application/ld+json">')[1].split('</script>')[0]);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eljeffeg this is the part I really dislike. I couldn't fetch <script> content via jQuery, so try to take a look if it's possible.

}

function displayDate(vardate) {
let formattedDate = ""
if ("day" in vardate && "month" in vardate && "year" in vardate) {
let date = moment({year: vardate["year"], month: vardate["month"] - 1, day: vardate["day"]});
formattedDate = date.format("MMMM D, YYYY");
} else if ("month" in vardate && "year" in vardate) {
let date = moment({year: vardate["year"], month: vardate["month"] - 1})
formattedDate = date.format("MMMM YYYY");
} else if ("year" in vardate) {
let date = moment({year: vardate["year"]});
formattedDate = date.format("YYYY");
}
return formattedDate;
}

function addEvent(profiledata, event, dateval, eventlocation) {
data = []
if (exists(dateval) && dateval.contains(" (")) {
Expand Down
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"short_name": "__MSG_appShortName__",
"description": "__MSG_appDesc__",
"default_locale": "en",
"version": "4.10.23",
"version": "4.10.24",
"icons": { "16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png" },
Expand Down