1 | module.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 |