109 lines
3.3 KiB
JavaScript
109 lines
3.3 KiB
JavaScript
/**
|
|
* AKSRT Share Data Builder
|
|
*
|
|
* Single source of truth for share payloads. Every share surface
|
|
* (dropdown links, copy, WeChat bridge, poster) resolves its data through
|
|
* window.AksrtShareData so no script assembles title/url/cover/qrcode on its
|
|
* own.
|
|
*
|
|
* Canonical payload shape:
|
|
* { title, url, desc, text, image, qrcode, author, date, siteName }
|
|
*
|
|
* Data is read from the nearest [data-share-*] context (falling back to
|
|
* #share-dropdown), then to OpenGraph/meta tags and document defaults.
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
(function () {
|
|
'use strict';
|
|
|
|
function metaContent(selectors) {
|
|
for (var i = 0; i < selectors.length; i += 1) {
|
|
var node = document.querySelector(selectors[i]);
|
|
var content = node ? node.getAttribute('content') : '';
|
|
if (content) return content;
|
|
}
|
|
return '';
|
|
}
|
|
|
|
function siteName() {
|
|
return (
|
|
metaContent(['meta[property="og:site_name"]']) ||
|
|
(document.querySelector('.site-title, .logo-text, .site-nav__logo') || {}).textContent ||
|
|
document.title ||
|
|
''
|
|
).trim();
|
|
}
|
|
|
|
/**
|
|
* Find the element that carries the share data attributes for a node.
|
|
*/
|
|
function context(node) {
|
|
var source = node && typeof node.closest === 'function'
|
|
? node.closest('[data-share-url], [data-share-title], [data-share-desc], [data-share-image], [data-aksrt-poster]')
|
|
: null;
|
|
return source || document.getElementById('share-dropdown');
|
|
}
|
|
|
|
/**
|
|
* Generate a QR data URL for a link, reusing the WeChat share encoder
|
|
* when available. Returns '' if no encoder is loaded.
|
|
*/
|
|
function qrcode(url) {
|
|
if (window.AksrtShare && typeof window.AksrtShare.buildQrDataUrl === 'function' && url) {
|
|
return window.AksrtShare.buildQrDataUrl(url, 200) || '';
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Resolve a canonical share payload for a triggering node.
|
|
*
|
|
* @param {Element} node Triggering element (button/link).
|
|
* @param {Object} [overrides] Optional explicit overrides.
|
|
* @returns {Object}
|
|
*/
|
|
function resolve(node, overrides) {
|
|
var ctx = context(node);
|
|
|
|
function attr(name) {
|
|
return (node && node.getAttribute && node.getAttribute(name)) ||
|
|
(ctx && ctx.getAttribute && ctx.getAttribute(name)) || '';
|
|
}
|
|
|
|
var url = attr('data-share-url') || window.location.href;
|
|
var payload = {
|
|
title: attr('data-share-title') || document.title,
|
|
url: url,
|
|
desc: attr('data-share-desc') || metaContent(['meta[property="og:description"]', 'meta[name="description"]']),
|
|
text: attr('data-share-text') || '',
|
|
image: attr('data-share-image') || metaContent(['meta[property="og:image"]']),
|
|
qrcode: attr('data-share-qrcode') || '',
|
|
author: attr('data-share-author') || '',
|
|
date: attr('data-share-date') || '',
|
|
siteName: attr('data-share-site') || siteName()
|
|
};
|
|
|
|
if (!payload.qrcode) {
|
|
payload.qrcode = qrcode(payload.url);
|
|
}
|
|
|
|
if (overrides && typeof overrides === 'object') {
|
|
Object.keys(overrides).forEach(function (key) {
|
|
if (overrides[key] !== undefined && overrides[key] !== null && overrides[key] !== '') {
|
|
payload[key] = overrides[key];
|
|
}
|
|
});
|
|
}
|
|
|
|
return payload;
|
|
}
|
|
|
|
window.AksrtShareData = {
|
|
resolve: resolve,
|
|
qrcode: qrcode,
|
|
siteName: siteName
|
|
};
|
|
})();
|