<script>
(function () {
// ЗАМЕНИТЕ на ваш ID Метрики
var YM_ID = 12345678;
// --- copy_large: копирование текста > 100 символов ---
var lastCopyAt = 0;
document.addEventListener('copy', function () {
try {
// игнорируем копирование из input/textarea/contenteditable
var ae = document.activeElement;
if (ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable)) return;
var txt = (window.getSelection && (window.getSelection().toString() || '')) || '';
var len = (txt || '').trim().length;
// антидребезг: не чаще 1 раза в 3 сек
var now = Date.now();
if (len >= 100 && now - lastCopyAt > 3000) {
lastCopyAt = now;
if (typeof ym === 'function') {
ym(YM_ID, 'reachGoal', 'copy_large', {
length: len,
page: location.pathname
});
}
}
} catch (e) {}
}, false);
// --- context_image: правый клик по изображению ---
document.addEventListener('contextmenu', function (e) {
try {
var el = e.target;
// IMG или блок с фоном-изображением (часто встречается в Tilda)
var isImgTag = el && el.tagName === 'IMG';
var hasBg = el && window.getComputedStyle(el).backgroundImage !== 'none';
if (isImgTag || hasBg) {
var src = isImgTag ? (el.currentSrc || el.src || '') : window.getComputedStyle(el).backgroundImage;
if (typeof ym === 'function') {
ym(YM_ID, 'reachGoal', 'context_image', {
src: src.slice(0, 300), // ограничим длину
page: location.pathname
});
}
}
} catch (e) {}
}, false);
})();
</script>
<script>
(function () {
// ── настройки ───────────────────────────────────────────────
var MIN_CHARS = 120; // порог: короче — хвост не добавляем
var LABEL = 'Источник:'; // подпись перед ссылкой
var EXCLUDE_SELECTOR = '[data-nocopy]';// элементы, внутри которых хвост не добавляем
// ────────────────────────────────────────────────────────────
function getCleanUrl() {
// 1) если есть <link rel="canonical"> — используем его
var link = document.querySelector('link[rel="canonical"]');
if (link && link.href) return link.href;
// 2) иначе берём текущий URL без якоря и трекинга
var url = new URL(location.href);
url.hash = '';
// чистим самые частые метки
['utm_source','utm_medium','utm_campaign','utm_term','utm_content','fbclid','gclid','yclid','_openstat'].forEach(function (p) {
url.searchParams.delete(p);
});
return url.toString();
}
function selectionContainsExcluded(sel) {
if (!sel || sel.rangeCount === 0) return false;
var range = sel.getRangeAt(0);
var common = range.commonAncestorContainer.nodeType === 1
? range.commonAncestorContainer
: range.commonAncestorContainer.parentElement;
return !!(common && common.closest && common.closest(EXCLUDE_SELECTOR));
}
function getSelectionText(sel) {
return (sel && sel.toString ? sel.toString() : '') || '';
}
function getSelectionHtml(sel) {
if (!sel || sel.rangeCount === 0) return '';
var container = document.createElement('div');
for (var i = 0; i < sel.rangeCount; i++) {
container.appendChild(sel.getRangeAt(i).cloneContents());
}
return container.innerHTML;
}
function buildTail(url) {
// HTML-хвост
var html = '<p style="margin-top:1em; font:inherit; color:inherit;">' +
LABEL + ' <a href="' + url + '">' + url + '</a></p>';
// Текстовый хвост
var text = '\n\n' + LABEL + ' ' + url;
return { html: html, text: text };
}
document.addEventListener('copy', function (e) {
var sel = window.getSelection();
if (!sel || sel.rangeCount === 0) return;
if (selectionContainsExcluded(sel)) return;
var text = getSelectionText(sel);
if (text.replace(/\s+/g, ' ').trim().length < MIN_CHARS) return;
var url = getCleanUrl();
var tail = buildTail(url);
// Собираем HTML: оригинал + хвост
var htmlOriginal = getSelectionHtml(sel);
var htmlCombined = htmlOriginal + tail.html;
// Собираем текст: оригинал + хвост
var textCombined = text + tail.text;
// Кладём оба формата в буфер
if (e.clipboardData) {
e.clipboardData.setData('text/html', htmlCombined);
e.clipboardData.setData('text/plain', textCombined);
e.preventDefault(); // важно: переписываем содержимое буфера
} else if (window.clipboardData) {
// старый IE
window.clipboardData.setData('Text', textCombined);
e.preventDefault && e.preventDefault();
}
}, false);
})();
</script>
<script>
(function () {
// Какие сочетания режем
var KEYS = { C:67, X:88, S:83, P:80, A:65 };
function isMac(){ return navigator.platform.toUpperCase().includes('MAC'); }
// Разрешаем всё внутри полей ввода и зон, где явно разрешили
function isEditable(el){
if (!el) return false;
if (el.closest('[data-allowcopy]')) return true;
if (el.isContentEditable) return true;
var tag = (el.tagName||'').toLowerCase();
return tag==='input' || tag==='textarea';
}
// 1) Режем контекстное меню вне разрешённых зон
document.addEventListener('contextmenu', function(e){
if (!isEditable(e.target)) e.preventDefault();
}, {capture:true});
// 2) Режем «горячие» комбинации вне разрешённых зон
document.addEventListener('keydown', function(e){
var ctrl = isMac() ? e.metaKey : e.ctrlKey;
if (!ctrl || isEditable(e.target)) return;
var k = e.keyCode || e.which;
if (k===KEYS.C || k===KEYS.X || k===KEYS.S || k===KEYS.P || k===KEYS.A){
e.preventDefault();
// по желанию: мягкое уведомление
// alert('Копирование отключено');
}
}, {capture:true});
// 3) На мобильных скрываем системное «долгое нажатие» (контекст), но НЕ трогаем выделение
var css = document.createElement('style');
css.textContent = 'html{-webkit-touch-callout:none;}';
document.head.appendChild(css);
})();
</script>