Skip to content
Snippets Groups Projects
index.html 3.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • tuhe's avatar
    tuhe committed
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <title>pyxterm.js</title>
        <style>
          html {
            font-family: arial;
          }
        </style>
        <link
          rel="stylesheet"
          href="https://unpkg.com/xterm@4.11.0/css/xterm.css"
        />
      </head>
      <body>
        <span style="font-size: 1.4em">pyxterm.js</span>&nbsp;&nbsp;&nbsp;
        <span style="font-size: small"
          >status:
          <span style="font-size: small" id="status">connecting...</span></span
        >
    
        <div style="width: 100%; height: calc(100% - 50px)" id="terminal"></div>
        <div style="width: 50%; height: calc(20%)" id="term2">another terminal</div>
        <p style="text-align: right; font-size: small">
          built by <a href="https://chadsmith.dev">Chad Smith</a>
          <a href="https://github.com/cs01">GitHub</a>
        </p>
        <!-- xterm -->
        <script src="https://unpkg.com/xterm@4.11.0/lib/xterm.js"></script>
        <script src="https://unpkg.com/xterm-addon-fit@0.5.0/lib/xterm-addon-fit.js"></script>
        <script src="https://unpkg.com/xterm-addon-web-links@0.4.0/lib/xterm-addon-web-links.js"></script>
        <script src="https://unpkg.com/xterm-addon-search@0.8.0/lib/xterm-addon-sear
    ch.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.min.js"></script>
    
        <script>
          const term = new Terminal({
            cursorBlink: true,
            macOptionIsMeta: true,
            scrollback: 300,
          });
          // https://github.com/xtermjs/xterm.js/issues/2941
          const fit = new FitAddon.FitAddon();
          term.loadAddon(fit);
          term.loadAddon(new WebLinksAddon.WebLinksAddon());
          term.loadAddon(new SearchAddon.SearchAddon());
    
          term.open(document.getElementById("terminal"));
          fit.fit();
          term.resize(15, 50);
          console.log(`size: ${term.cols} columns, ${term.rows} rows`);
          fit.fit();
          term.writeln("Welcome to pyxterm.js!");
          term.writeln("https://github.com/cs01/pyxterm.js");
          term.onData((data) => {
            console.log("key pressed in browser:", data);
            socket.emit("pty-input", { input: data });
          });
    
          const socket = io.connect("/pty");
          const status = document.getElementById("status");
    
          socket.on("pty-output", function (data) {
            console.log("new output received from server:", data.output);
            term.write(data.output);
          });
    
          socket.on("connect", () => {
            fitToscreen();
            status.innerHTML =
              '<span style="background-color: lightgreen;">connected</span>';
          });
    
          socket.on("disconnect", () => {
            status.innerHTML =
              '<span style="background-color: #ff8383;">disconnected</span>';
          });
    
          function fitToscreen() {
            fit.fit();
            const dims = { cols: term.cols, rows: term.rows };
            console.log("sending new dimensions to server's pty", dims);
            socket.emit("resize", dims);
          }
    
          function debounce(func, wait_ms) {
            let timeout;
            return function (...args) {
              const context = this;
              clearTimeout(timeout);
              timeout = setTimeout(() => func.apply(context, args), wait_ms);
            };
          }
    
          const wait_ms = 50;
          window.onresize = debounce(fitToscreen, wait_ms);
        </script>
        <script>
          const term2 = new Terminal({
            cursorBlink: true,
            macOptionIsMeta: true,
            scrollback: true,
          });
          // https://github.com/xtermjs/xterm.js/issues/2941
          const fit2 = new FitAddon.FitAddon();
          term2.loadAddon(fit2);
          term2.loadAddon(new WebLinksAddon.WebLinksAddon());
          term2.loadAddon(new SearchAddon.SearchAddon());
    
          term2.open(document.getElementById("term2"));
          fit2.fit();
          term2.resize(15, 50);
          console.log(`size: ${term.cols} columns, ${term.rows} rows`);
          fit2.fit();
          term2.writeln("Welcome to pyxterm.js!");
          term2.writeln("https://github.com/cs01/pyxterm.js");
    
        </script>
    
      </body>
    </html>