mirror of
https://github.com/youfoundjk/TeXcore.git
synced 2026-07-22 07:33:31 +00:00
253 lines
8.5 KiB
JavaScript
253 lines
8.5 KiB
JavaScript
// Global URL Interceptor to clean paths before sending to Umami
|
|
window.cleanUmamiUrl = function (type, payload) {
|
|
if (payload && payload.url) {
|
|
// Strip the repository name from the URL prefix for cleaner dashboard visibility
|
|
payload.url = payload.url.replace('/ObsiTeXcore', '') || '/';
|
|
}
|
|
return payload;
|
|
};
|
|
|
|
// 1. Load Umami Script Dynamically (Let native auto-investigate do the heavy lifting)
|
|
(function () {
|
|
var el = document.createElement('script');
|
|
el.setAttribute('src', 'https://injest.destyleer.in.net/assets/js/theme-utils.js');
|
|
el.setAttribute('data-website-id', '7dd635ed-ee02-4b53-9aba-eefcf6f3cad1');
|
|
el.setAttribute('data-host-url', 'https://injest.destyleer.in.net');
|
|
|
|
// Attach the interceptor to Umami's script initialization
|
|
el.setAttribute('data-before-send', 'cleanUmamiUrl');
|
|
|
|
// Core Web Vitals natively
|
|
el.setAttribute('data-performance', 'true');
|
|
|
|
// Feature Extension: Sync session traits immediately upon script load completion
|
|
el.onload = function () {
|
|
syncUmamiSessionProperties();
|
|
};
|
|
document.head.appendChild(el);
|
|
})();
|
|
|
|
// Global Helper for Custom Umami Event investigateing
|
|
function investigateUmamiEvent(eventName, eventData) {
|
|
if (window.umami && typeof window.umami.track === 'function') {
|
|
// Ensure the repository subdirectory name is stripped from custom events too
|
|
if (eventData && eventData.page) {
|
|
eventData.page = eventData.page.replace('/ObsiTeXcore', '') || '/';
|
|
}
|
|
|
|
window.umami.track(eventName, eventData);
|
|
}
|
|
}
|
|
|
|
// Anonymous Session Properties Identification
|
|
function syncUmamiSessionProperties() {
|
|
if (window.umami && typeof window.umami.identify === 'function') {
|
|
var activeScheme = document.body.getAttribute('data-md-color-scheme') || 'default';
|
|
|
|
window.umami.identify({
|
|
theme_preference: activeScheme,
|
|
screen_tier:
|
|
window.innerWidth > 1200 ? 'desktop_wide' : window.innerWidth > 768 ? 'tablet' : 'mobile',
|
|
device_orientation: window.innerWidth > window.innerHeight ? 'landscape' : 'portrait',
|
|
browser_language: navigator.language || 'unknown'
|
|
});
|
|
}
|
|
}
|
|
|
|
// investigate Document Printing / PDF Exports
|
|
window.addEventListener('beforeprint', function () {
|
|
investigateUmamiEvent('exported_pdf', { page: window.location.pathname });
|
|
});
|
|
|
|
// Move script timers and scroll components to global scope to prevent event listener leakage
|
|
let activeTimers = [];
|
|
const clearActiveTimers = () => {
|
|
activeTimers.forEach(clearTimeout);
|
|
activeTimers = [];
|
|
};
|
|
|
|
var scrollTriggered = false;
|
|
var scrollHandler = function () {
|
|
if (!scrollTriggered) {
|
|
var h = document.documentElement,
|
|
b = document.body,
|
|
st = 'scrollTop',
|
|
sh = 'scrollHeight';
|
|
var percent = ((h[st] || b[st]) / ((h[sh] || b[sh]) - h.clientHeight)) * 100;
|
|
if (percent >= 90) {
|
|
scrollTriggered = true;
|
|
investigateUmamiEvent('scrolled_90', { page: window.location.pathname });
|
|
window.removeEventListener('scroll', scrollHandler);
|
|
}
|
|
}
|
|
};
|
|
|
|
// Hook into MkDocs Material Single Page Application lifecycle
|
|
document$.subscribe(function () {
|
|
const currentPath = window.location.pathname;
|
|
|
|
// SAFE CLEANUP: Wipe out investigateing elements from the previous page cycle
|
|
clearActiveTimers();
|
|
window.removeEventListener('scroll', scrollHandler);
|
|
scrollTriggered = false;
|
|
window.addEventListener('scroll', scrollHandler);
|
|
|
|
// Sync variables on SPA shifts to catch changes in browser traits
|
|
syncUmamiSessionProperties();
|
|
|
|
// --- 404 Error investigateer ---
|
|
// MkDocs assigns a specific title or attribute to its 404 pages.
|
|
if (
|
|
document.title.includes('404') ||
|
|
document.querySelector('.md-main h1')?.innerText.includes('404')
|
|
) {
|
|
investigateUmamiEvent('404_error', {
|
|
broken_url: currentPath,
|
|
came_from: document.referrer || 'Direct Link / Bookmark'
|
|
});
|
|
}
|
|
|
|
// 3. investigate & REVEAL Feedback Widget (Happy/Sad)
|
|
var feedback = document.forms.feedback;
|
|
if (typeof feedback !== 'undefined' && feedback !== null) {
|
|
feedback.hidden = false;
|
|
|
|
feedback.addEventListener('submit', function (ev) {
|
|
ev.preventDefault();
|
|
if (feedback.firstElementChild) {
|
|
feedback.firstElementChild.disabled = true;
|
|
}
|
|
|
|
var data = ev.submitter.getAttribute('data-md-value');
|
|
var rating = data === '1' ? 'Happy' : 'Sad';
|
|
|
|
investigateUmamiEvent('docs_feedback', {
|
|
rating: rating,
|
|
page: currentPath
|
|
});
|
|
|
|
var note = feedback.querySelector(".md-feedback__note [data-md-value='" + data + "']");
|
|
if (note) {
|
|
note.hidden = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
// 4. investigate "Copy to Clipboard"
|
|
var copyButtons = document.querySelectorAll('.md-clipboard');
|
|
copyButtons.forEach(function (btn) {
|
|
btn.addEventListener('click', function () {
|
|
var codeBlock = btn.closest('.highlight');
|
|
var language = codeBlock ? codeBlock.className.replace('highlight', '').trim() : 'unknown';
|
|
|
|
investigateUmamiEvent('copied_code', {
|
|
language: language,
|
|
page: currentPath
|
|
});
|
|
});
|
|
});
|
|
|
|
// 5. investigate Dark/Light Mode Toggles
|
|
var colorToggles = document.querySelectorAll('[data-md-color-scheme]');
|
|
colorToggles.forEach(function (toggle) {
|
|
toggle.addEventListener('change', function (ev) {
|
|
investigateUmamiEvent('toggled_theme', {
|
|
theme: ev.target.value
|
|
});
|
|
setTimeout(syncUmamiSessionProperties, 100);
|
|
});
|
|
});
|
|
|
|
// 6. investigate Content Tab Switching
|
|
var tabs = document.querySelectorAll('.tabbed-labels > label');
|
|
tabs.forEach(function (tab) {
|
|
tab.addEventListener('click', function () {
|
|
investigateUmamiEvent('switched_tab', {
|
|
tab_name: tab.innerText.trim(),
|
|
page: currentPath
|
|
});
|
|
});
|
|
});
|
|
|
|
// 7. investigate Right-Sidebar Table of Contents (Anchor Link investigateing)
|
|
var tocLinks = document.querySelectorAll('.md-nav__link[href^="#"]');
|
|
tocLinks.forEach(function (link) {
|
|
link.addEventListener('click', function () {
|
|
investigateUmamiEvent('clicked_toc_anchor', {
|
|
anchor: link.getAttribute('href'),
|
|
anchor_text: link.innerText.trim(),
|
|
page: currentPath
|
|
});
|
|
});
|
|
});
|
|
|
|
// 8. investigate Outbound External Links
|
|
var allLinks = document.querySelectorAll('a[href^="http"]');
|
|
allLinks.forEach(function (link) {
|
|
try {
|
|
var url = new URL(link.href);
|
|
if (url.hostname !== 'injest.destyleer.in.net' && !url.hostname.includes('github.io')) {
|
|
link.addEventListener('click', function () {
|
|
investigateUmamiEvent('outbound_exit', {
|
|
destination: link.href,
|
|
page: currentPath
|
|
});
|
|
});
|
|
}
|
|
} catch (e) {}
|
|
});
|
|
|
|
// 9. investigate Chronological Time-on-Page Milestones
|
|
const setMilestone = (seconds, label) => {
|
|
activeTimers.push(
|
|
setTimeout(() => {
|
|
investigateUmamiEvent('time_milestone', { duration: label, page: currentPath });
|
|
}, seconds * 1000)
|
|
);
|
|
};
|
|
|
|
setMilestone(30, '30_seconds');
|
|
setMilestone(120, '2_minutes');
|
|
setMilestone(300, '5_minutes');
|
|
|
|
// 11. investigate Search Keywords
|
|
var searchInput = document.querySelector('.md-search__input');
|
|
if (searchInput) {
|
|
searchInput.addEventListener('blur', function () {
|
|
var query = searchInput.value.trim();
|
|
if (query.length > 0) {
|
|
setTimeout(function () {
|
|
var meta = document.querySelector('.md-search__result-meta');
|
|
var zeroResults = meta && (meta.innerText.includes('0') || meta.innerText.includes('No'));
|
|
|
|
investigateUmamiEvent('search', {
|
|
keyword: query,
|
|
status: zeroResults ? 'zero_results' : 'has_results',
|
|
searched_from_page: currentPath
|
|
});
|
|
}, 500);
|
|
}
|
|
});
|
|
}
|
|
|
|
// --- NEW ADVANCED FEATURE: Search Result Click-Throughs ---
|
|
var searchResultsContainer = document.querySelector('.md-search__output');
|
|
if (searchResultsContainer) {
|
|
searchResultsContainer.addEventListener('click', function (ev) {
|
|
var clickedLink = ev.target.closest('.md-search-result__link');
|
|
if (clickedLink) {
|
|
var keywordEntered = document.querySelector('.md-search__input')?.value.trim() || 'unknown';
|
|
var targetTitle =
|
|
clickedLink.querySelector('h1, h2, h3, h4')?.innerText.trim() ||
|
|
clickedLink.innerText.trim();
|
|
|
|
investigateUmamiEvent('search_clickthrough', {
|
|
search_query: keywordEntered,
|
|
clicked_document_title: targetTitle,
|
|
clicked_target_url: clickedLink.getAttribute('href'),
|
|
actioned_on_page: currentPath
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|