// ==UserScript==
// @name figma.com translate
// @namespace figma.com
// @version 0.1
// @author Aetae
// @match *://*.figma.com/*
// @grant none
// @run-at document-start
// ==/UserScript==
// monkeyPatch(name, func, repeat = 1)
function monkeyPatch(name, ...funcs) {
const repeat = funcs.length === 2 && typeof funcs[1] !== 'function' && funcs.pop();
const pending = monkeyPatch.pending[name];
funcs = funcs.map(func => ({
func,
count: typeof repeat === 'number' ? repeat : (repeat ? Infinity : 1)
}));
if(pending?.length)
return pending.push(...funcs);
Object.defineProperty(Object.prototype, name, {
set(value) {
for(let i = funcs.length; i--;) {
const patchedValue = funcs[i].func.call(this, value);
if(patchedValue !== monkeyPatch.DO_NOT_PATCH) {
if(--funcs[i].count <= 0)
funcs.splice(i, 1);
if(!funcs.length)
delete Object.prototype[name];
value = patchedValue;
break;
}
}
return value !== monkeyPatch.INLINE_PATCH && Object.defineProperty(this, name, {
value,
configurable: true,
writable: true,
enumerable: true
});
},
configurable: true
});
return monkeyPatch.pending[name] = funcs;
}
monkeyPatch.pending = Object.create(null);
monkeyPatch.DO_NOT_PATCH = 'MONKEYPATCH_DO_NOT_PATCH';
monkeyPatch.INLINE_PATCH = 'MONKEYPATCH_INLINE_PATCH';
monkeyPatch('defaultStringsRaw', value => value && "copy-as-css" in value ? Object.assign(value, {
"copy-as-css": "Копировать CSS",
}) : monkeyPatch.DO_NOT_PATCH);
monkeyPatch('shortcutList', value => {
if(value?.essential?.name !== "Essential")
return monkeyPatch.DO_NOT_PATCH;
value.essential.name = "Основное";
return value;
});
monkeyPatch('compileRegularExpression', function(value) {
if(!this.matchAgainstText)
return monkeyPatch.DO_NOT_PATCH;
return chars => {
chars = Array.prototype.filter.call(chars, char => /а-яёa-z\d/i.test(char));
if(chars.length)
return new RegExp("^(.*?)" + chars.map(char => `(${char})(.*?)`).join('') + "$", "i")
return null;
};;
});
document.querySelector('...').setAttribute
-> document.querySelector('...')?.setAttribute
итд. ?.
- брать следующее только если есть предыдущее.label[class^="raw_components--labelInactive--"]
или там label[class*="raw_components--labelInactive--"]
(^=
- начинается на, ^=
- содержит).this
- это тоже объект. Только удостовериться надо, что заменяем то что надо, а не что-то случайное. const date = new Date();
date.setHours(0,0,0,0);
console.log(JSON.stringify(date));
<img src="img1.png" style="background-image: url(img2.jpg)" />
'smooth'
, а использовать какие-то библиотеки с тем же функционалом.setTimeout
или событию scroll
/scrollend
, но нет никакой гарантии, что кто-то не начнёт скроллить вручную и всё не сломает.