analytics/assets/js/plausible.js
2019-12-18 16:06:01 +08:00

127 lines
3.9 KiB
JavaScript

(function(window, plausibleHost){
'use strict';
try {
function setCookie(name,value) {
var date = new Date();
date.setTime(date.getTime() + (3*365*24*60*60*1000)); // 3 YEARS
var expires = "; expires=" + date.toUTCString();
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function pseudoUUIDv4() {
var d = new Date().getTime();
if (typeof performance !== 'undefined' && typeof performance.now === 'function'){
d += performance.now(); //use high-precision timer if available
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
function ignore(reason) {
console.warn('[Plausible] Ignoring event because ' + reason);
}
function getUrl() {
return window.location.protocol + '//' + window.location.hostname + window.location.pathname + window.location.search;
}
function getUserData() {
var oldUid = getCookie('nm_uid')
var userData = JSON.parse(getCookie('plausible_user'))
if (userData) {
userData.new_visitor = false
userData.user_agent = decodeURIComponent(userData.user_agent)
userData.referrer = decodeURIComponent(userData.referrer)
return userData
} else if (oldUid) {
return {
uid: oldUid,
new_visitor: false,
user_agent: window.navigator.userAgent,
referrer: window.document.referrer,
screen_width: window.innerWidth
}
} else {
return {
uid: pseudoUUIDv4(),
new_visitor: true,
user_agent: window.navigator.userAgent,
referrer: window.document.referrer,
screen_width: window.innerWidth
}
}
}
function setUserData(payload) {
setCookie('plausible_user', JSON.stringify({
uid: payload.uid,
user_agent: encodeURIComponent(payload.user_agent),
referrer: encodeURIComponent(payload.referrer),
screen_width: payload.screen_width
}))
}
function trigger(eventName) {
if (/localhost$/.test(window.location.hostname)) return ignore('website is running locally');
if (window.location.protocol === 'file:') return ignore('website is running locally');
if (window.document.visibilityState === 'prerender') return ignore('document is prerendering');
var payload = getUserData()
payload.name = eventName
payload.url = getUrl()
var request = new XMLHttpRequest();
request.open('POST', plausibleHost + '/api/event', true);
request.setRequestHeader('Content-Type', 'text/plain');
request.send(JSON.stringify(payload));
request.onreadystatechange = function() {
if (request.readyState == XMLHttpRequest.DONE) {
setUserData(payload)
}
}
}
function onUnload() {
var userData = getUserData()
navigator.sendBeacon(plausibleHost + '/api/unload', JSON.stringify({uid: userData.uid}));
}
function page() {
trigger('pageview')
window.addEventListener('unload', onUnload, false);
}
var his = window.history
if (his.pushState) {
var originalFn = his['pushState']
his.pushState = function() {
originalFn.apply(this, arguments)
page();
}
}
page()
} catch (e) {
new Image().src = plausibleHost + '/api/error?message=' + encodeURIComponent(e.message);
}
})(window, BASE_URL);