Files
wordpress-theme-aksrt/assets/js/share-data-builder.js
T
kate522 259dbdbe04 feat(nav): rewrite top header to zibll 1:1 DOM/CSS/JS contract
Replace hybrid site-nav/drawer shell with zibll navbar-top layouts 1/2/3,
body.mobile-navbar-show drawer, wired NavWalker + aksrt_menu_options meta,
nav_folding/chevron, VIP switches, and SPA/PHP schema parity. No dual-class
compat paths.
2026-07-22 11:18:34 +08:00

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, .navbar-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
};
})();