Загрузка данных
data:text/html,<!DOCTYPE html><html><head><meta charset="utf-8"></head><body><pre id="j"></pre><script>
const code = `
Обновленный текст
`;
const res={};const calcVars={};const repeatVars={};let step=1;let lastLightVal="0";const lines=code.split('\n');
function cleanExpr(e){return e.replace(/,/g,'.').replace(/\*([a-zA-Z0-9_]+)/g,(m,n)=>calcVars[n]!==undefined?calcVars[n]:'0');}
function formatNum(v,decimals=2){if(isNaN(v))return"0";if(v<0)v=0;if(v>1)v=1;return String(Number(v.toFixed(decimals))).replace('.',',');}
function getOp(s){for(let o of ['+','-','*','/']){if(s.includes(o))return o;}return null;}
for(let line of lines){
line=line.trim();if(!line)continue;
if(line.includes('stop()')){res[step++]="stop";break;}
if(line.startsWith('num(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(4,line.indexOf(')'));const parts=inner.split(';');let flatArr=[];
for(let p of parts){
p=p.trim();
if(p.startsWith('*')){
const varName=p.substring(1).trim();
if(repeatVars[varName]){flatArr=flatArr.concat(repeatVars[varName]);}
else if(calcVars[varName]!==undefined){flatArr.push(formatNum(calcVars[varName],6));}
else{flatArr.push("0");}
}else{flatArr.push(formatNum(parseFloat(cleanExpr(p)),6));}
}
repeatVars[name]=flatArr.map(v=>v.replace(/,0+\(/, '').replace(/(,[0-9]+[1-9])0+\)/, '\$1'));
continue;
}
if(line.startsWith('calc(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(5,line.indexOf(')'));
try{calcVars[name]=eval(cleanExpr(inner));}catch(err){calcVars[name]=0;}
continue;
}
if(line.startsWith('calc.fade(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(10,line.indexOf(')'));const semi=inner.indexOf(';');if(semi===-1)continue;
const count=parseInt(inner.substring(semi+1).trim());const expr=inner.substring(0,semi);
const op=getOp(expr);if(!op)continue;const opIdx=expr.find?expr.find(op):expr.indexOf(op);
try{
const start=parseFloat(eval(cleanExpr(expr.substring(0,opIdx))));
const opVal=parseFloat(eval(cleanExpr(expr.substring(opIdx+1))));
const arr=[];
for(let i=0;i<count;i++){
let val=0;if(op==='+')val=start+(opVal*i);if(op==='-')val=start-(opVal*i);if(op==='*')val=start*Math.pow(opVal,i);if(op==='/')val=start/Math.pow(opVal,i);
arr.push(formatNum(val,6));
}
repeatVars[name]=arr;
}catch(err){}
continue;
}
if(line.startsWith('speed(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(6,line.indexOf(')'));const semi=inner.indexOf(';');if(semi===-1)continue;
let srcName=inner.substring(0,semi).trim();if(srcName.startsWith('*'))srcName=srcName.substring(1).trim();
const factor=parseFloat(inner.substring(semi+1).trim().replace(',','.'));
if(repeatVars[srcName] && repeatVars[srcName].length > 0 && factor > 0){
const srcArr = repeatVars[srcName];const arr = [];
if(Number.isInteger(factor)){
for(let i=0;i<srcArr.length;i+=factor){arr.push(srcArr[i]);}
}else{
const newLen=Math.max(1,Math.floor((srcArr.length-1)/factor)+1);
for(let i=0;i<newLen;i++){
const srcIdx=i*factor;const baseIdx=Math.floor(srcIdx);const
fraction=srcIdx-baseIdx;
if(baseIdx+1<srcArr.length){
const v1=parseFloat(srcArr[baseIdx].replace(',','.'));const v2=parseFloat(srcArr[baseIdx+1].replace(',','.'));
arr.push(formatNum(v1+(v2-v1)*fraction,6));
}else{if(baseIdx<srcArr.length && i===newLen-1){arr.push(srcArr[baseIdx]);}}
}
}
repeatVars[name]=arr;
}else{repeatVars[name]=[];}
continue;
}
if(line.startsWith('invert(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
let srcName=line.substring(7,line.indexOf(')')).trim();if(srcName.startsWith('*'))srcName=srcName.substring(1).trim();
if(repeatVars[srcName]){repeatVars[name]=[...repeatVars[srcName]].reverse();}else{repeatVars[name]=[];}
continue;
}
if(line.startsWith('rand(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(5,line.indexOf(')'));const semi=inner.indexOf(';');if(semi===-1)continue;
const count=parseInt(inner.substring(semi+1).trim());const range=inner.substring(0,semi);
const parts=range.split('-').map(s=>parseFloat(cleanExpr(s)));
if(parts.length===2){
const min=Math.min(parts[0],parts[1]),max=Math.max(parts[0],parts[1]);const arr=[];
for(let i=0;i<count;i++){let v=Math.random()*(max-min)+min;arr.push(formatNum(v,6));}
repeatVars[name]=arr;
}
continue;
}
if(line.startsWith('round(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(6,line.indexOf(')'));const semi=inner.indexOf(';');if(semi===-1)continue;
let srcName=inner.substring(0,semi).trim();if(srcName.startsWith('*'))srcName=srcName.substring(1).trim();
const roundStepStr=inner.substring(semi+1).trim().replace(',','.');const roundStep=parseFloat(roundStepStr);
let decimals=0;if(roundStepStr.includes('.')){decimals=roundStepStr.split('.')[1].length;}
if(repeatVars[srcName]){
repeatVars[name]=repeatVars[srcName].map(valStr=>{
let v=parseFloat(valStr.replace(',','.'));let rounded=Math.round(v/roundStep)*roundStep;return formatNum(rounded,decimals);
});
}else if(calcVars[srcName]!==undefined){
let v=calcVars[srcName];let rounded=Math.round(v/roundStep)*roundStep;calcVars[name]=rounded;
}
continue;
}
if(line.startsWith('limit(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(6,line.indexOf(')'));const parts=inner.split(';');if(parts.length!==3)continue;
let srcName=parts[0].trim();if(srcName.startsWith('*'))srcName=srcName.substring(1).trim();
const minL=parseFloat(cleanExpr(parts[1]));const maxL=parseFloat(cleanExpr(parts[2]));
if(repeatVars[srcName]){
repeatVars[name]=repeatVars[srcName].map(valStr=>{
let v=parseFloat(valStr.replace(',','.'));if(v<minL)v=minL;if(v>maxL)v=maxL;return formatNum(v,6);
});
}else{repeatVars[name]=[];}
continue;
}
if(line.startsWith('num.repeat(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(11,line.indexOf(')'));const semi=inner.indexOf(';');if(semi===-1)continue;
let srcName=inner.substring(0,semi).trim();if(srcName.startsWith('*'))srcName=srcName.substring(1).trim();
const count=parseInt(inner.substring(semi+1).trim());
if(repeatVars[srcName] && !isNaN(count) && count > 0){
let flatArr=[];
for(let i=0;i<count;i++){flatArr=flatArr.concat(repeatVars[srcName]);}
repeatVars[name]=flatArr;
}else{repeatVars[name]=[];}
continue;
}
if(line.startsWith('fade(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(5,line.indexOf(')'));const parts=inner.split(';');if(parts.length!==3)continue;
try{
const start=parseFloat(eval(cleanExpr(parts[0])));
// ИСПРАВЛЕНО: Добавлен cleanExpr для корректного чтения переменных вроде *макс_яркость
const end=parseFloat(eval(cleanExpr(parts[1])));
const steps=parseInt(parts[2].trim());
const arr=[];
for(let i=0;i<steps;i++){
let t=steps>1 ? i/(steps-1) : 0;
let val=start+(end-start)*t;
arr.push(formatNum(val,6));
}
repeatVars[name]=arr;
}catch(err){}
continue;
}
if(line.startsWith('ease(')){
const eq=line.indexOf('=');if(eq===-1)continue;
let name=line.substring(eq+1).trim();if(name.startsWith('*'))name=name.substring(1).trim();
const inner=line.substring(5,line.indexOf(')'));const parts=inner.split(';');if(parts.length!==4)continue;
try{
const start=parseFloat(eval(cleanExpr(parts[0])));
const end=parseFloat(eval(cleanExpr(parts[1])));
const steps=parseInt(parts[2].trim());
const type=parts[3].trim().toLowerCase();
const arr=[];
for(let i=0;i<steps;i++){
let t=steps>1 ? i/(steps-1) : 0;
let easeT=t;
if(type==='in'){
easeT=t*t; // Ускорение (Quadratic EaseIn)
}else if(type==='out'){
easeT=t*(2-t); // Замедление (Quadratic EaseOut)
}else if(type==='in-out'){
easeT=t<0.5 ? 2*t*t : -1+(4-2*t)*t; // Плавный старт и финиш (Quadratic EaseInOut)
}
let val=start+(end-start)*easeT;
arr.push(formatNum(val,6));
}
repeatVars[name]=arr;
}catch(err){}
continue;
}
if(line.startsWith('wait(')){
const count=parseInt(line.substring(5,line.indexOf(')')).trim());
if(!isNaN(count)){for(let i=0;i<count;i++){res[step++]=lastLightVal;}}
continue;
}
if(line.startsWith('repeat(')){
const semi=line.lastIndexOf(';');if(semi===-1)continue;
const count=parseInt(line.substring(semi+1,line.lastIndexOf(')')).trim());
const innerCommands=line.substring(7,semi).trim();
for(let i=0;i<count;i++){
// ИСПРАВЛЕНО: Регулярное выражение находит все вызовы функций внутри repeat по очереди
const regex = /([a-z.]+)\(([^)]+)\)/g;
let match;
while ((match = regex.exec(innerCommands)) !== null) {
const cmd = match[1].trim();
const p = match[2].trim();
if (cmd === 'light') {
if(p.startsWith('*')){
const name=p.substring(1).trim();
if(repeatVars[name]){for(const val of repeatVars[name]){res[step++]=val;lastLightVal=val;}}
else if(calcVars[name]!==undefined){const val=formatNum(calcVars[name]);res[step++]=val;lastLightVal=val;}
}else{const val=p.replace('.',',');res[step++]=val;lastLightVal=val;}
}
else if (cmd === 'wait') {
const waitCount = parseInt(p);
if(!isNaN(waitCount)){for(let w=0;w<waitCount;w++){res[step++]=lastLightVal;}}
}
}
}
continue;
}
if(line.startsWith('light(')){
let p=line.substring(6,line.indexOf(')')).trim();
if(p.startsWith('*')){
const name=p.substring(1).trim();
if(repeatVars[name]){for(const val of repeatVars[name]){res[step++]=val;lastLightVal=val;}}
else if(calcVars[name]!==undefined){const val=formatNum(calcVars[name]);res[step++]=val;lastLightVal=val;}
}else{const val=p.replace('.',',');res[step++]=val;lastLightVal=val;}
}
}
document.getElementById("j").textContent=JSON.stringify(res,null,2);</script></body></html>