homepage/templates/custom/header.tmpl
loop-uh cfbb1c2681 Зеркала git: настройки из localStorage общие для всех имён (кука zg_store)
git.zapret.moe, git2, git3… — один сайт, но localStorage у каждого имени свой:
на другом зеркале заставка показывалась снова, а звук, рекорды, режим редактора
и способ клонирования сбрасывались. Теперь эти ключи дублируются в куку
zg_store на общем домене (как куки Forgejo, которые nginx ставит на zapret.moe)
и восстанавливаются в <head> до того, как их прочтут.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 09:20:57 -04:00

38 lines
2.1 KiB
Go Template
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<link rel="icon" href="{{AppSubUrl}}/assets/img/favicon.ico?v=zapret2" sizes="any">
<link rel="apple-touch-icon" href="{{AppSubUrl}}/assets/img/apple-touch-icon.png?v=zapret2">
<link rel="stylesheet" href="{{AppSubUrl}}/assets/zapret-moe/site.css?v=@ASSETS_VER@">
<script>
/* У git несколько имён (git.zapret.moe, git2…) — это один сайт, а localStorage у
каждого имени свой. Настройки (заставка, звук, рекорды, редактор, способ
клонирования) лежат ещё и в куке zg_store на общем домене, как куки Forgejo, —
поэтому на любом имени они те же. Стоит в <head>: до того, как их прочтут. */
(function () {
var KEYS = /^(zpm-|zg-|zlock-|markdown-editor-|repo-clone-protocol$)/;
var host = location.hostname.split('.');
var domain = host.length > 2 ? host.slice(1).join('.') : location.hostname;
var ls, store = {}, key, i;
try { ls = window.localStorage; } catch (e) { return; }
var m = document.cookie.match(/(?:^|; )zg_store=([^;]*)/);
try { if (m) store = JSON.parse(decodeURIComponent(m[1])) || {}; } catch (e) {}
var setItem = Storage.prototype.setItem, removeItem = Storage.prototype.removeItem;
function save() {
document.cookie = 'zg_store=' + encodeURIComponent(JSON.stringify(store)) +
'; Domain=' + domain + '; Path=/; Max-Age=31536000; Secure; SameSite=Lax';
}
/* что было только на этом имени (до общей куки) — тоже в общее */
for (i = 0; i < ls.length; i++) {
key = ls.key(i);
if (KEYS.test(key) && !(key in store)) store[key] = ls.getItem(key);
}
for (key in store) if (ls.getItem(key) !== store[key]) setItem.call(ls, key, store[key]);
save();
Storage.prototype.setItem = function (k, v) {
setItem.call(this, k, v);
if (this === ls && KEYS.test(k)) { store[k] = String(v); save(); }
};
Storage.prototype.removeItem = function (k) {
removeItem.call(this, k);
if (this === ls && KEYS.test(k)) { delete store[k]; save(); }
};
})();
</script>