Function bodies 11 total
getTimeGreeting function · javascript · L218-L225 (8 LOC)assets/js/country-popover.js
function getTimeGreeting(timezone) {
const now = new Date();
const hour = timezone ? new Date(now.toLocaleString('en-US', { timeZone: timezone })).getHours() : now.getHours();
if (hour < 12) return 'Good morning';
if (hour < 18) return 'Good afternoon';
return 'Good evening';
}isReturningVisitor function · javascript · L228-L230 (3 LOC)assets/js/country-popover.js
function isReturningVisitor() {
return localStorage.getItem('hasVisited') === 'true';
}markAsVisited function · javascript · L233-L235 (3 LOC)assets/js/country-popover.js
function markAsVisited() {
localStorage.setItem('hasVisited', 'true');
}getDeviceType function · javascript · L238-L247 (10 LOC)assets/js/country-popover.js
function getDeviceType() {
const ua = navigator.userAgent;
if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {
return 'tablet';
}
if (/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {
return 'mobile';
}
return 'desktop';
}getReferrerInfo function · javascript · L250-L262 (13 LOC)assets/js/country-popover.js
function getReferrerInfo() {
const referrer = document.referrer;
if (!referrer) return null;
if (referrer.includes('linkedin.com')) return 'LinkedIn';
if (referrer.includes('github.com')) return 'GitHub';
if (referrer.includes('twitter.com') || referrer.includes('x.com')) return 'Twitter/X';
if (referrer.includes('facebook.com')) return 'Facebook';
if (referrer.includes('google.com')) return 'Google';
if (referrer.includes('bing.com')) return 'Bing';
return null;
}getBrowserLanguage function · javascript · L265-L267 (3 LOC)assets/js/country-popover.js
function getBrowserLanguage() {
return navigator.language || navigator.userLanguage;
}detectCountryAndContext function · javascript · L270-L295 (26 LOC)assets/js/country-popover.js
function detectCountryAndContext() {
// TEST MODE: Uncomment to test specific countries/cities
// Remove sessionStorage flag first: sessionStorage.removeItem('countryPopoverShown')
// const testConfig = {
// country_code: 'JP', // Try: US, GB, CN, AU, ES, FR, JP, etc.
// timezone: 'Asia/Tokyo',
// city: 'Tokyo' // Set to null to test country-only
// };
// showPopover(testConfig.country_code, testConfig.timezone, testConfig.city);
// return;
// Using ipapi.co - free tier allows 1000 requests/day
fetch('https://ipapi.co/json/')
.then(response => response.json())
.then(data => {
const country = data.country_code || 'default';
const timezone = data.timezone || null;
const city = data.city || null;
showPopover(country, timezone, city);
})
.catch(error => {
console.log('Could not detect country, showing default message');
showPopover('default', null, null);
})Repobility (the analyzer behind this table) · https://repobility.com
sanitizeText function · javascript · L298-L302 (5 LOC)assets/js/country-popover.js
function sanitizeText(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}showPopover function · javascript · L305-L397 (93 LOC)assets/js/country-popover.js
function showPopover(countryCode, timezone, city) {
const config = countryMessages[countryCode] || countryMessages['default'];
const isReturning = isReturningVisitor();
const deviceType = getDeviceType();
const referrer = getReferrerInfo();
const language = getBrowserLanguage();
const isFullPage = config.fullPage || false;
// Build personalized greeting
let greeting = getTimeGreeting(timezone);
// Enhance greeting based on context
if (isReturning) {
greeting = 'Welcome back';
}
// Customize title with greeting
let title;
if (city && !isReturning) {
// Sanitize city name to prevent XSS
const sanitizedCity = sanitizeText(city);
title = `${config.greeting} Thanks for visiting from ${sanitizedCity} and checking out my resume!`;
} else if (isReturning) {
title = `${greeting}!`;
} else {
// Country only (no city)
title = `${config.greeting} Thanks for visiting from ${config.countrystemWord function · javascript · L49-L448 (400 LOC)assets/js/lunr/lunr-gr.js
function stemWord(w) {
var stem;
var suffix;
var firstch;
var origword = w;
test1 = new Boolean(true);
if(w.length < 4) {
return w;
}
var re;
var re2;
var re3;
var re4;
re = /(.*)(ΦΑΓΙΑ|ΦΑΓΙΟΥ|ΦΑΓΙΩΝ|ΣΚΑΓΙΑ|ΣΚΑΓΙΟΥ|ΣΚΑΓΙΩΝ|ΟΛΟΓΙΟΥ|ΟΛΟΓΙΑ|ΟΛΟΓΙΩΝ|ΣΟΓΙΟΥ|ΣΟΓΙΑ|ΣΟΓΙΩΝ|ΤΑΤΟΓΙΑ|ΤΑΤΟΓΙΟΥ|ΤΑΤΟΓΙΩΝ|ΚΡΕΑΣ|ΚΡΕΑΤΟΣ|ΚΡΕΑΤΑ|ΚΡΕΑΤΩΝ|ΠΕΡΑΣ|ΠΕΡΑΤΟΣ|ΠΕΡΑΤΑ|ΠΕΡΑΤΩΝ|ΤΕΡΑΣ|ΤΕΡΑΤΟΣ|ΤΕΡΑΤΑ|ΤΕΡΑΤΩΝ|ΦΩΣ|ΦΩΤΟΣ|ΦΩΤΑ|ΦΩΤΩΝ|ΚΑΘΕΣΤΩΣ|ΚΑΘΕΣΤΩΤΟΣ|ΚΑΘΕΣΤΩΤΑ|ΚΑΘΕΣΤΩΤΩΝ|ΓΕΓΟΝΟΣ|ΓΕΓΟΝΟΤΟΣ|ΓΕΓΟΝΟΤΑ|ΓΕΓΟΝΟΤΩΝ)$/;
if(re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
w = stem + step1list[suffix];
test1 = false;
}
re = /^(.+?)(ΑΔΕΣ|ΑΔΩΝ)$/;
if(re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
w = stem;
reg1 = /(ΟΚ|ΜΑΜ|ΜΑΝ|ΜΠΑΜΠ|ΠΑΤΕΡ|ΓΙΑΓΙ|ΝΤΑΝΤ|ΚΥΡ|ΘΕΙ|ΠΕΘΕΡ)$/;
if(!(reg1.test(w))) {
w = w + "ΑΔ";
}
}
re2 = /^(.+?)(ΕΔΕΣ|ΕΔΩΝ)$/;
if(re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
w = stem;
echeck function · javascript · L26-L56 (31 LOC)assets/js/plugins/jquery.greedy-navigation.js
function check() {
// Get instant state
availableSpace = $vlinks.width() - $btn.width();
numOfVisibleItems = $vlinks.children().length;
requiredSpace = breakWidths[numOfVisibleItems - 1];
// There is not enough space
if (requiredSpace > availableSpace) {
$vlinks
.children()
.last()
.prependTo($hlinks);
numOfVisibleItems -= 1;
check();
// There is more than enough space
} else if (availableSpace > breakWidths[numOfVisibleItems]) {
$hlinks
.children()
.first()
.appendTo($vlinks);
numOfVisibleItems += 1;
check();
}
// Update the button accordingly
$btn.attr("count", numOfItems - numOfVisibleItems);
if (numOfVisibleItems === numOfItems) {
$btn.addClass("hidden");
} else {
$btn.removeClass("hidden");
}
}