Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

插件的功能 #1

Open
action-hong opened this issue Nov 8, 2023 · 9 comments
Open

插件的功能 #1

action-hong opened this issue Nov 8, 2023 · 9 comments
Labels
enhancement New feature or request

Comments

@action-hong
Copy link
Member

  1. 要不要增加一个过滤不检测文件的配置文件吗,类似.eslintignore。(因为目前来讲仓库里面有一些用来做lint测试的md文件,不过滤的要会提示错误),需要增加的话,你觉得应该叫什么名字(感觉.zhlintignore的名字就很好,但已经被使用了)
  2. 有没有可能这里把每个rule的处理结果也放在debugInfo里返回出来,这样可以做一个类似 git diff 的界面,可视化的查看每个rule都做了什么事情(可能做在playground里更好)。

https://github.com/zhlint-project/zhlint/blob/a44792567bc099d459fd8b1a57f46bf01e5b8dcf/src/run.ts#L112

@Jinjiang

@action-hong action-hong added the enhancement New feature or request label Nov 8, 2023
@action-hong
Copy link
Member Author

https://twitter.com/i/status/1722533717875511315 第2点的大概是这样,

@Jinjiang
Copy link

Jinjiang commented Nov 9, 2023

恩,我觉得每个 rule 的处理结果可以试着放一下,但坦白说我原本的设计里 token 都是 mutable 的,这个追踪起来可能会有些难度或导致性能不理想,这个需要想想看怎么做比较合适。你有好的想法也可以试试看

@Jinjiang
Copy link

Jinjiang commented Nov 9, 2023

有必要的话 .zhlintignore 的格式可以扩展一下或 breaking change 甚至重设计,然后发 v0.8,这个问题不大。

@action-hong
Copy link
Member Author

目前我测试的版本是直接把源码中每个rule处理后的结果收集起来,再拼起来返回出来,目前看大致时可以(2楼的链接是测试效果)。

@@ -63,14 +63,23 @@ const lint = (str, normalizedOptions) => {
const result = (0, parser_1.toMutableResult)((0, parser_1.parse)(value, marks), rules);
parserErrors.push(...result.errors);
const ignoredMarks = (0, ignore_1.default)(value, status.ignoredByRules, logger);
+ const debugDiff = []
ruleHandlers.forEach((rule) => {
(0, parser_1.travel)(result.tokens, rule);
if (globalThis.__DEV__) {
const currentValue = (0, join_1.default)(result.tokens, start, ignoredMarks, []);
+ let changed = false;
if (lastValue !== currentValue) {
logger.log(`[After process by ${rule.name}]`);
logger.log(currentValue);
+ changed = true
}
+ debugDiff.push({
+ ruleName: rule.name,
+ value: currentValue,
+ lastValue: lastValue,
+ changed
+ })
lastValue = currentValue;
}
});
@@ -82,12 +91,39 @@ const lint = (str, normalizedOptions) => {
return {
start,
end,
+ debugDiff,
value: lastValue
};
});
return {
origin: str,
result: (0, replace_block_1.default)(str, modifiedBlocks),
+ diff: modifiedBlocks[0].debugDiff.map((_, ruleIndex) => {
+ // ruleIndex 表示第几个 rule
+ const blocks = modifiedBlocks.map((block) => {
+ return {
+ start: block.start,
+ end: block.end,
+ value: block.debugDiff[ruleIndex].value,
+ changed: block.debugDiff[ruleIndex].changed
+ }
+ })
+ return {
+ blocks,
+ ruleName: modifiedBlocks[0].debugDiff[ruleIndex].ruleName,
+ }
+ }).map((ruleDiff) => {
+ return {
+ ruleName: ruleDiff.ruleName,
+ changed: !!ruleDiff.blocks.find((block) => block.changed),
+ value: (0, replace_block_1.default)(str, ruleDiff.blocks),
+ }
+ }).map((ruleDiff, index, arr) => {
+ return {
+ ...ruleDiff,
+ lastValue: index === 0 ? str : arr[index - 1].value
+ }
+ }),
validations: [...parserErrors, ...ruleErrors]
};
};


设计里 token 都是 mutable 的,这个追踪起来可能会有些难度

抱歉我没怎么看zhlint的源码具体是如何处理的,上述的这样收集的方式可行吗?


  • 性能上那可能不理想,不过这个功能目前测试的版本也是在globalThis.__DEV__true时才收集这些数据,倒是不会影响正常使用
  • ignore的这个功能等v0.8发布后我再加上

@Jinjiang
Copy link

上述的收集方式确实是可行的,但颗粒度是把 token 全部 join 在一起之后,所以是 block 级别的,不确定上层展示的时候是否太局限了。如果你只是想以 block (比如一个段落,或表格里的一个单元格之类的) 展示差异我觉得可行。

@action-hong
Copy link
Member Author

颗粒度是把 token 全部 join 在一起之后,所以是 block 级别的

对的,所以我手动再把每个rule的收集的所有blocks拼起来返回,

最后效果看起来就是完整的了:

屏幕截图(4)


另外目前的版本已经支持了.zhlintrc.zhlintignore 以及之前提到的文件过滤lint,目前暂时用.experimental-zhlintignore这个文件名

以上功能目前默认都是关闭,对应配置:

{
	"zhlint.experimental.config": true,
	"zhlint.experimental.ignore": true,
	"zhlint.experimental.diff": true
}

目前我能想到的功能基本就这些了,可能还会增加:

  • 引用用户本地的zhlint (如果后续有breaking change 的话,那就可能需要和用户本地对齐

@Jinjiang
Copy link

更新了 API 设计:zhlint-project/zhlint#127 (comment)

@Jinjiang
Copy link

Jinjiang commented Feb 1, 2024

v0.7.4 已发布,可以试用一下看看 @action-hong
https://github.com/zhlint-project/zhlint/releases/tag/v0.7.4

@action-hong
Copy link
Member Author

@Jinjiang 好的,这几天找个时间更新下插件

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants