comNG/doc/comNGLang-Syntax.md

131 lines
5.2 KiB
Markdown
Raw Permalink Normal View History

2020-05-30 19:05:02 +08:00
# `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 区分大小写
- [ 和 ] 为可选
### 其他标签
其他的标签比较简单,这里也是尽量包含常用格式,大家试试应该就明白了。