Просмотр исходного кода

add coloring for ansi control characters

Alexander Belanger 5 лет назад
Родитель
Сommit
c7f6628178

Разница между файлами не показана из-за своего большого размера
+ 10364 - 1
dashboard/package-lock.json


+ 1 - 0
dashboard/package.json

@@ -23,6 +23,7 @@
     "@visx/shape": "^1.4.0",
     "@visx/tooltip": "^1.3.0",
     "ace-builds": "^1.4.12",
+    "anser": "^2.0.1",
     "axios": "^0.20.0",
     "d3-array": "^2.11.0",
     "d3-time-format": "^3.0.0",

+ 4 - 0
dashboard/src/index.html

@@ -104,6 +104,10 @@
       href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined"
       rel="stylesheet"
     />
+    <link
+      href="https://fonts.googleapis.com/icon?family=Roboto+Mono"
+      rel="stylesheet"
+    />
   </head>
   <body>
     <div id="output"></div>

+ 30 - 4
dashboard/src/main/home/cluster-dashboard/expanded-chart/status/Logs.tsx

@@ -1,6 +1,7 @@
 import React, { Component } from "react";
 import styled from "styled-components";
 import { Context } from "shared/Context";
+import * as Anser from 'anser';
 
 type PropsType = {
   selectedPod: any;
@@ -9,14 +10,14 @@ type PropsType = {
 };
 
 type StateType = {
-  logs: string[];
+  logs: Anser.AnserJsonEntry[][];
   ws: any;
   scroll: boolean;
 };
 
 export default class Logs extends Component<PropsType, StateType> {
   state = {
-    logs: [] as string[],
+    logs: [] as Anser.AnserJsonEntry[][],
     ws: null as any,
     scroll: true,
   };
@@ -58,8 +59,20 @@ export default class Logs extends Component<PropsType, StateType> {
     if (this.state.logs.length == 0) {
       return <Message>No logs to display from this pod.</Message>;
     }
+
     return this.state.logs.map((log, i) => {
-      return <Log key={i}>{log}</Log>;
+      return <Log key={i}>
+        {this.state.logs[i].map((ansi, j) => {
+          if (ansi.clearLine) {
+            console.log("CLEAR LINE IS", ansi.clearLine)
+            return null
+          }
+
+          return <LogSpan key={i + "." + j} ansi={ansi}>
+            {ansi.content.replace(/ /g, '\u00a0')}
+          </LogSpan>
+        })}
+      </Log>;
     });
   };
 
@@ -77,7 +90,12 @@ export default class Logs extends Component<PropsType, StateType> {
     };
 
     this.ws.onmessage = (evt: MessageEvent) => {
-      this.setState({ logs: [...this.state.logs, evt.data] }, () => {
+      let ansiLog = Anser.ansiToJson(evt.data)
+
+      let logs = this.state.logs
+      logs.push(ansiLog)
+
+      this.setState({ logs: logs }, () => {
         if (this.state.scroll) {
           this.scrollToBottom(false);
         }
@@ -247,3 +265,11 @@ const Message = styled.div`
 const Log = styled.div`
   font-family: monospace;
 `;
+
+const LogSpan = styled.span`
+  font-family: 'Roboto Mono';
+  font-size: 12px;
+  font-weight: ${(props: { ansi: Anser.AnserJsonEntry }) => props.ansi?.decoration && props.ansi?.decoration == "bold" ? "700" : "400"};
+  color: ${(props: { ansi: Anser.AnserJsonEntry }) => props.ansi?.fg ? `rgb(${props.ansi?.fg})` : "white"};
+  background-color: ${(props: { ansi: Anser.AnserJsonEntry }) => props.ansi?.bg ? `rgb(${props.ansi?.bg})` : "transparent"};
+`

Некоторые файлы не были показаны из-за большого количества измененных файлов