我想lint(甚至可能自动)在JavaScript中美化空白。问题是是否有任何工具可以做到这一点。
我知道JSLint和JSHint,例如,可以检查缩进和尾随空格,这两个都很好,但这些并不是你可能拥有的唯一种类的空格。
我想检查的是:
- 在某些结构之前或之后是否有空行?
- 有多个空行吗?
- 某些事物之间是否有单个空格(这是由JSLint / JSHint部分检查的)?
- ...
基本上,我想拥有像Visual Studio和Resharper这样的现代IDE可以做的所有事情,但作为可以嵌入到Grunt中的命令行工具。
我发现在这个方向上做的唯一事情是 esformatter,但根据其网站
仍处于早期开发阶段,并且缺少对许多重要功能的支持。
当然,如果有更成熟的东西会很棒。
有任何想法吗?
更新 经过6个月的搜索
我建议你看看 eslint。它建立在可插入linting规则的基础上,这就是你所要求的。你可以使用grunt-plugin 咕噜,eslint 指定linting规则并自动化它。它仍然是pre-alpha,但比esformatter进展得更快。它有一个明确的定义 路线图。
原版的
你问的问题没有简单的答案。所以,让我分解一下,然后分解回答。您需要现有IDE的功能,如Visual Studio和Resharper,在命令行上可以嵌入到Grunt中。广泛地分类您(可能)想要的功能:
- 编译器/调试器
- Lint / flag可疑代码
- 格式化/美化
在制作IDE时,请记住以上所有内容。因此,在IDE中为节点寻找同样强大的格式化器很难。
调试器
我知道可以将eclipse调试器用于节点。检查一下 链接
棉绒/格式化
对于grunt(基于JSLint / JSHint):
- 咕噜-的contrib-jshint
- 咕噜-的JSLint
- 咕噜棉短绒
- 咕噜,jsbeautifier
esformatter
功能强大,因为它使用 esprima 解析和格式化Javascript。它是格式化程序而不是lint,因此在使用之前可能需要使用lint代码。还有一些其他格式化程序正在使用 esprima
你可以看看:
codepainter 使用ECMAscript进行JavaScript美化
从其支持的样式属性,它具有一些您可以使用的功能:
- 缩进:{字符:'?',宽度:? }
- LastEmptyLine:现在,省略
- QuoteType:单,双
- SpaceAfterControlStatements:present,省略
- SpaceAfterAnonymousFunctions:present,省略
- SpacesAroundOperators:存在,省略
- TrailingWhitespaces:strip
esmangle ECMAScript代码管理器/ minifier
esmangle
正在使用 esprima
作为解析器和使用 escodegen
作为代码生成器。看到 演示。
有很多正在为ECMAscript开发的软件包,你可以查看它们 这里
“@Golo:那么你想要的是能够指定在各种语境中各种语言结构之间出现空白的方式吗?(例如,if-then-else如何在do循环内部与顶部内部进行布局?一个功能的水平)?
Golo:那是对的:-)“
那么你需要的是访问代码中每个点的语言结构,以及每个语言元素的精确位置信息(开始/结束行/列)。对于 掉毛,你想要一种方法来针对这些事情的组合编写测试。对于 修理,您想要一种方法来重新生成符合约束的文本。你显然希望所有的配置都很容易。
您想要的“结构”是语法树中的解析器生成的结构。上下文是围绕感兴趣的结构的语法结构。您不需要抽象语法树,因为它会丢失您想要检查/控制其位置的具体标记,因此您需要一个完整的具体分析树。
解析器对精确的源位置不感兴趣,但是词法分析器(需要将输入流分解为语言令牌以提供给解析器)可以收集这些精确的信息。你担心“什么构成列调整和多少”的一些复杂问题。一些例子:制表符:制表符到下一个8字符边界? 4个字符?预先设定的标签栏?在linux上,“LF”提升行号,并将列计数重置为1.在Windows上,它是一对“CR / LF”。在我遇到的其他操作系统上,它只是“CR”;在真正的现代系统中,Unicode换行符应该这样做。所以,如果在Linux上,你应该如何对待CR?如何在文本中找到空字符? ^ Z?其他控制字符(例如,^ L [formfeed])?
给定一个源文件,精确地解析为具有捕获的源位置的CST,现在您要检查结构是否按照您想要的方式对齐。首先,您需要指定结构;循环?构造函数?数据申报?然后,您需要在列位置上使用谓词来为您提供精确控制。
实际上,所有提供语法树的工具都没有提供任何简单的方法来引用这样的结构。几乎你很难编写经典的编译器式程序代码,它知道语法树的形状并爬过它寻找感兴趣的树节点,然后四处查看是否存在其他相关的树节点。进入此模式后,您可以识别所需的树,然后编写更多过程代码以检查间距约定。
程序转换系统(PTS)通常提供“源到源”重写,您可以使用该语言的表面语法直接编写模式。这比在程序上爬树更方便。一些 只要 做源到源模式对;有些提供了仅指定单个模式的能力。 PT系统还必须能够解析感兴趣的语言,并允许您为特定任务添加自定义检查。
例如,我们的DMS软件重新设计工具包解析ECMAScript,并提供此类源模式规范,以及附加自定义条件和操作的功能。举个例子:
domain ECMAScript;
pattern ideal_if_statement_layout(e:expression,s:statement):statement =
" if (\e)
\s" if diagnose_not_equal(column(s),parentheses_column(e));
表达对“if then”语句的兴趣(对“if then else”使用不同的模式),以及对自定义列比较函数的约束,以检查语句元素的位置。 “diagnose_not_equal”自定义函数会产生lint-complaint。引号是元引号;它们是模式匹配语言的一部分,而不是底层语言。 Ë 和 小号 是metavariables,并匹配任何语言结构 表达 和 声明 分别。因为这些都适用于CST,所以它们不能与预期目标不匹配。自定义函数“列”仅获取与最左侧子树相关联的起始列信息 小号; DMS中的树管理API使这一点变得非常简单。需要“括号列”,因为模式会告诉您在哪里 Ë 是; “(”位于上面的树节点中 Ë 因此,需要对树进行一些轻微的导航才能找到“(”,然后提取它 最右边 列,也可以使用DMS树API轻松完成。
你可以构建任意复杂的模式;你也可以在一个模式中创造条件,取决于另一个模式的匹配。因此,使用适量的自定义列提取功能,您可以编写各种linting检查。
这不会让你检查“if”关键字是“(”关键字左侧的一个空格,很容易。你可以在某种程度上表达添加自定义检查,例如“statement_keyword_column”等。但这开始变得尴尬。
你可能会注意到 布局 模式;将它作为约束也很好。 DMS没有提供直接的方法来做到这一点。但是,它完全能够阅读自己的模式描述 作为树木。使用它,可以提取模式的适当布局,并使用它来检查结构布局。这需要使用DMS的一些复杂性,但这是汗水,而不是理论或缺少机制。
我个人不喜欢布局很多;我更喜欢这个文件只是重塑了。
DMS确实具有漂亮的打印规则,可以将您的CST(无论其布局如何)转换为由其漂亮打印规则控制的布局。目前,这些规则特定于树节点,并用语法编码,因此它们有些受限。一个人可以写(在语法中):
stmt = 'if' expression stmt ';'
<<PrettyPrinter>>: { V(H('if,expression),I(stmt[1])) }
这将导致所有if-then语句重新生成为:
if expresssion
stmt
[V表示两个子盒的“垂直盒子”; H表示“水平框”,我的意思是“缩进框”]
仔细使用这些漂亮的打印规则可以很好地重新格式化代码。它并不完美,因为你无法通过这种方式控制多个语句的布局。但这是DMS的一部分,实际上很容易修改。
理想的解决方案是使用模式语言,并使用模式中的布局来控制漂亮打印。这是我们的计划,但唉,还没有在DMS中。
我认为其他PTS可以在某种程度上表达模式,如上所述,并且它们中的大多数都有某种方式来指定像DMS那样的漂亮印刷。所以好消息是这些工具可以满足您的需求。不太好的消息是选择其中一个工具并学会使用它的努力;一个下午不会一蹴而就。
基本上,我想拥有像Visual Studio和Resharper这样的现代IDE可以做的所有事情,但作为可以嵌入到Grunt中的命令行工具。
这个怎么样: https://npmjs.org/package/grunt-jsbeautifier
它本质上是 https://npmjs.org/package/js-beautify 包裹成一个Grunt任务。
编辑,扩展我原来的答案: 我不熟悉VS Resharper的功能,但是 - 至少根据自述文件 - 有一个选项可以让JSLint感到高兴(我们都知道这可能是多么挑剔)。
我使用Eclipse,因为我编写java,javascript,perl(EPIC插件),shell脚本等等。 Eclipse可以轻松地使用这些语言编写任何这些语言的格式 CTRL-SHIFT-F
捷径。这对我来说效果很好 IDE。
对于 命令行,你可以调用eclipse的格式化工具。看到:
- Eclipse命令行格式化Java代码
- Eclipse Java格式化程序可以独立使用吗?
总而言之,除非你或你团队中的人已经在使用Eclipse,否则它可能比你正在寻找更多的开销。但! Eclipse的代码格式是高度可配置的,可以处理一些空白/空行问题。