Загрузка данных


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>