index.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { setup_panic_hook, Numbat } from "numbat-wasm";
  2. async function fetch_exchange_rates() {
  3. try {
  4. const response = await fetch("https://numbat.dev/ecb-exchange-rates.php");
  5. if (!response.ok) {
  6. return;
  7. }
  8. const xml_content = await response.text();
  9. numbat.set_exchange_rates(xml_content);
  10. } catch (error) {
  11. console.error("Failed to load currency exchange rates from the European Central Bank");
  12. return;
  13. }
  14. }
  15. setup_panic_hook();
  16. var numbat = Numbat.new();
  17. var combined_input = "";
  18. // Load KeyboardEvent polyfill for old browsers
  19. keyboardeventKeyPolyfill.polyfill();
  20. function updateUrlQuery(query) {
  21. let url = new URL(window.location);
  22. if (query == null) {
  23. url.searchParams.delete('q');
  24. } else {
  25. url.searchParams.set('q', query);
  26. }
  27. history.replaceState(null, null, url);
  28. }
  29. function interpret(input) {
  30. // Skip empty lines or comments
  31. var input_trimmed = input.trim();
  32. if (input_trimmed === "" || (input_trimmed[0] === "#" && input_trimmed.indexOf("\n") == -1)) {
  33. return;
  34. }
  35. if (input_trimmed == "clear") {
  36. this.clear();
  37. var output = "";
  38. } else if (input_trimmed == "reset") {
  39. numbat = Numbat.new();
  40. numbat.interpret("use units::currencies");
  41. combined_input = "";
  42. updateUrlQuery(null);
  43. this.clear();
  44. } else if (input_trimmed == "list" || input_trimmed == "ll" || input_trimmed == "ls") {
  45. output = numbat.print_environment();
  46. } else if (input_trimmed == "help" || input_trimmed == "?") {
  47. output = numbat.help();
  48. } else {
  49. var result = numbat.interpret(input);
  50. output = result.output;
  51. if (!result.is_error) {
  52. combined_input += input.trim() + "⏎";
  53. updateUrlQuery(combined_input);
  54. }
  55. }
  56. return output;
  57. }
  58. function main() {
  59. $(document).ready(function() {
  60. var term = $('#terminal').terminal(interpret, {
  61. greetings: false,
  62. name: "terminal",
  63. height: 550,
  64. prompt: "[[;;;prompt]>>> ]",
  65. checkArity: false,
  66. historySize: 200,
  67. historyFilter(line) {
  68. return line.trim() !== "";
  69. },
  70. completion(inp, cb) {
  71. cb(numbat.get_completions_for(inp));
  72. }
  73. });
  74. // evaluate expression in query string if supplied (via opensearch)
  75. if (location.search) {
  76. var queryParams = new URLSearchParams(location.search);
  77. if (queryParams.has("q")) {
  78. // feed in the query line by line, as if the user typed it in
  79. for (const line of queryParams.get("q").split("⏎")) {
  80. if (line.trim().length > 0) {
  81. term.exec(line.trim() + "\n");
  82. }
  83. }
  84. }
  85. }
  86. });
  87. }
  88. fetch_exchange_rates().then(main);