BioforestChain / pkgm

4 stars 0 forks source link

提案:为bfsp/bfsw加入 TaskGroup(任务组)的功能 #18

Open Gaubee opened 2 years ago

Gaubee commented 2 years ago

开发者可以自己配置命令与相关的布局。

首先要实现的是扩展面板,除了默认的tsc/bundle等面板,开发者可以自定义扩展面板。

- panels:
  - title: "Title is Id, is const, with fixed length"
    # 这里重点是布局方案:使用声明式。算法如下:
    # 1. 这里用的单词都是自定义的任意单词,单词以空格进行分割。
    # 2. 构建一个W*H的网格,其中W为单行最大的单词数,H为行数,布局算法使用从上到下,从左到右进行计算。
    # 3. 默认情况下,每一个单词的权重都是一样的,比如:"a b c",那么这三个布局元素就是各占33.3%来进行布局。
    # 4. 如果一个元素发现它在上一行也存在过,那么会尝试将之连接成一个共同体,并且取最小的权重来作为布局。
    #    比如先在有一行"a T X c e", 而后有下一行 "T X f", 那么发现 T 在上一行出现过,
    #    此时T的属性就是:left: max(20%, 0%);right: min( (100%-left)/3 , 40% )
    #               preline.left --^  从左线开始,剩余的右边/数量 --^       ^-- preline.right
    #    如果算法导致出现 left <= right,那么属于布局声明异常
    # 5. 如果同名元素跨行无法连接,那么属于布局声明异常
    layoutTemplateAreas:
    - "nav head"
    - "nav content"
    - "nav footer"
    # 自定义样式,可以使用百分比布局(格式为 [num]%),或者固定行数(格式为 [num]L)
    # 还可以配合声明式函数 min/max/clamp 进行布局
    # 其中 direction 用于声明内容的方向,这里的内容,后续会进行解释
    layoutTemplateStyles:
    - area: nav
      width: 30%
      direction: TD # Top to Down 布局
    - area: content
      height: 100L
      direction: LR # Left to Right 布局
- taskGroup:
  - area: "PANEL ID / AREA NAME"
    tasks: # 这里就是具体的内容,内容有多种类型
    - type: text # 类型text,用于渲染文本
      value: z命令:
      weight: 1L # 默认情况下,文本布局的会基于文本的长度进行计算。如果是LR布局,那么这一行就会竖向渲染
    - type: spawn # 类型spawn,用于生成一个新的进程
      value: node z.js # string 或 Array<string>
      weight: min(5L, 100%) # 内容布局,一般来说会使用min来进行动态布局
    # 以下类型不重要,只是提供一个参考
    - type: node # 类型node,用于直接一段nodejs代码并现实其输出内容
      value: console.log('Hello World')
    - type: text+node # 类型text+node,+ 符号代码管道模式,value会先喂给最后一个命令,最终由第一个命令来渲染输出
      value: '-'.repeat(INLINE_LENGTH)
    - type: linechart # 类型linechart,折线图。一种基于JSON数据渲染的图形
      value: "{data:[1,2,3],xAxis:[\"A\",\"B\",\"C\"]}"
    - type: linechart+spawn # 类型linechart+node,一种运行node程序,将其stdout的数据一直渲染到linechart管道中
      value: node ./linechart.js
  - area: "PANEL ID / AREA NAME 2"
    tasks: []

关于BFSW

在bfsw中,考虑到多个项目的TaskGroup同时运行时,可能还会有一些共享面板的需求,所以声明式面板就很重要。 如果需要,可以将面板定义到某一个bfsp项目中,其它项目可以引入这个项目的面板配置。 在bfsw中,引入多个bfsp,可能会重复定义同名面板,如果这些面板的定义不完全相等,那么就会直接报错。

如果面板的定义相同,那么多个bfsp就可以共享这些面板

ryanroe commented 2 years ago

当前面板支持键盘事件,布局是固定的,输出与面板的关系也是固定的,基于这个背景,扩展面板的加入是为了:

不过这看起来像是第二种,那么是否取消tab方式展示(因为如果不取消,意味着声明文件的属性要能完整支持一个控件的定义,包括前景色/背景色/选中样式等等)

另外(第二种的情况下)

Gaubee commented 2 years ago

@ryanroe 在面板架构重构之后,tsc/bundle/deps等默认tab,也应该使用统一架构进行重构。 本质上,每一个tab的内容输出,只需要一个 stream 提供 stdin/stdout 即可。 比如说type: text,它的stdout就是一段固定文本,stdin则是空。 所以对于type: app,我们需要界定的并不是它能做什么,而是考虑它的“源”是什么?如何把这个源转化成stdin/stdout。

Gaubee commented 2 years ago

@ryanroe 我们的面板上还有两个视图区域。 一个是tab,能够显示title与状态(success/error/busy); 另一个是status,用于显示短文本信息或者通知。 这两则的输出,其实都可以使用扩展ANSI转移序列0x9f来做到。

我后面想了想,底部那条status,其实改成一个input会更好,提供stdin流给应用程序,还能提供history等操作

Gaubee commented 2 years ago

@ryanroe 最后是关于键盘事件绑定。这点其实参考vi就行了。 比如说默认情况下不会键盘并不会提供给tab-content,而只会在全局面板进行控制。 而在按下Enter之后,键盘捕捉就会提供给tab-content,此时所有的键盘输出都会提供给tab-content。 默认情况下,按下Esc就能取消捕捉,或者按下:直接跳出到底部 command-input 区域进行输入。

Gaubee commented 2 years ago

@ryanroe 我们的面板上还有两个视图区域。 一个是tab,能够显示title与状态(success/error/busy); 另一个是status,用于显示短文本信息或者通知。 这两则的输出,其实都可以使用扩展ANSI转移序列0x9f来做到。

我后面想了想,底部那条status,其实改成一个input会更好,提供stdin流给应用程序,还能提供history等操作

这里还有一种做法,就是一个进程的管道其实不止一个,就像stdout与stderr的关系一样。 二者本质上是fs.write(1/process.stdout.fd/ ,buffer)与fs.write(2/process.stderr.fd/ ,buffer) 我不知道程序是否可以再约定一个新的管道 fs.write(3, {title:"", status:"success" }) 来专门做这个事情。