Программа трансляции алгоритма Симплекса в HTML+JavaScript

procedure TAlgWin.SVG2;
var Mass,Prog,Chisl,Objs,Atrs: TStringList;
    LD: TList;
    I,J,N,N1,N2,Code,LV,K: integer;
    OB: TObj;
    PN,PNN: TNames;
    PTS: TStroka;
    XMin,XMax,YMin,YMax,Value: real;
    S,SS,S1,S2,S3,SZ,SL: string;

label 1;
begin

     if SVGOUT_Dlg.RadioButton2.Checked then
     BEGIN
          Mass:=TStringList.Create;
          Prog:=TStringList.Create;
          Chisl:=TStringList.Create;
          Objs:=TStringList.Create;
          Atrs:=TStringList.Create;

          Mass.Add('<HTML>');
          Mass.Add('');

          Mass.Add('<HEAD>');
          Mass.Add('<script src="abc.js"></script>');

          Mass.Add('</HEAD>');

          Mass.Add('<BODY>');
          Mass.Add('<SCRIPT>');
          Mass.Add('     var NS="http://www.w3.org/2000/svg";');
          Mass.Add('');
          Mass.Add('     var SVG=function(h,w)');
          Mass.Add('     {');
          Mass.Add('          var svg=document.createElementNS(NS,"svg");');
          Mass.Add('          svg.width=w;');
          Mass.Add('          svg.height=h;');
          Mass.Add('          return svg;');
          Mass.Add('     }');
          Mass.Add('');

          Mass.Add('     var svg=SVG('+IntToStr(PaintBox1.Width)+','+IntToStr(PaintBox1.Height)+');');
          Mass.Add('     var SCR=InitSCR(0,0,'+IntToStr(PaintBox1.Width)+','+IntToStr(PaintBox1.Height)+');');

          Mass.Add('     svg.setAttribute("viewBox","'+IntToStr(Trunc (SCR.FXMin))+' '+IntToStr(Trunc(SCR.FYMax))+' '+IntToStr(Trunc(SCR.FXMax-SCR.FXMin))+' '+IntToStr(Trunc(SCR.FYMin-SCR.FYMax))+'");');
          Mass.Add('     document.body.appendChild(svg);');
          Mass.Add('');

          Mass.Add('     var rect=function(h,w,fill)');
          Mass.Add('     {');
          Mass.Add('     var SVGObj= document.createElementNS(NS,"rect");');
          Mass.Add('     SVGObj.width.baseVal.value=w;');
          Mass.Add('     SVGObj.height.baseVal.value=h;');
          Mass.Add('     SVGObj.setAttribute("height",h);');
          Mass.Add('     SVGObj.style.fill=fill;');
          Mass.Add('     return SVGObj;');
          Mass.Add('     }');
          Mass.Add('');

          Prog.Add('do {');
          Prog.Add('     var N=false;');
          Objs.Add('     var arr = new Array();');
          for I := 0 to Alg.Prog.Count - 1 do
          begin
               PTS:=Alg.Prog[I];

               // формируем название функции
               S:='';
               S1:=PTS.FUN;
               S3:='';
               N1:=PTS.GetNParam(PTS.LText);
               for J := 1 to N1 do
               begin
                    S2:=PTS.GetText(PTS.LText,J);
                    S3:=S3+'('+S2+'.OB == undefined)';
                    if J<N1 then S3:=S3+' && ';
               end;

               if N1>1 then S3:='('+S3+')';

               S:=S+'if '+S3+' N=EExec'+S1+'(';

               // формируем список выходных параметров
               N1:=PTS.GetNParam(PTS.LText);
               SS:='';
               for J := 1 to N1 do
               begin
                    S2:=PTS.GetText(PTS.LText,J);
                    Objs.Add('     var '+S2+'=new Object();');
                    Objs.Add('     arr.push('+S2+');');

                    // формирование значений атрибутов
                    PNN:=Alg.GetPnByName(S2);
                    LV:=PNN.FAtt.Lv;
                    SZ:='Lv:'+IntToStr(Lv);
                    SL:='';
                    for K := 0 to PNN.FAtt.Layers.Count - 1 do
                    begin
                         SL:=SL+'"'+TLayer(PNN.FAtt.Layers[K]).Name+'"';
                         if K<PNN.FAtt.Layers.Count - 1 then SL:=SL+', ';

                    end;
                    Atrs.Add('     var Att_'+S2+'={'+SZ+', lay:['+SL+']};');

                    if J<N1 then SS:=SS+S2+',' else SS:=SS+S2;
               end;
               S:=S+SS+',';

               // формируем список входных параметров
               N2:=PTS.GetNParam(PTS.RText);
               SS:='';
               for J := 1 to N2 do
               begin
                    S2:=PTS.GetText(PTS.RText,J);
                    // отделение чисел       var Ch1={C:{Re:0,Im:0}}

                    Val(S2,Value,Code);
                    if Code=0 then
                    begin
                         S2:='Chisl'+IntToStr(Chisl.Count+1);
                         S3:='     var '+S2+'={C:{Re:'+FloatToStr(Value)+',Im:0},OB:"C"};';
                         Chisl.Add(S3);
                    end;
                    if S2[1]='-' then Delete(S2,1,1);

                    if J<N2 then SS:=SS+S2+',' else SS:=SS+S2;
               end;
               S:=S+SS+',';

               SS:='';
               for J := 1 to N1 do
               begin
                     S2:=PTS.GetText(PTS.LText,J);
                     SS:=SS+'Att_'+S2+',';
               end;

               for J := 1 to N2 do
               begin
                     S2:=PTS.GetText(PTS.RText,J);
                     SZ:='1';
                     Val(S2,Value,Code);
                     if Code<>0 then if S2[1]='-' then SZ:='-1';
                     if J<N2 then SS:=SS+SZ+',' else SS:=SS+SZ;
               end;
               S:=S+SS+');';
               Prog.Add('     '+S);
          end;

          Prog.Add('} while (N==true);');
          for J := 0 to Objs.Count - 1 do Mass.Add(Objs[J]);
          Mass.Add('');

          for J := 0 to Atrs.Count - 1 do Mass.Add(Atrs[J]);
          Mass.Add('');

          for J := 0 to Chisl.Count - 1 do Mass.Add(Chisl[J]);
          Mass.Add('');
          for J := 0 to Prog.Count - 1 do Mass.Add(Prog[J]);

          Mass.Add('     draw(arr);');
        
          Mass.Add('');

          Mass.Add('</SCRIPT>');
          Mass.Add('</BODY>');
          Mass.Add('</HTML>');

          SVGOUT_Dlg.Memo1.Clear;
          for I := 0 to Mass.Count - 1 do SVGOUT_Dlg.Memo1.Lines.Add(Mass[I]);
          SVGOUT_Dlg.Show;
          Atrs.Free;
          Objs.Free;
          Chisl.Free;
          Prog.Free;
          Mass.Free;
     END;

end; // TAlgWin.SVG2

Транслятор формирует текст программы на языке HTML, которая может быть загружена и исполнена в любом браузере, поддерживающем SVG. Во время работы полученная программа обращается к библиотеке функций abc.js, которая должна размещаться в том же каталоге, что и основной файл HTML.

Представленная процедура встроена в систему конвертации алгоритмов системы Симплекса в HTML и JavaScript представления для публикации геометрической информации в сети Интернет. Такие представления позволяют не только проиллюстрировать результат выполнения геометрических построений, но и предоставить пользователю возможность активного взаимодействия с алгоритмом через его изображения с целью изучения его свойств. Функции интерактивного взаимодействия в настоящее время находятся в отладке.

Файл на языке HTML может быть сгенерирован автоматически при помощи системы Симплекс. Для генерации HTML файла необходимо вызвать команду Файл > Трансляция в > SVG (Alt+F1). Обращение к команде приведет к появлению на экране служебного окна, предназначенного для конвертации алгоритма в HTML файл.

При работе в режиме Программа в окне редактора автоматически формируется текст скрипта, который позволяет вывести в экране браузера изображение построения. выполняемого транслируемым алгоритмом, в формате SVG-графики. При нажатии на кнопку Save текст будет сохранен в файл с именем, соответствующим названию проекта, расширением html. Нажатие на кнопку Copy позволяет скопировать сгенерированный текст в буфер Clipboard. Из Clipboard этот текст можно поместить в текстовый редактор, например, Notepad, где его можно редактировать вручную и адаптировать программу под конкретные цели.

Опция Данные предназначена для преобразования значений полученных в результате алгоритмов объектов в формат SVG. Сгенерированный HTML файл будет содержать статичную геометрическую информацию о построении, предназначенную только для отображения чертежа в браузере. Взаимодействие объектов, как компонентов единой геометрической модели, в данном формате невозможно.