- 有助于提高体贴性写作能力
- 捕捉许多可能的冒犯表述
- 提供有用的替代建议
- 可读取纯文本、HTML、MDX或markdown作为输入
- 风格优雅
安装
$ npm install alex --global
使用 yarn:
$ yarn global add alex
或者你可以按照这个步骤教程进行操作: 在你的项目中设置 alex
目录
- 检查项
- 集成
- 忽略文件
.alexignore
- 控制
- 配置
- 命令行界面
- API
markdown(value, config)
mdx(value, config)
html(value, config)
text(value, config)
- 工作流程
- 常见问题
- 这太蠢了!
- alex没有检查"X"!
- 为什么叫alex?
- 延伸阅读
- 贡献
- 起源故事
- 致谢
- 许可证
检查项目
alex 检查以下内容:
- 带性别倾向的职业头衔(如果你写"垃圾男",alex 会建议用"垃圾收集员";如果你写"房东",alex 会建议用"业主")
- 带性别倾向的谚语(如果你写"像个男人一样",alex 会建议用"勇敢地";如果你写"淑女般的",alex 会建议用"有礼貌的")
- 歧视残疾人的语言(如果你写"学习障碍",alex 会建议用"有学习障碍的人")
- 居高临下的语言(如果你写"显然"或"众所周知",alex 会对此发出警告)
- 不宽容的措辞(如果你写"主人"和"奴隶",alex 会建议用"主要"和"副本")
- 亵渎语(如果你写"屁股"🍑,alex 会对此发出警告) ……还有更多!
注意:alex 假定你的意图是善意的:你并不是有意冒犯他人!
查看 retext-equality
和 retext-profanities
了解所有规则。
alex 会忽略字面意义上的词语,所以 "他"
、他 — ……
,以及类似用法不会被警告。
集成
- Sublime —
sindresorhus/SublimeLinter-contrib-alex
- Gulp —
dustinspecker/gulp-alex
- Slack —
keoghpe/alex-slack
- Ember —
yohanmishkin/ember-cli-alex
- Probot —
swinton/linter-alex
- GitHub Actions —
brown-ccv/alex-recommends
- GitHub Actions(reviewdog) —
reviewdog/action-alex
- Vim —
w0rp/ale
- 浏览器扩展 —
skn0tt/alex-browser-extension
- Contentful —
stefanjudis/alex-js-contentful-ui-extension
- Figma —
nickradford/figma-plugin-alex
- VSCode —
tlahmann/vscode-alex
忽略文件
CLI 在给定目录时会搜索带有 markdown 或文本扩展名的文件(因此 $ alex .
会找到 readme.md
和 path/to/file.txt
)。要防止文件被发现,请创建一个 .alexignore
文件。
.alexignore
CLI 有时会搜索文件。要防止文件被发现,请在当前工作目录(即运行 alex
的位置)上方的某个目录中添加一个名为 .alexignore
的文件。这些文件的格式类似于 .eslintignore
(而后者又类似于 .gitignore
文件)。
例如,当在 ~/path/to/place
中工作时,忽略文件可以位于 to
、place
或 ~
中。
本项目自身的忽略文件看起来像这样:
# `node_modules` 默认被忽略。
example.md
控制
有时alex会出错:
这句话会弹出一条消息。
结果如下:
readme.md
1:15-1:18 警告 `pop` 可能有歧义,请改用 `parent` dad-mom retext-equality
⚠ 1 个警告
可以使用 Markdown 中的 HTML 注释来忽略它们:
<!--alex ignore dad-mom-->
这句话将**不会**弹出消息。
结果如下:
readme.md: 未发现问题
ignore
会关闭注释后面内容的消息(在这个例子中是该段落)。
也可以使用 disable
在注释后关闭消息,然后使用 enable
重新开启这些消息:
<!--alex disable dad-mom-->
这句话将**不会**弹出消息。
这句话也**不会**弹出消息。
再来一句话,同样**不会**弹出消息。
<!--alex enable dad-mom-->
这句话会弹出消息。
结果如下:
readme.md
9:15-9:18 警告 `pop` 可能有歧义,请改用 `parent` dad-mom retext-equality
⚠ 1 个警告
可以一次控制多个消息:
<!--alex disable he-her his-hers dad-mom-->
…通过省略所有规则标识符,可以控制所有消息:
<!--alex ignore-->
配置
您可以通过 .alexrc
配置文件控制 alex:
{
"allow": ["boogeyman-boogeywoman"]
}
…如果文件名为 .alexrc.yml
或 .alexrc.yaml
,您可以使用 YAML:
allow:
- dad-mom
…如果文件名为 .alexrc.js
,您还可以使用 JavaScript:
// 但像这样随机设置是个坏主意!
exports.profanitySureness = Math.floor(Math.random() * 3)
…最后,还可以在 package.json
中使用 alex
字段:
{
…
"alex": {
"noBinary": true
},
…
}
allow
字段应为规则数组或 undefined
(默认为 undefined
)。提供时,将跳过并不报告指定的规则。
deny
字段应为规则数组或 undefined
(默认为 undefined
)。提供时,仅报告指定的规则。
不能同时使用 allow
和 deny
。
noBinary
字段应为布尔值(默认为 false
)。
开启(true
)时,像 he and she
和 garbageman or garbagewoman
这样的配对将被视为错误。
关闭(false
,默认)时,这样的配对是可以的。
profanitySureness
字段是一个数字(默认为 0
)。
我们使用 cuss
,它有一个词典,对单词或短语作为亵渎语的可能性(而非其"糟糕"程度)进行 0 到 2 的评级:
评级 | 作为亵渎语使用 | 在干净文本中使用 | 示例 |
---|---|---|---|
2 | 可能 | 不太可能 | asshat |
1 | 可能 | 可能 | addict |
0 | 不太可能 | 可能 | beaver |
profanitySureness 字段是您想要检查的最低评级(包含该评级)。 | |||
如果您将其设置为 1 (可能),那么它会对级别 1 和 2 (可能)的亵渎语发出警告,但不会对级别 0 (不太可能)的发出警告。 |
CLI
![][截图]
假设example.md
内容如下:
妖怪将所有更改写入**主服务器**。因此,从服务器是主服务器的只读副本。不过别担心,他是个残疾人。
现在,在example.md
上运行alex:
$ alex example.md
输出结果:
example.md
1:5-1:14 警告 `boogeyman`可能有冒犯性,请使用`boogeymonster`代替 boogeyman-boogeywoman retext-equality
1:42-1:48 警告 `master` / `slaves`可能有冒犯性,请使用`primary` / `replica`代替 master-slave retext-equality
1:69-1:75 警告 不要使用`slaves`,这是亵渎性词语 slaves retext-profanities
2:52-2:54 警告 `he`可能有冒犯性,请使用`they`、`it`代替 he-she retext-equality
2:61-2:68 警告 `cripple`可能有冒犯性,请使用`person with a limp`代替 gimp retext-equality
⚠ 5 个警告
使用$ alex --help
获取更多信息。
当没有给alex输入文件时,它会在当前目录、
doc
和docs
中搜索文件。 如果给定--mdx
参数,它会搜索mdx
扩展名的文件。 如果给定--html
参数,它会搜索htm
和html
扩展名的文件。 否则,它会搜索txt
、text
、md
、mkd
、mkdn
、mkdown
、ron
和markdown
扩展名的文件。
API
本包是仅支持 ESM的:
需要 Node 14+ 版本才能使用,且必须通过 import
而不是 require
来引入。
npm:
$ npm install alex --save
本包导出了标识符 markdown
、mdx
、html
和 text
。
默认导出为 markdown
。
markdown(value, config)
检查 Markdown(忽略语法)。
参数
value
(VFile
或string
) — Markdown 文档config
(Object
,可选) — 参见[配置][]部分
返回值
你可能对其 messages
属性感兴趣,如下例所示,因为它包含了可能的违规信息。
示例
import alex from 'alex'
alex('We've confirmed his identity.').messages
输出:
[
{
message: '`his` 在指代人时可能不够敏感,请使用 `their`、`theirs`、`them` 替代',
name: '1:17-1:20',
reason: '`his` 在指代人时可能不够敏感,请使用 `their`、`theirs`、`them` 替代',
line: 1,
column: 17,
location: { start: [Object], end: [Object] },
source: 'retext-equality',
ruleId: 'her-him',
fatal: false,
actual: 'his',
expected: [ 'their', 'theirs', 'them' ]
}
]
mdx(value, config)
检查 MDX(忽略语法)。
注意:alex 使用的是目前处于 beta 阶段的 MDX@2 语法。
参数
value
(VFile
或string
) — MDX 文档config
(Object
,可选) — 参见[配置][]部分
返回值
示例
import {mdx} from 'alex'
mdx('<Component>He walked to class.</Component>').messages
输出:
[
{
reason: '`He` 可能不够敏感,请使用 `They`、`It` 替代',
line: 1,
column: 12,
location: { start: [Object], end: [Object] },
source: 'retext-equality',
ruleId: 'he-she',
fatal: false,
actual: 'He',
expected: [ 'They', 'It' ]
}
]
html(value, config)
检查 HTML(忽略语法)。
参数
value
(VFile
或string
) — HTML 文档config
(Object
,可选) — 参见[配置][]部分
返回值
示例
import {html} from 'alex'
html('<p class="black">He walked to class.</p>').messages
输出:
[
{
message: '`He` 可能不够敏感,请使用 `They`、`It` 替代',
name: '1:18-1:20',
reason: '`He` 可能不够敏感,请使用 `They`、`It` 替代',
line: 1,
column: 18,
location: { start: [Object], end: [Object] },
source: 'retext-equality',
ruleId: 'he-she',
fatal: false,
actual: 'He',
expected: [ 'They', 'It' ]
}
]
text(value, config)
检查纯文本(包括语法检查)。
参数
value
(VFile
或string
) — 文本文档config
(Object
,可选) — 参见[配置][]部分
返回值
示例
import {markdown, text} from 'alex'
markdown('The `boogeyman`.').messages // => []
text('The `boogeyman`.').messages
输出:
[
{
message: '`boogeyman` 可能不够敏感,请使用 `boogeymonster` 替代',
name: '1:6-1:15',
reason: '`boogeyman` 可能不够敏感,请使用 `boogeymonster` 替代',
line: 1,
column: 6,
location: Position { start: [Object], end: [Object] },
source: 'retext-equality',
ruleId: 'boogeyman-boogeywoman',
fatal: false,
actual: 'boogeyman',
expected: [ 'boogeymonster' ]
}
]
工作流程
建议的工作流程是将 alex 添加到 package.json
中,并在 Travis 中与您的测试一起运行。
一个使用 npm scripts 的 package.json
文件,并额外使用 AVA 进行单元测试,可能如下所示:
{
"scripts": {
"test-api": "ava",
"test-doc": "alex",
"test": "npm run test-api && npm run test-doc"
},
"devDependencies": {
"alex": "^1.0.0",
"ava": "^0.1.0"
}
}
如果您使用 Travis 进行持续集成,在 .travis.yml
中设置类似以下内容:
script:
- npm test
+ - alex --diff
请确保仍然安装 alex!
如果使用 --diff
标志,并且检测到 Travis,则会忽略此次推送中未更改的行。
使用这个工作流程,即使 PR 有警告,您也可以合并它。然后,如果有人编辑了一个完全不同的文件,他们不会被已存在的警告所困扰,只会关注他们添加的内容!
常见问题
这太蠢了!
这不是一个问题。 是的,alex 并不是很聪明。 人类在这方面做得更好。 但人也会犯错,而 alex 就是来帮忙的。
alex 没有检查"X"!
请查看 contributing.md
了解如何让 alex 检查"X"。
为什么叫 alex?
这是一个不分性别的好名字,在 npm 上还未被使用,我很喜欢! :smile:
延伸阅读
没有任何自动化工具可以取代学习包容性沟通和倾听他人的亲身经历。
alex
工具的错误可以成为学习更多知识的契机。
以下资源可作为起点,帮助你在 alex
工具之外深化自身理解和编辑技能:
- 18F 内容指南提供了一系列有用的链接,指向新闻和学术写作中使用的其他包容性语言指南。
- Conscious Style Guide涵盖了许多语言使用的微妙话题。例如,种族和民族这两个术语有不同的含义,选择正确的词语取决于你。
同样,过度概括某个群体的句子(如"开发者喜欢整天编码")可能不会被
alex
发现,但它并不具有包容性。优秀的人工编辑可以迎接挑战,找到更好的表达方式。 - 有时,了解什么是包容性的唯一方法就是询问。 在残疾是一个细微的问题一文中,Nicolas Steenhout 写道,以人为本的语言,如"有残疾的人",并不总是正确的选择。
- 语言在不断演变。一年前中性的术语到今天可能就成了问题。像Self-Defined Dictionary这样的项目旨在收集我们用来定义自己和他人的词语,并将它们与历史和一些有用的建议联系起来。
- 无意识偏见存在于日常决策和对话中,也可能出现在写作中。 Textio提供了一些例子,说明描述性形容词的选择和语气如何会疏远某些人,以及地区性语言差异如何可能导致混淆。
- 使用复杂的句子和罕见的词汇可能导致内容不够包容。这在Harver的这篇文章中被描述为读写能力排斥。 如果你的内容面向全球受众,这一点尤为重要,因为读者最擅长的语言可能不是你写作所用的语言。
贡献
请参阅 get-alex/.github
仓库中的 contributing.md
文件,了解如何开始贡献。
如需获取帮助,请查看 support.md
文件。
本项目遵循行为准则。
通过与此仓库、组织或社区进行互动,即表示您同意遵守其条款。
起源故事
感谢 @iheanyi 提出这个问题,以及 @sindresorhus 激发我(@wooorm)采取行动。
当 alex 推出时,它在 Twitter 和 Product Hunt 上获得了一些关注。随后,出现了大量媒体报道和新闻报导。
致谢
alex 的初步工作始于2015年。
该项目由 @wooorm 创作。
自那以后,许多人为此做出了贡献!