nlcep 0.8.0

a library for parsing natural language calendar events
Documentation
<!DOCTYPE html>
<html>
  <head>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
  </head>
  <body>
    <!-- Note the usage of `type=module` here as this is an ES6 module -->
    <script type="module">
      // Use ES module import syntax to import functionality from the module
      // that we have compiled.
      //
      // Note that the `default` import is an initialization function which
      // will "boot" the module and make it ready to use. Currently browsers
      // don't support natively imported WebAssembly as an ES module, but
      // eventually the manual initialization won't be required!
      import init, { parse, set_panic_hook } from './pkg/nlcep.js';

      async function run() {
        // First up we need to actually load the Wasm file, so we use the
        // default export to inform it where the Wasm file is located on the
        // server, and then we wait on the returned promise to wait for the
        // Wasm to be loaded.
        //
        // It may look like this: `await init('./pkg/without_a_bundler_bg.wasm');`,
        // but there is also a handy default inside `init` function, which uses
        // `import.meta` to locate the Wasm file relatively to js file.
        //
        // Note that instead of a string you can also pass in any of the
        // following things:
        //
        // * `WebAssembly.Module`
        //
        // * `ArrayBuffer`
        //
        // * `Response`
        //
        // * `Promise` which returns any of the above, e.g. `fetch("./path/to/wasm")`
        //
        // This gives you complete control over how the module is loaded
        // and compiled.
        //
        // Also note that the promise, when resolved, yields the Wasm module's
        // exports which is the same as importing the `*_bg` module in other
        // modes
        await init();
        console.log("Init success!");
        set_panic_hook();
        console.log("Panic hook set!");
        const msgBox = document.querySelector("#msg");
        const errBox = document.querySelector("#err");
        const inputBox = document.querySelector("#parse-input");
        function updateUI(obj, err) {
          if(err) {
            errBox.innerHTML = err;
          } else {
            errBox.innerHTML = "";
          }
          const input = inputBox.value;
          let what = "?";
          let when = "?";
          let where = "?";
          if(obj) {
            what = obj.summary;
            when = `${obj.date}${obj.time ? " " + obj.time : ""}`;
            if(obj.location) {
              where = obj.location;
            }
          } else if (input) {
            what = input;
          }
          msgBox.innerHTML = `What: ${what}<br>When: ${when}<br>Where: ${where}`;
          inputBox.disabled = false;
        }

        function process(val) {
          function ev() {
            // And afterwards we can use all the functionality defined in wasm.
            const res = parse(val);
            if(res.Ok) {
              return res.Ok;
            }
            if(res.Err) {
              throw res.Err;
            }
            throw "unintelligible result!" + res;
          }
          try {
            const res = ev();
            console.log(res);
            updateUI(res, null);
          } catch(e) {
            updateUI(null, e);
          }
        }
        inputBox.onkeyup = () => {
          const val = inputBox.value;
          process(val);
        };

        process("");
        inputBox.focus();
      }

      run();
    </script>
    <main>
      <h1>NLCEP</h1>
      <input id="parse-input" placeholder="Meet with Johanna tomorrow 11:00, Graphic Plaza" disabled="true" style="width: min(400px, 90vw);" />
      <p id="msg">Loading wasm, please wait...</p>
      <p id="err"></p>
    </main>
  </body>
</html>