function registerLogLanguage()

in torchci/components/LogViewer.tsx [58:142]


function registerLogLanguage(monaco: Monaco) {
  // Register a new language
  monaco.languages.register({ id: "logText" });

  // Register a tokens provider for the language
  monaco.languages.setMonarchTokensProvider("logText", {
    tokenizer: {
      root: [
        [/\[30;1m.*?\[0m/, "black"],
        [/\[31;1m.*?\[0m/, "red"],
        [/\[32;1m.*?\[0m/, "green"],
        [/\[33;1m.*?\[0m/, "yellow"],
        [/\[34;1m.*?\[0m/, "blue"],
        [/\[35;1m.*?\[0m/, "magenta"],
        [/\[36;1m.*?\[0m/, "cyan"],
        [/\[37;1m.*?\[0m/, "white"],

        [/\[30m.*?\[0m/, "black"],
        [/\[31m.*?\[0m/, "red"],
        [/\[32m.*?\[0m/, "green"],
        [/\[33m.*?\[0m/, "yellow"],
        [/\[34m.*?\[0m/, "blue"],
        [/\[35m.*?\[0m/, "magenta"],
        [/\[36m.*?\[0m/, "cyan"],
        [/\[37m.*?\[0m/, "white"],

        [/\[0;1;30m.*?\[0m/, "black"],
        [/\[0;1;31m.*?\[0m/, "red"],
        [/\[0;1;32m.*?\[0m/, "green"],
        [/\[0;1;33m.*?\[0m/, "yellow"],
        [/\[0;1;34m.*?\[0m/, "blue"],
        [/\[0;1;35m.*?\[0m/, "magenta"],
        [/\[0;1;36m.*?\[0m/, "cyan"],
        [/\[0;1;37m.*?\[0m/, "white"],

        [/\[1m.*?\[0m/, "cyan"],
        [/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7}Z/, "hidden"],
      ],
    },
  });

  // Define a new theme that contains only rules that match this language
  monaco.editor.defineTheme("logTheme", {
    base: "vs-dark",
    inherit: true,
    rules: [
      { token: "black", foreground: "000000", fontStyle: "bold" },
      { token: "red", foreground: "af0000", fontStyle: "bold" },
      { token: "green", foreground: "87d700", fontStyle: "bold" },
      { token: "yellow", foreground: "d7d700", fontStyle: "bold" },
      { token: "blue", foreground: "5fd7ff", fontStyle: "bold" },
      { token: "magenta", foreground: "8700af", fontStyle: "bold" },
      { token: "cyan", foreground: "00af87", fontStyle: "bold" },
      { token: "white", foreground: "ffffff", fontStyle: "bold" },
      { token: "hidden", foreground: "5f5f5f" },
    ],
    colors: {},
  });

  monaco.languages.registerFoldingRangeProvider("logText", {
    provideFoldingRanges: function (model, context, token) {
      const lines = model.getValue().split("\n");
      const starts = [];
      const ends = [];
      let lineNumber = 0;
      for (const line of lines) {
        if (line.includes("##[group]")) {
          starts.push(lineNumber);
        } else if (line.includes("##[endgroup]")) {
          ends.push(lineNumber);
        }
        lineNumber += 1;
      }
      let ranges = [];
      for (let i = 0; i < Math.min(starts.length, ends.length); i++) {
        ranges.push({
          start: starts[i] + 1,
          end: ends[i] + 1,
          kind: monaco.languages.FoldingRangeKind.Imports,
        });
      }
      return ranges;
    },
  });
}