comNG/doc/comNGLang-Syntax.md

131 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `comNGLang` 语法
## 简述
`comNGLang``comNG` 定义的一套简单的串口日志语法格式。如果串口输出数据符合 `comNGLang` 的语法格式,这些数据就会在 `comNG` 里自动高亮显示。传统的日志高亮需要在串口数据里添加额外的标识符,比如 [ANSI escape codes](https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html)。这种方式有两个问题:
- 输出端的复杂度增大
- 不是所有的串口助手不支持这种语法
`comNGLang` 不再有类似的问题。
`comNG` 的 editor 组件使用的是 [monaco editor](https://microsoft.github.io/monaco-editor/index.html)vscode 同款。在 monaco editor 里自定义一套语法相对来说比较简单,于是就有了 `comNGLang`
## 语法定义
`comNGLang` 的定义主要是一组正则表达式,现在的实现基本可用。但是由于本人能力有限,所以这套正则定义应该还有很大的提升空间,希望大家有时间可以优化下相关实现。
现在的正则有:
```js
[/^\[?[f|F][a|A][t|T][a|A][l|L]\]?\s.*/, "fatal"],
[/\s+\[?[f|F][a|A][t|T][a|A][l|L]\]?\s+/, "fatal"],
[/^\[?F\]?\s.*/, "fatal"],
[/\s+\[?F\]?\s+/, "fatal"],
[/^\[?[e|E][r|R][r|R][o|O][r|R]\]?\s.*/, "error"],
[/\s+\[?[e|E][r|R][r|R][o|O][r|R]\]?\s+/, "error"],
[/^\[?E\]?\s.*/, "error"],
[/\s+\[?E\]?\s+/, "error"],
[/^\[?[w|W][a|A][r|R][n|N]\]?\s.*/, "warn"],
[/\s+\[?[w|W][a|A][r|R][n|N]\]?\s+/, "warn"],
[/^\[?W\]?\s.*/, "warn"],
[/\s+\[?W\]?\s+/, "warn"],
[/^\[?[i|I][n|N][f|F][o|O]\]?\s.*/, "info"],
[/\s+\[?[i|I][n|N][f|F][o|O]\]?\s+/, "info"],
[/^\[?I\]?\s.*/, "info"],
[/\s+\[?I\]?\s+/, "info"],
[/^\[?[t|T][r|R][a|A][c|C][e|E]\]?\s.*/, "trace"],
[/\s+\[?[t|T][r|R][a|A][c|C][e|E]\]?\s+/, "trace"],
[/^\[?T\]?\s.*/, "trace"],
[/\s+\[?T\]?\s+/, "trace"],
[/^\[?[d|D][e|E][b|B][u|U][g|G]\]?\s.*/, "debug"],
[/\s+\[?[d|D][e|E][b|B][u|U][g|G]\]?\s+/, "debug"],
[/^\[?D\]?\s.*/, "debug"],
[/\s+\[?D\]?\s+/, "debug"],
[/\[\d;\d{2}m/, "useless"],
[/\[\dm/, "useless"],
[/[{}()[\]]/, "bracket"],
[/^\d{1,2}:\d{2}:\d{2}:\d{1,3}/, "timestamp"],
[/\d{1,4}(-|\/|\.|:)\d{1,2}\1\d{1,4}/, "time"],
[
/(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)(-|\/|\.|:)(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\2(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\2(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)/,
"ip",
],
[
/[0-9a-fA-F]{2}(-|\/|\.|:)[0-9a-fA-F]{2}\1[0-9a-fA-F]{2}\1[0-9a-fA-F]{2}\1[0-9a-fA-F]{2}\1[0-9a-fA-F]{2}/,
"mac",
],
[/\d*\.\d+([eE][-+]?\d+)?/, "number"],
[/0[xX][0-9a-fA-F]+/, "number"],
[/[0-9a-fA-F]{2,}/, "number"],
[/\d+/, "number"],
```
这里定义了 **6 级** 日志等级,分别为:
- fatal
- error
- warn
- info
- trace
- debug
还定义了括号、时间戳、时间、ip、mac 地址以及数字。
串口输出的文本符合这些正则的话,在 `comNG` 里会按照定义的规则自动高亮。 高亮的规则如下:
```js
{ token: "number", foreground: "2e7d32" },
{ token: "bracket", foreground: "ff9800" },
{ token: "timestamp", foreground: "009688" },
{ token: "time", foreground: "2196f3" },
{ token: "ip", foreground: "03a9f4" },
{ token: "mac", foreground: "00bcd4" }
{ token: "fatal", foreground: "e91e63" },
{ token: "error", foreground: "f44336" },
{ token: "warn", foreground: "ff9800" },
{ token: "info", foreground: "9e9e9e" },
{ token: "trace", foreground: "9e9d24" },
{ token: "debug", foreground: "2e7d32" },
{ token: "useless", foreground: "cecece" },
```
## 示例
### 备注
- 下文的空格包含: space tab
### 日志等级
几个日志等级的语法是类似的,只是关键字不一样,这里以 fatal 为例。
```js
[/^\[?[f|F][a|A][t|T][a|A][l|L]\]?\s.*/, "fatal"],
[/\s+\[?[f|F][a|A][t|T][a|A][l|L]\]?\s+/, "fatal"],
[/^\[?F\]?\s.*/, "fatal"],
[/\s+\[?F\]?\s+/, "fatal"],
```
-**[fatal] + 空格 开始** 的行,整行被识别为 fatal 标签行,行内所有文本会设置为 fatal 标签的颜色。
- 行内其他标签会被 fatal 标签覆盖
- fatal 不区分大小写,比如: FATAL fatal Fatal fAtal 都可以
- [ 和 ] 为可选
- 匹配 **空格 + [fatal] + 空格** 的 fatal 单词被识别为 fatal 标签单词,该单词会被设置为 fatal 标签的颜色。
- 前后必须有空格
- fatal 不区分大小写,比如: FATAL fatal Fatal fAtal 都可以。
- [ 和 ] 为可选
-**[F] + 空格 开始** 的行,整行被识别为 fatal 标签行,行内所有文本会设置为 fatal 标签的颜色。
- 行内其他标签会被 fatal 标签覆盖
- F 区分大小写
- [ 和 ] 为可选
- 匹配 **空格 + [F] + 空格** 的 F 单词被识别为 fatal 标签单词,该单词会被设置为 fatal 标签的颜色。
- 前后必须有空格
- F 区分大小写
- [ 和 ] 为可选
### 其他标签
其他的标签比较简单,这里也是尽量包含常用格式,大家试试应该就明白了。