sublime插件gist源码分析(2)

在上一篇里分析了列出和显示gist的功能。
在一篇主要分析下创建、更新、删除gist的功能。
并用一个简单的示例来创建gist。

创建gist

先以”Gist Description (optional):”关键字为线索
在GistCommand类中找到
分析流程

  • 先找选择的区域,
  • 找出内容
  • 输入描述
  • 输入文件名
  • 调用create_gist
  • create_gist中生成相应的json
  • 调用api_request
  • 上传内容

作者的代码在处理的时候,考虑到了多个区间文件被选中,多个文件被选中等多种情况。
考虑用户输入的多种情况,给了默认描述,默认文件名。
但我先关注简单的一个文件的方式。

浓缩流程的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import sublime
import sublime_plugin
import contextlib
import json
import urllib.request as urllib

class ExampleCommand(sublime_plugin.TextCommand):
def run(self, edit):
# 获取选择区域
selectRegions = self.view.sel()
# 获取选择的内容
selectText = self.view.substr(selectRegions[0])
if len(selectText)==0:
# 如果没有,就拿当前文件的所有内容
selectText = self.view.substr(sublime.Region(0, self.view.size()))
window = self.view.window()
# 输入描述之后的回调函数
def on_gist_description(description):
print(description)
# 输入文件名之后的回调函数
def on_gist_fileanme(filename):
# 对post到gist的内容进行组装见https://developer.github.com/v3/gists/#create-a-gist
filedata = {filename:{'content':selectText}}
post_data = json.dumps({'description': description, 'public':'true', 'files':filedata})
# 要换成自己的token,见https://developer.github.com/v3/gists/#authentication
token ='xxx'
# 对内容进行提交
rq = urllib.Request('https://api.github.com/gists')
rq.add_header('Authorization', 'token ' + token)
rq.add_data(bytes(post_data.encode('utf8')))
with contextlib.closing(urllib.urlopen(rq)) as response:
gistjson = json.loads(response.read().decode('utf8', 'ignore'))

print(gistjson)

window.show_input_panel("Input Filename:", '', on_gist_fileanme, None, None)
# 弹出输入框
window.show_input_panel("Input Description:", '', on_gist_description, None, None)

更新和删除gist

更新和创建差不多
重要的是要知道更新的哪一个文件,文件的相关信息是什么。
self.view.settings().get(‘xx’)这种方式来得到文件的相关信息
封装在GistViewCommand中
有文件的相关信息,就使用api进行更新和删除

错误处理

错误处理都是在catch_errors中完成了
对要进行异常捕获的前面加上@catch_errors
这是用的python的装饰模式
可以参见http://coolshell.cn/articles/11265.html

catch_errors中完成了
对参数未配置进行提醒
用的sublime.error_message

在这次看源码的过程中学到了什么

主要有两方面
第一方面对sublime插件api熟悉
第二方面对python的语法运用有了更进一步的理解
比如

  • 字典的的使用
  • 优雅的json的处理方式
  • lambda表达式的使用
  • python的装饰器
  • 函数嵌套
  • 用lib库进行http请求(之前都是用的requests库)
  • 代码结构的组织