UNPKG

4.67 kBJavaScriptView Raw
1module.exports = (eleventyConfig, pluginNamespace) => {
2 eleventyConfig.namespace(pluginNamespace, () => {
3 eleventyConfig.addShortcode("metagen", (data) => {
4 if (data) {
5 const metadata = `<meta charset="utf-8">
6 <meta http-equiv="X-UA-Compatible" content="IE=edge">
7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 ${handleDnsResolution(data)}
9 <title>${data.title}</title>
10 <meta name="author" content="${data.name}">
11 <meta name="title" content="${data.title}">
12 <meta name="description" content="${data.desc}">
13 <meta name="generator" content="${data.generator}">\n`;
14 const openGraph = `${data.comments ? `${(data.og_comment ? `<!-- ${data.og_comment} -->` : '<!-- Open Graph -->')}` : ''}
15 <meta property="og:type" content="${isDef(data.type, 'website')}">
16 <meta property="og:url" content="${data.url}">
17 <meta property="og:site_name" content="${data.site_name}">
18 <meta property="og:locale" content="${isDef(data.locale, 'en_US')}">
19 <meta property="og:title" content="${data.og_title || data.title}">
20 <meta property="og:description" content="${data.og_desc || data.desc}">
21 <meta property="og:image" content="${data.img}">
22 <meta property="og:image:alt" content="${data.img_alt}">
23 <meta property="og:image:width" content="${data.img_width}">
24 <meta property="og:image:height" content="${data.img_height}">\n`;
25 const twitterCard = `${data.comments ? `${(data.twitter_comment ? `<!-- ${data.twitter_comment} -->` : '<!-- Twitter -->')}` : ''}
26 <meta ${isDef(data.attr_name, 'name')}="twitter:card" content="${isDef(data.twitter_card_type, 'summary')}">
27 <meta ${isDef(data.attr_name, 'name')}="twitter:site" content="@${data.twitter_handle}">
28 ${isDef(data.twitter_card_type, undefined, ["summary_large_image", `<meta ${isDef(data.attr_name, 'name')}="twitter:creator" content="@${isDef(data.creator_handle, data.twitter_handle)}">`])}
29 <meta ${isDef(data.attr_name, 'name')}="twitter:url" content="${data.url}">
30 <meta ${isDef(data.attr_name, 'name')}="twitter:title" content="${data.twitter_title || data.title}">
31 <meta ${isDef(data.attr_name, 'name')}="twitter:description" content="${data.twitter_desc || data.desc}">
32 <meta ${isDef(data.attr_name, 'name')}="twitter:image" content="${data.img}">
33 <meta ${isDef(data.attr_name, 'name')}="twitter:image:alt" content="${data.img_alt}">\n`;
34 const canonical = `<link rel="canonical" href="${data.url}">`;
35
36 function isDef(prop, fallback, c=null) {
37 if (c && typeof c == 'object' && c[0] == 'summary_large_image') {
38 return prop == c[0] ? c[1] : fallback
39 }
40 return prop ? prop : fallback;
41 }
42
43 function getDnsTags(data, rel) {
44 if (typeof data == "string") {
45 return `<link rel="${rel}" href="${data}">`
46 } else if (typeof data == "object") {
47 let tags = "";
48 data.forEach(link => {
49 tags += "\n" + `<link rel="${rel}" href="${link}">`;
50 });
51 return tags;
52 }
53 }
54
55 function handleDnsResolution(data) {
56 let tags = "";
57 if (data.preconnect) {
58 tags += "\n" + getDnsTags(data.preconnect, "preconnect");
59 }
60 if (data.dns_prefetch) {
61 tags += "\n" + getDnsTags(data.dns_prefetch, "dns-prefetch");
62 }
63 return tags;
64 }
65
66 const output = metadata.concat(openGraph, twitterCard, canonical).split("\n");
67 const validTags = output.filter(tag => tag.includes("undefined") === false);
68 const cleanOutput = validTags.join("\n").replace(/^\s+|[,]$/gm, "");
69
70 return cleanOutput;
71 } else {
72 console.error("No data was added into the meta generator")
73 return "";
74 }
75 });
76 });
77};
\No newline at end of file