mirror of
https://github.com/Shik3i/KoalaSync.git
synced 2026-07-27 12:29:35 +00:00
feat(website): add build-time minification and optimize meta descriptions
This commit is contained in:
+93
-2
@@ -6,6 +6,82 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// Minify CSS: strips comments, collapses whitespace, removes trailing semicolons
|
||||
function minifyCSS(code) {
|
||||
return code
|
||||
.replace(/\/\*[\s\S]*?\*\//g, '')
|
||||
.replace(/\s*([{}:;,])\s*/g, '$1')
|
||||
.replace(/\s+/g, ' ')
|
||||
.replace(/;\}/g, '}')
|
||||
.trim();
|
||||
}
|
||||
|
||||
// Minify JS: state-machine that tracks string context so
|
||||
// // inside URLs (https://) inside strings is never mistaken for a comment.
|
||||
function minifyJS(code) {
|
||||
var out = '';
|
||||
var inSingle = false, inDouble = false, inTemplate = false;
|
||||
var templateBrace = 0;
|
||||
var i = 0;
|
||||
|
||||
while (i < code.length) {
|
||||
var ch = code[i];
|
||||
var next = code[i + 1] || '';
|
||||
|
||||
// --- Escape handling (must come before string toggle) ---
|
||||
if (ch === '\\' && (inSingle || inDouble || inTemplate)) {
|
||||
out += ch + next;
|
||||
i += 2;
|
||||
continue;
|
||||
}
|
||||
|
||||
// --- String toggle ---
|
||||
if (!inDouble && !inTemplate && ch === "'") { inSingle = !inSingle; out += ch; i++; continue; }
|
||||
if (!inSingle && !inTemplate && ch === '"') { inDouble = !inDouble; out += ch; i++; continue; }
|
||||
if (!inSingle && !inDouble) {
|
||||
if (ch === '`' && !inTemplate) { inTemplate = true; templateBrace = 0; out += ch; i++; continue; }
|
||||
if (inTemplate && ch === '`' && templateBrace === 0) { inTemplate = false; out += ch; i++; continue; }
|
||||
}
|
||||
|
||||
// --- Template interpolation depth tracking ---
|
||||
if (inTemplate && !inSingle && !inDouble) {
|
||||
if (ch === '$' && next === '{') { templateBrace++; out += ch + next; i += 2; continue; }
|
||||
if (ch === '}' && templateBrace > 0) { templateBrace--; out += ch; i++; continue; }
|
||||
}
|
||||
|
||||
// --- Inside a string / template literal → output as-is ---
|
||||
if (inSingle || inDouble || inTemplate) { out += ch; i++; continue; }
|
||||
|
||||
// --- Outside strings: handle comments ---
|
||||
if (ch === '/' && next === '/') {
|
||||
while (i < code.length && code[i] !== '\n') i++;
|
||||
out += '\n';
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if (ch === '/' && next === '*') {
|
||||
i += 2;
|
||||
while (i < code.length - 1) {
|
||||
if (code[i] === '*' && code[i + 1] === '/') { i += 2; break; }
|
||||
if (code[i] === '\n') out += '\n';
|
||||
i++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
out += ch;
|
||||
i++;
|
||||
}
|
||||
|
||||
// Collapse horizontal whitespace (preserve newlines)
|
||||
return out
|
||||
.replace(/[^\S\n]+/g, ' ')
|
||||
.replace(/^ +/gm, '')
|
||||
.replace(/ +$/gm, '')
|
||||
.replace(/\n{3,}/g, '\n\n')
|
||||
.trim();
|
||||
}
|
||||
|
||||
// Helper to recursively copy directories
|
||||
function copyDirSync(src, dest) {
|
||||
fs.mkdirSync(dest, { recursive: true });
|
||||
@@ -18,6 +94,7 @@ function copyDirSync(src, dest) {
|
||||
if (entry.isDirectory()) {
|
||||
copyDirSync(srcPath, destPath);
|
||||
} else {
|
||||
// Binary assets (images, etc.) are copied as-is
|
||||
fs.copyFileSync(srcPath, destPath);
|
||||
}
|
||||
}
|
||||
@@ -105,8 +182,22 @@ function compile() {
|
||||
const srcPath = path.join(websiteDir, file);
|
||||
const destPath = path.join(wwwDir, file);
|
||||
if (fs.existsSync(srcPath)) {
|
||||
fs.copyFileSync(srcPath, destPath);
|
||||
console.log(`Copied: ${file}`);
|
||||
if (file.endsWith('.css')) {
|
||||
const raw = fs.readFileSync(srcPath, 'utf8');
|
||||
const minified = minifyCSS(raw);
|
||||
fs.writeFileSync(destPath, minified, 'utf8');
|
||||
const saved = ((raw.length - minified.length) / raw.length * 100).toFixed(0);
|
||||
console.log(`Minified: ${file} (-${saved}%)`);
|
||||
} else if (file.endsWith('.js')) {
|
||||
const raw = fs.readFileSync(srcPath, 'utf8');
|
||||
const minified = minifyJS(raw);
|
||||
fs.writeFileSync(destPath, minified, 'utf8');
|
||||
const saved = ((raw.length - minified.length) / raw.length * 100).toFixed(0);
|
||||
console.log(`Minified: ${file} (-${saved}%)`);
|
||||
} else {
|
||||
fs.copyFileSync(srcPath, destPath);
|
||||
console.log(`Copied: ${file}`);
|
||||
}
|
||||
} else {
|
||||
console.warn(`Warning: Static file ${file} not found.`);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"LANG_TOGGLE_TEXT": "EN",
|
||||
|
||||
"META_TITLE": "KoalaSync | Netflix, YouTube & jedes Video mit Freunden synchronisieren",
|
||||
"META_DESCRIPTION": "Schaue Netflix, YouTube, Twitch und jedes HTML5-Video perfekt synchronisiert mit Freunden. Kostenlose, quelloffene Browser-Erweiterung für Chrome und Firefox. Keine Anmeldung erforderlich.",
|
||||
"META_DESCRIPTION": "Schaue Netflix, YouTube, Twitch und jedes HTML5-Video synchron mit Freunden. Kostenlose, quelloffene Browser-Erweiterung. Keine Anmeldung erforderlich.",
|
||||
"OG_TITLE": "KoalaSync | Netflix, Emby, Jellyfin & fast jedes Video mit Freunden synchronisieren",
|
||||
"OG_DESCRIPTION": "Schaue Netflix, Emby, Jellyfin, YouTube, Twitch und fast jedes HTML5-Video perfekt synchronisiert. Quelloffene, datenschutzfreundliche Browser-Erweiterung für Chrome und Firefox.",
|
||||
"TWITTER_TITLE": "KoalaSync | Netflix, Emby, Jellyfin & fast jedes Video mit Freunden synchronisieren – Browser-Erweiterung",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"LANG_TOGGLE_TEXT": "EN",
|
||||
|
||||
"META_TITLE": "KoalaSync | Sincroniza Netflix, YouTube y cualquier video con amigos",
|
||||
"META_DESCRIPTION": "Mira Netflix, YouTube, Twitch y cualquier video HTML5 en perfecta sincronización con amigos. Extensión de navegador gratuita y de código abierto para Chrome y Firefox. No se requiere registro.",
|
||||
"META_DESCRIPTION": "Mira Netflix, YouTube, Twitch y cualquier video HTML5 en perfecta sincronización con amigos. Extensión de navegador gratuita y de código abierto. Sin registro.",
|
||||
"OG_TITLE": "KoalaSync | Sincroniza Netflix, Emby, Jellyfin y casi cualquier video con amigos",
|
||||
"OG_DESCRIPTION": "Mira Netflix, Emby, Jellyfin, YouTube, Twitch y casi cualquier video HTML5 en perfecta sincronización. Extensión de navegador de código abierto y respetuosa con la privacidad para Chrome y Firefox.",
|
||||
"TWITTER_TITLE": "KoalaSync | Sincroniza Netflix, Emby, Jellyfin y casi cualquier video con amigos – Extensión de navegador",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"LANG_TOGGLE_TEXT": "EN",
|
||||
|
||||
"META_TITLE": "KoalaSync | Synchronisez Netflix, YouTube et n'importe quelle vidéo avec vos amis",
|
||||
"META_DESCRIPTION": "Regardez Netflix, YouTube, Twitch et n'importe quelle vidéo HTML5 en parfaite synchronisation avec vos amis. Extension de navigateur gratuite et open-source pour Chrome et Firefox. Aucune inscription requise.",
|
||||
"META_DESCRIPTION": "Regardez Netflix, YouTube, Twitch et des vidéos HTML5 en synchro avec vos amis. Extension de navigateur gratuite et open-source. Aucune inscription requise.",
|
||||
"OG_TITLE": "KoalaSync | Synchronisez Netflix, Emby, Jellyfin et presque toutes les vidéos avec vos amis",
|
||||
"OG_DESCRIPTION": "Regardez Netflix, Emby, Jellyfin, YouTube, Twitch et presque n'importe quelle vidéo HTML5 en parfaite synchronisation. Extension de navigateur open-source et respectueuse de la vie privée pour Chrome et Firefox.",
|
||||
"TWITTER_TITLE": "KoalaSync | Synchronisez Netflix, Emby, Jellyfin et presque toutes les vidéos avec vos amis – Extension de navigateur",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"LANG_TOGGLE_TEXT": "EN",
|
||||
|
||||
"META_TITLE": "KoalaSync | Sincronize Netflix, YouTube e qualquer vídeo com amigos",
|
||||
"META_DESCRIPTION": "Assista à Netflix, YouTube, Twitch e qualquer vídeo HTML5 em perfeita sincronia com amigos. Extensão de navegador gratuita e de código aberto para Chrome e Firefox. Sem necessidade de registro.",
|
||||
"META_DESCRIPTION": "Assista Netflix, YouTube, Twitch e qualquer vídeo HTML5 em perfeita sincronia com amigos. Extensão de navegador gratuita e de código aberto. Sem registro.",
|
||||
"OG_TITLE": "KoalaSync | Sincronize Netflix, Emby, Jellyfin e quase qualquer vídeo com amigos",
|
||||
"OG_DESCRIPTION": "Assista à Netflix, Emby, Jellyfin, YouTube, Twitch e quase qualquer vídeo HTML5 em perfeita sincronia. Extensão de navegador de código aberto e focada em privacidade para Chrome e Firefox.",
|
||||
"TWITTER_TITLE": "KoalaSync | Sincronize Netflix, Emby, Jellyfin e quase qualquer vídeo com amigos – Extensão de navegador",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"LANG_TOGGLE_TEXT": "EN",
|
||||
|
||||
"META_TITLE": "KoalaSync | Синхронизация Netflix, YouTube и любого видео с друзьями",
|
||||
"META_DESCRIPTION": "Смотрите Netflix, YouTube, Twitch и любые HTML5-видео в идеальной синхронизации с друзьями. Бесплатное расширение с открытым исходным кодом для Chrome и Firefox. Регистрация не требуется.",
|
||||
"META_DESCRIPTION": "Смотрите Netflix, YouTube, Twitch и любые HTML5-видео в синхронизации с друзьями. Бесплатное расширение браузера с открытым кодом. Регистрация не требуется.",
|
||||
"OG_TITLE": "KoalaSync | Синхронизация Netflix, Emby, Jellyfin и почти любого видео с друзьями",
|
||||
"OG_DESCRIPTION": "Смотрите Netflix, Emby, Jellyfin, YouTube, Twitch и почти любое HTML5-видео в идеальной синхронизации. Открытое и ориентированное на конфиденциальность расширение для Chrome и Firefox.",
|
||||
"TWITTER_TITLE": "KoalaSync | Синхронизация Netflix, Emby, Jellyfin и почти любого видео с друзьями – Расширение",
|
||||
|
||||
+1
-1
@@ -114,7 +114,7 @@ section {
|
||||
#self-hosting,
|
||||
.comparison-section {
|
||||
content-visibility: auto;
|
||||
contain-intrinsic-size: 700px;
|
||||
contain-intrinsic-size: auto 1400px;
|
||||
}
|
||||
|
||||
/* --- Navigation --- */
|
||||
|
||||
+624
-657
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>KoalaSync | Netflix, YouTube & jedes Video mit Freunden synchronisieren</title>
|
||||
<meta name="description" content="Schaue Netflix, YouTube, Twitch und jedes HTML5-Video perfekt synchronisiert mit Freunden. Kostenlose, quelloffene Browser-Erweiterung für Chrome und Firefox. Keine Anmeldung erforderlich.">
|
||||
<meta name="description" content="Schaue Netflix, YouTube, Twitch und jedes HTML5-Video synchron mit Freunden. Kostenlose, quelloffene Browser-Erweiterung. Keine Anmeldung erforderlich.">
|
||||
|
||||
<link rel="preload" href="../style.css" as="style">
|
||||
<link rel="preload" as="image" href="../assets/LookDownKoala.webp" imagesrcset="../assets/LookDownKoala-1x.webp 90w, ../assets/LookDownKoala.webp 205w" imagesizes="90px" fetchpriority="high">
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>KoalaSync | Sincroniza Netflix, YouTube y cualquier video con amigos</title>
|
||||
<meta name="description" content="Mira Netflix, YouTube, Twitch y cualquier video HTML5 en perfecta sincronización con amigos. Extensión de navegador gratuita y de código abierto para Chrome y Firefox. No se requiere registro.">
|
||||
<meta name="description" content="Mira Netflix, YouTube, Twitch y cualquier video HTML5 en perfecta sincronización con amigos. Extensión de navegador gratuita y de código abierto. Sin registro.">
|
||||
|
||||
<link rel="preload" href="../style.css" as="style">
|
||||
<link rel="preload" as="image" href="../assets/LookDownKoala.webp" imagesrcset="../assets/LookDownKoala-1x.webp 90w, ../assets/LookDownKoala.webp 205w" imagesizes="90px" fetchpriority="high">
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>KoalaSync | Synchronisez Netflix, YouTube et n'importe quelle vidéo avec vos amis</title>
|
||||
<meta name="description" content="Regardez Netflix, YouTube, Twitch et n'importe quelle vidéo HTML5 en parfaite synchronisation avec vos amis. Extension de navigateur gratuite et open-source pour Chrome et Firefox. Aucune inscription requise.">
|
||||
<meta name="description" content="Regardez Netflix, YouTube, Twitch et des vidéos HTML5 en synchro avec vos amis. Extension de navigateur gratuite et open-source. Aucune inscription requise.">
|
||||
|
||||
<link rel="preload" href="../style.css" as="style">
|
||||
<link rel="preload" as="image" href="../assets/LookDownKoala.webp" imagesrcset="../assets/LookDownKoala-1x.webp 90w, ../assets/LookDownKoala.webp 205w" imagesizes="90px" fetchpriority="high">
|
||||
|
||||
+58
-63
@@ -1,74 +1,69 @@
|
||||
(function() {
|
||||
var html = document.documentElement;
|
||||
var path = window.location.pathname;
|
||||
var html = document.documentElement;
|
||||
var path = window.location.pathname;
|
||||
|
||||
// Mapping of browser language codes to KoalaSync locale directories
|
||||
var langMap = {
|
||||
'de': 'de',
|
||||
'fr': 'fr',
|
||||
'es': 'es',
|
||||
'pt': 'pt-BR',
|
||||
'ru': 'ru'
|
||||
};
|
||||
var langMap = {
|
||||
'de': 'de',
|
||||
'fr': 'fr',
|
||||
'es': 'es',
|
||||
'pt': 'pt-BR',
|
||||
'ru': 'ru'
|
||||
};
|
||||
|
||||
// Check if we are on the root index page (either "/" or "/index.html" at the root)
|
||||
var isRootIndex = path === '/' || path === '/index.html' || path === '';
|
||||
var isRootIndex = path === '/' || path === '/index.html' || path === '';
|
||||
|
||||
if (isRootIndex) {
|
||||
var savedLang = localStorage.getItem('koala_lang');
|
||||
var browserLang = navigator.language.split('-')[0];
|
||||
var preferredLang = savedLang || langMap[browserLang] || 'en';
|
||||
if (isRootIndex) {
|
||||
var savedLang = localStorage.getItem('koala_lang');
|
||||
var browserLang = navigator.language.split('-')[0];
|
||||
var preferredLang = savedLang || langMap[browserLang] || 'en';
|
||||
|
||||
if (preferredLang !== 'en') {
|
||||
window.location.replace(preferredLang + '/');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (preferredLang !== 'en') {
|
||||
window.location.replace(preferredLang + '/');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var htmlClasses = html.className.split(' ');
|
||||
var activeLang = null;
|
||||
var hasStaticLang = false;
|
||||
for (var i = 0; i < htmlClasses.length; i++) {
|
||||
if (htmlClasses[i].indexOf('lang-') === 0) {
|
||||
hasStaticLang = true;
|
||||
var langPart = htmlClasses[i].substring(5);
|
||||
activeLang = langPart === 'pt-br' ? 'pt-BR' : langPart;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var htmlClasses = html.className.split(' ');
|
||||
var activeLang = null;
|
||||
var hasStaticLang = false;
|
||||
for (var i = 0; i < htmlClasses.length; i++) {
|
||||
if (htmlClasses[i].indexOf('lang-') === 0) {
|
||||
hasStaticLang = true;
|
||||
var langPart = htmlClasses[i].substring(5);
|
||||
activeLang = langPart === 'pt-br' ? 'pt-BR' : langPart;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasStaticLang) {
|
||||
localStorage.setItem('koala_lang', activeLang);
|
||||
} else {
|
||||
var savedLang = localStorage.getItem('koala_lang');
|
||||
var browserLang = navigator.language.split('-')[0];
|
||||
activeLang = savedLang || langMap[browserLang] || 'en';
|
||||
if (hasStaticLang) {
|
||||
localStorage.setItem('koala_lang', activeLang);
|
||||
} else {
|
||||
var savedLang = localStorage.getItem('koala_lang');
|
||||
var browserLang = navigator.language.split('-')[0];
|
||||
activeLang = savedLang || langMap[browserLang] || 'en';
|
||||
|
||||
// Dynamic utility pages currently only support English and German markup.
|
||||
// Fallback to English for any other language to avoid bilingual text duplication.
|
||||
if (activeLang !== 'de') {
|
||||
activeLang = 'en';
|
||||
}
|
||||
if (activeLang !== 'de') {
|
||||
activeLang = 'en';
|
||||
}
|
||||
|
||||
html.classList.add('lang-' + activeLang);
|
||||
html.lang = activeLang;
|
||||
}
|
||||
html.classList.add('lang-' + activeLang);
|
||||
html.lang = activeLang;
|
||||
}
|
||||
|
||||
// Update titles dynamically based on page
|
||||
var isIndex = path === '/' || path.endsWith('index.html') || path.split('/').pop() === '';
|
||||
var isJoin = path.includes('join');
|
||||
var isIndex = path === '/' || path.endsWith('index.html') || path.split('/').pop() === '';
|
||||
var isJoin = path.includes('join');
|
||||
|
||||
if (isIndex) {
|
||||
var titles = {
|
||||
en: 'KoalaSync | Real-time Video Synchronization for Friends',
|
||||
de: 'KoalaSync | Echtzeit-Video-Synchronisation für Freunde'
|
||||
};
|
||||
document.title = titles[activeLang] || titles.en;
|
||||
} else if (isJoin) {
|
||||
var titles = {
|
||||
en: 'Join Room | KoalaSync',
|
||||
de: 'Raum beitreten | KoalaSync'
|
||||
};
|
||||
document.title = titles[activeLang] || titles.en;
|
||||
}
|
||||
})();
|
||||
if (isIndex) {
|
||||
var titles = {
|
||||
en: 'KoalaSync | Real-time Video Synchronization for Friends',
|
||||
de: 'KoalaSync | Echtzeit-Video-Synchronisation für Freunde'
|
||||
};
|
||||
document.title = titles[activeLang] || titles.en;
|
||||
} else if (isJoin) {
|
||||
var titles = {
|
||||
en: 'Join Room | KoalaSync',
|
||||
de: 'Raum beitreten | KoalaSync'
|
||||
};
|
||||
document.title = titles[activeLang] || titles.en;
|
||||
}
|
||||
})();
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>KoalaSync | Sincronize Netflix, YouTube e qualquer vídeo com amigos</title>
|
||||
<meta name="description" content="Assista à Netflix, YouTube, Twitch e qualquer vídeo HTML5 em perfeita sincronia com amigos. Extensão de navegador gratuita e de código aberto para Chrome e Firefox. Sem necessidade de registro.">
|
||||
<meta name="description" content="Assista Netflix, YouTube, Twitch e qualquer vídeo HTML5 em perfeita sincronia com amigos. Extensão de navegador gratuita e de código aberto. Sem registro.">
|
||||
|
||||
<link rel="preload" href="../style.css" as="style">
|
||||
<link rel="preload" as="image" href="../assets/LookDownKoala.webp" imagesrcset="../assets/LookDownKoala-1x.webp 90w, ../assets/LookDownKoala.webp 205w" imagesizes="90px" fetchpriority="high">
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>KoalaSync | Синхронизация Netflix, YouTube и любого видео с друзьями</title>
|
||||
<meta name="description" content="Смотрите Netflix, YouTube, Twitch и любые HTML5-видео в идеальной синхронизации с друзьями. Бесплатное расширение с открытым исходным кодом для Chrome и Firefox. Регистрация не требуется.">
|
||||
<meta name="description" content="Смотрите Netflix, YouTube, Twitch и любые HTML5-видео в синхронизации с друзьями. Бесплатное расширение браузера с открытым кодом. Регистрация не требуется.">
|
||||
|
||||
<link rel="preload" href="../style.css" as="style">
|
||||
<link rel="preload" as="image" href="../assets/LookDownKoala.webp" imagesrcset="../assets/LookDownKoala-1x.webp 90w, ../assets/LookDownKoala.webp 205w" imagesizes="90px" fetchpriority="high">
|
||||
|
||||
+1
-2572
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user