プログラムを文字列に変換

テンプレートプログラムを一部変えて自動生成するプログラムを作成する際に,テンプレートプログラムを文字列に変換したくなりました

変換するツールがないか調べた所,次のようなサイトを見つけました

https://www.espruino.com/File+Converter

サイトにアクセスしプログラムを貼り付け`Quoted String`を選択すると一つの文字列として出力されました

![Screenshot from 2022-12-03 18-16-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/d6816eb9-6800-65e7-b44c-a652cb78fd45.png)

pythonに変数として入れて,printしてみると正常にプログラムがプリントできました

![Screenshot from 2022-12-03 18-17-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/17402277-625b-b9db-19c0-d7df295224ac.png)


![Screenshot from 2022-12-03 18-17-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/2d465c36-5fe9-14bb-f94b-9f9e918bf8e8.png)

ちなみに変換プログラムは次のようになっていｔ
```convert.js
function fileLoaded() {
    document.getElementById("result").value = "";
    document.getElementById("result").style.display = "none";
    document.getElementById("size").innerText = "Please Choose a file first";
    if (!bytes) return;

    var fileTypeSelect = document.getElementById("fileType");
    var fileType = fileTypeSelect.options[fileTypeSelect.selectedIndex].value;

    if (bytes.length>(20*1024)) {
      document.getElementById("size").innerText = "File too long - must be less than 20kB";
      return;
    }

    var dqStr = "";
    var tmpStr = "";
    var lastCh = 0;
    for (var i=0;i<bytes.length;i++) {
      var ch = bytes[i];
      // templated string
      if (ch==92) tmpStr += "\\\\"; // escaping slash
      else if (ch==96) tmpStr += "\\\`"; // template quote
      else if (lastCh==36 && ch==126) tmpStr += "\\{" // ${
      else tmpStr += String.fromCharCode(ch);
      // double-quoted string
      if (ch==34) dqStr += "\\\"";
      else if (ch==9) dqStr += "\\t";
      else if (ch==10) dqStr += "\\n";
      else if (ch==13) dqStr += "\\r";
      else if (ch==92) dqStr += "\\\\";
      else if (ch>=32 && ch<127)
        dqStr += String.fromCharCode(ch);
      else { // hex code
        if (ch<64 && (i+1>=bytes.length || (bytes[i+1]<48/*0*/ || bytes[i+1]>55/*7*/)))
          dqStr += "\\"+ch.toString(8/*octal*/); // quick compactness hack
        else
          dqStr += "\\x"+(ch+256).toString(16).substr(-2); // hex
      }
      lastCh = ch;
    }

    var finalStr = "";
    switch (fileType) {
      case "b64" :
        finalStr = 'atob("'+btoa(String.fromCharCode.apply(null, bytes))+'")';
        break;
      case "b64c" :
        finalStr = 'E.toString(require("heatshrink").decompress(atob("'+btoa(String.fromCharCode.apply(null, heatshrink.compress(bytes)))+'")))';
        break;
      case "b64b" :
        finalStr = 'var data = new Uint8Array('+bytes.length+');\r\n';
        var BSIZE = 128;
        for (var i=0;i<bytes.length;i+=BSIZE) {
          let d = btoa(String.fromCharCode.apply(null, bytes.slice(i,i+BSIZE)));
          finalStr += 'data.set(atob("'+d+'"),'+i+');\r\n';
        }
        break;
        case "b64f" :
          finalStr = 'var addr=....; // '+bytes.length+' bytes\n';
          var BSIZE = 256;
          for (var i=0;i<bytes.length;i+=BSIZE) {
            let d = btoa(String.fromCharCode.apply(null, bytes.slice(i,i+BSIZE)));
            finalStr += 'require("Flash").write(atob("'+d+'"), addr+'+i+');\r\n';
          }
          break;
      case "quoted" :
        finalStr = '"'+dqStr+'"';
        break;
      case "templated" :
        finalStr = '"'+tmpStr+'"';
        break;
      default: throw new Error("Unknown type!");
    }
    document.getElementById("size").innerText = finalStr.length+" Characters";
    document.getElementById("result").style.display = "";
    document.getElementById("result").value = finalStr;
  }
```