diff options
Diffstat (limited to 'feed/note-page.js')
| -rw-r--r-- | feed/note-page.js | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/feed/note-page.js b/feed/note-page.js index 3145f14..89b2f43 100644 --- a/feed/note-page.js +++ b/feed/note-page.js @@ -126,6 +126,12 @@ function nameOf(data, pk) { try { const m = JSON.parse(p.content); return { name: m.display_name || m.name || null, picture: m.picture || null }; } catch { return {}; } } +// index.html carries the site's own share tags between these markers; a +// rendered page drops them for its own (crawlers take the first of a pair). +// The site's picture stays as the stand-in for a page that has none. +export const siteTagsOut = (html) => html.replace(/<!--site-tags-->[\s\S]*?<!--\/site-tags-->\n?/, ''); +export const siteImage = (origin) => (origin ? origin + '/og-image.png' : ''); + // The app's index.html with the thread and its preview tags in the head. export function renderNotePage(html, data, ref, origin) { const focus = [data.root, ...data.replies].find((e) => e.id === ref.id) || data.root; @@ -141,13 +147,13 @@ export function renderNotePage(html, data, ref, origin) { desc ? `<meta property="og:description" content="${esc(desc)}">` : '', desc ? `<meta name="description" content="${esc(desc)}">` : '', origin ? `<meta property="og:url" content="${esc(origin + '/' + (ref.path || ''))}">` : '', - image ? `<meta property="og:image" content="${esc(image)}">` : '', - `<meta name="twitter:card" content="${image && image !== who.picture ? 'summary_large_image' : 'summary'}">`, + image || siteImage(origin) ? `<meta property="og:image" content="${esc(image || siteImage(origin))}">` : '', + `<meta name="twitter:card" content="${!image || image !== who.picture ? 'summary_large_image' : 'summary'}">`, // the author's face starts downloading with the page, not after the app boots who.picture && /^https:\/\//.test(who.picture) ? `<link rel="preload" as="image" href="${esc(who.picture)}">` : '', `<script type="application/json" id="boot-thread">${scriptJson(data)}</script>`, ].filter(Boolean).join('\n'); - let out = html.replace(/<title>[^<]*<\/title>/i, `<title>${esc(title)}</title>`); + let out = siteTagsOut(html).replace(/<title>[^<]*<\/title>/i, `<title>${esc(title)}</title>`); out = out.includes('</head>') ? out.replace('</head>', head + '\n</head>') : head + out; return out; } |
