<!-- 译者:Github@wizardforcel -->
# 文本处理包 #
在我们写完第一个包之后,让我们看一看我们能写出来的其它包的例子。这一节会引导你创建一个简单的命令来将选中的文字替换为字符画(ascii art)。在你在单词“cool”选中的时候运行我们的命令,它会被替换为:
```
o888
ooooooo ooooooo ooooooo 888
888 888 888 888 888 888 888
888 888 888 888 888 888
88ooo888 88ooo88 88ooo88 o888o
```
这个例子应该展示了如何在当前的文本缓冲区做基本的文字操作,以及如何处理选择。
最后的包在 https://github.com/atom/ascii-art 中查看。
## 基本的文字插入 ##
首先按下`cmd-shift-P`来弹出命令面板。然后输入“generate package”并且选择“Package Generator: Generate Package”命令,就像我们在“包生成器”一节中做的那样。输入`ascii-art`作为包的名字。
现在让我们编辑包中的文件,来让我们的字符画包做一些有意思的事情。由于这个包并不需要任何UI,我们可以把所有视图相关的移除,所以可以放心删除`lib/ascii-art-view.coffee`、`spec/ascii-art-view-spec.coffee`和`styles/`。
接下来,打开`lib/ascii-art.coffee`并删除所有视图代码,所以它看起来像这样:
```
{CompositeDisposable} = require 'atom'
module.exports =
subscriptions: null
activate: ->
@subscriptions = new CompositeDisposable
@subscriptions.add atom.commands.add 'atom-workspace',
'ascii-art:convert': => @convert()
deactivate: ->
@subscriptions.dispose()
convert: ->
console.log 'Convert text!'
```
### 创建命令 ###
现在让我们添加一个命令。强烈建议你为你的命令取一个命名空间,使用包名后面带着一个`:`。所以你可以看到在代码中,我们把命令叫做`ascii-art:convert`,并且当它调用时会调用`convert()`方法。
到目前为止,它只会在控制台中记录。让我们使它向文本缓冲区插入一些字符来开始。
```
convert: ->
if editor = atom.workspace.getActiveTextEditor()
editor.insertText('Hello, World!')
```
就像在“字数统计”中那样,我们使用`atom.workspace.getActiveTextEditor()`来获取表示当前活动编辑器的对象。如果`convert()`方法在没有编辑器获取焦点时调用,它会简单地返回一个空白的字符串,所以我们可以跳过下一行。
接下来我们使用`insertText()`方法,向当前的文本编辑器插入一个字符串。无论光标当前在编辑器的哪里,都会在光标处插入文本。如果有文本被选中,会把选中文本替换成“Hello, World!”文本。
### 重新加载包 ###
在我们能够触发`ascii-art:convert`之前,我们需要通过重新加载窗口,来加载我们的包的最新代码。从命令面板或按下`ctrl-alt-cmd-l`来运行“Window: Reload”命令。
### 触发命令 ###
现在可以打开命令面板并搜索“Ascii Art: Convert”命令了。但是根本找不到。要修正它,打开`package.json`并找到`activationCommands`属性。活动命令通过在命令不使用时延迟它们的加载,来加快Atom的启动。所以把现有的命令移除,并在`activationCommands`中添加`ascii-art:convert`:
```
"activationCommands": {
"atom-workspace": "ascii-art:convert"
}
```
首先,通过命令面板中的“Window: Reload”命令重新加载窗口,现在你可以执行“Ascii Art: Convert”命令了,它会输出“Hello, World!”。
### 添加快捷键 ###
现在我们来添加用于触发“ascii-art:convert”命令的快捷键。打开`keymaps/ascii-art.cson`,添加一个键绑定来将`ctrl-alt-a`链接到`ascii-art:convert`命令上。由于你不需要预设的键绑定,你可以删除它们。
完成之后它应该像这样:
```
'atom-text-editor':
'ctrl-alt-a': 'ascii-art:convert'
```
现在重新加载窗口,并验证快捷键是否工作。
## 添加字符画 ##
现在我们需要将被选字符转换为字符画。为了完成它我们使用npm中的`figlet` node模块。打开`package.json`,添加figlet的最新版本到`dependencies`中:
```
"dependencies": {
"figlet": "1.0.8"
}
```
保存文件之后从命令面板运行“Update Package Dependencies: Update”。这会自动安装包的node模块依赖,在这个例子中只有figlet。无论什么时候你更新了`package.json`文件中的`dependencies`字段,你都要需要运行“Update Package Dependencies: Update”命令。
如果由于某种原因没有生效,你会看到“Failed to update package dependencies”这样的消息,并且会找到一个你的目录下有个新的`npm-debug.log`文件。这个文件会告诉你具体哪里有错误。
现在在`lib/ascii-art.coffee`中请求(require)`figlet` node模块,并且将被选文本转换成字符画来代替插入“Hello, World!”。
```
convert: ->
if editor = atom.workspace.getActiveTextEditor()
selection = editor.getSelectedText()
figlet = require 'figlet'
font = "o8"
figlet selection, {font: font}, (error, art) ->
if error
console.error(error)
else
editor.insertText("\n#{art}\n")
```
重新加载编辑器,选择编辑器窗口中的一些文本,并按下`ctrl-alt-a`,取而代之的是,它会被替换成一个滑稽的字符画版本。
在这个例子中,我们需要快速查看一些新的东西。首先是`editor.getSelectedText()`,像你猜的那样,返回当前选中的文本。
之后我们调用Figlet的代码,来将它转换成别的东西,并使用`editor.insertText()`用它替换当前选中的文本。
## 小结 ##
在这一节中,我们编写了一个无UI的包,用于获取选中文本并替换为处理过的版本。它可能会对创建文本提示和检查工具有帮助。