blob: 8b4c890786a7e56c8e08f5a5c3b9f4accaddadeb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
this.documentMetadata = (function() {
function findSiteName() {
let el = document.querySelector("meta[property~='og:site_name'][content]");
if (el) {
return el.getAttribute("content");
}
// nytimes.com uses this property:
el = document.querySelector("meta[name='cre'][content]");
if (el) {
return el.getAttribute("content");
}
return null;
}
function getOpenGraph() {
const openGraph = {};
// If you update this, also update _OPENGRAPH_PROPERTIES in shot.js:
const forceSingle = `title type url`.split(" ");
const openGraphProperties = `
title type url image audio description determiner locale site_name video
image:secure_url image:type image:width image:height
video:secure_url video:type video:width image:height
audio:secure_url audio:type
article:published_time article:modified_time article:expiration_time article:author article:section article:tag
book:author book:isbn book:release_date book:tag
profile:first_name profile:last_name profile:username profile:gender
`.split(/\s+/g);
for (const prop of openGraphProperties) {
let elems = document.querySelectorAll(
`meta[property~='og:${prop}'][content]`
);
if (forceSingle.includes(prop) && elems.length > 1) {
elems = [elems[0]];
}
let value;
if (elems.length > 1) {
value = [];
for (const elem of elems) {
const v = elem.getAttribute("content");
if (v) {
value.push(v);
}
}
if (!value.length) {
value = null;
}
} else if (elems.length === 1) {
value = elems[0].getAttribute("content");
}
if (value) {
openGraph[prop] = value;
}
}
return openGraph;
}
function getTwitterCard() {
const twitterCard = {};
// If you update this, also update _TWITTERCARD_PROPERTIES in shot.js:
const properties = `
card site title description image
player player:width player:height player:stream player:stream:content_type
`.split(/\s+/g);
for (const prop of properties) {
const elem = document.querySelector(
`meta[name='twitter:${prop}'][content]`
);
if (elem) {
const value = elem.getAttribute("content");
if (value) {
twitterCard[prop] = value;
}
}
}
return twitterCard;
}
return function documentMetadata() {
const result = {};
result.docTitle = document.title;
result.siteName = findSiteName();
result.openGraph = getOpenGraph();
result.twitterCard = getTwitterCard();
return result;
};
})();
null;
|