动态

详情 返回 返回

sublime 做一款翻譯變量名插件 - 动态 详情

sublime 做一個變量翻譯插件

目標

中文寫一個變量名, 鼠標移上去調用命令能將中文單詞翻譯成變量名,要求能選擇是大駝峯小駝峯還是下劃線

開始

Tools > Developer > New Plugin...

import sublime
import sublime_plugin


class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")

首先思路就是先能取到鼠標所在的單詞.

由於 sublime 是支持多光標的, view.sel()會返回數組

for region in self.view.sel():
    print(region)

ctrl+~打開控制枱, 輸入view.run_command('example') 看打印結果。

tip:

sublime插件最終的命令名是取類名的每個單詞,然後用下劃線拼接,最後去掉`command`字符而來.

如果類名修改為 `TestCommand`, 那麼應該輸入`view.run_command('test')`

如果類名修改為 `TestDevCommand`, 那麼應該輸入`view.run_command('test_dev')`

拿到鼠標所在的位置, 可以通過view.word(regin) 拿到整個單詞的位置

現在代碼如下:

for region in self.view.sel():
    pass
selection = self.view.word(region)
print(selection)

調用 API

sublime 中只能使用內置的模塊,所以使用urllib, API 如下:

urllib.request.urlopen(url, data)

注意: 如果是get請求第二個參數不用填,填了就代表是post請求, 對於get我們自己去拼接url

關於第三方翻譯平台,我使用的是百度,因為在vscode中我也做了一個一摸一樣的插件,所以 API 就拿來用了。

請求第三方翻譯平台代碼:

import hashlib
import json
from urllib import request,parse

def translateBaidu(self, q, fromq, to):
  appid = '20200921000570318'
  secret = 'GLMeRH02ZIQHOCIPlJhW'
  salt = random.random()
  sign = appid + q + str(salt) + secret
  url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
  data = {
    "q": q,
    "appid": appid,
    "from": fromq,
    "to": to,
    "salt": str(salt),
    "sign": hashlib.md5(sign.encode('utf-8')).hexdigest()
  }
  encodeddata = parse.urlencode(data)
  print(encodeddata)
  req = request.Request(url + '?' + encodeddata)
  r = request.urlopen(req)
  print(r)

字符串整合

拿到翻譯後差不多是這樣的:

Aa bb cc

我們需要根據空格分隔單詞,然後拼接成大小駝峯等樣子。

def big_hump(self, s):
  arr = enumerate(s.split())
  arr = map(lambda x: x[1][0].upper() + x[1][1:], arr)
  res = ''.join(list(arr))
  return res

# aaBbCc


def small_hump(self, s):
  def s1(x):
    if x[0] == 0:
      return x[1][0].lower() + x[1][1:]
    else:
      return x[1][0].upper() + x[1][1:]

  arr = enumerate(s.split())
  arr = map(s1, arr)
  res = ''.join(list(arr))
  return res


def underscore_hump(self, s):
  arr = enumerate(s.split())
  arr = map(lambda x: x[1].lower(), arr)
  res = '_'.join(list(arr))
  return res

這裏可以看到咱們英語水平有待提高,這也正是做這款插件的原因。

提供選擇

做出大小駝峯和下劃線三種樣式後,需要提供給用户選擇,這裏調用這個 API 出個彈窗

view.show_popup_menu(list, done_func, index)

最後

因為 sublime 不像 vscode 身家硬, 插件上傳隨便寫, sublime package control 插件想要給別人用還得審核,
以下是全部代碼, 保存到%appdata%\Sublime Text\Packages\User下面就好

%appdata%\Sublime Text\Packages\User 直接複製到資源管理器打開就行,😊
import sublime
import sublime_plugin
import re
from urllib import request,parse
import random
import hashlib
import json


class TranslateCommand(sublime_plugin.TextCommand):
    word_list = []
    region = None

    # 定義異常處理
    def handlingExceptions(code):
        codes = {
            "52001": "請求超時,檢查網絡後重試" ,
            "52002": "系統錯誤, 查看百度翻譯官網公告",
            "52003": "請檢查appid或者服務是否開通",
            "54000": "必填參數為空",
            "54001": " 簽名錯誤",
            "54003": "訪問頻率受限",
            "54004": "賬户餘額不足 ",
            "54005": "長query請求頻繁, 請降低長query的發送頻率,3s後再試 ",
            "58000": "客户端IP非法",
            "58001": "語言不支持",
            "58002": "服務當前已關閉, 請前往管理控制枱開啓服務",
            "90107": "認證未通過或未生效",
        }

    def on_done(self, index):
        if index != -1:
            self.view.replace(self.editor, self.region, self.word_list[index])

    def big_hump(self, s):
        arr = enumerate(s.split())
        arr = map(lambda x: x[1][0].upper() + x[1][1:], arr)
        res = ''.join(list(arr))
        return res

    # aaBbCc


    def small_hump(self, s):
        def s1(x):
            if x[0] == 0:
                return x[1][0].lower() + x[1][1:]
            else:
                return x[1][0].upper() + x[1][1:]

        arr = enumerate(s.split())
        arr = map(s1, arr)
        res = ''.join(list(arr))
        return res


    def underscore_hump(self, s):
        arr = enumerate(s.split())
        arr = map(lambda x: x[1].lower(), arr)
        res = '_'.join(list(arr))
        return res

    # 調用翻譯API
    def translateBaidu(self, q, fromq, to):
        appid = '20200921000570318'
        secret = 'GLMeRH02ZIQHOCIPlJhW'
        salt = random.random()
        sign = appid + q + str(salt) + secret
        url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
        data = {
            "q": q,
            "appid": appid,
            "from": fromq,
            "to": to,
            "salt": str(salt),
            "sign": hashlib.md5(sign.encode('utf-8')).hexdigest()
        }
        encodeddata = parse.urlencode(data)
        req = request.Request(url + '?' + encodeddata)
        r = request.urlopen(req)
        try:
            data = json.loads(r.read().decode(r.info().get_param('charset') or 'utf-8'))
            data = data['trans_result'][0]['dst']
            word_list = data.split()
            arr = []
            if len(word_list) > 0:
                arr.append(self.small_hump(data))
                arr.append(self.big_hump(data))
                arr.append(self.underscore_hump(data))
            else:
                arr.append(data)
            return arr
        except(IndexError, IndentationError):
            print('json解析異常')

    def run(self, editor):
        self.editor = editor
        word_index = -1;
        for region in self.view.sel():
            word_index = region
        if word_index != -1:
            selection = self.view.word(word_index)
            self.region = selection
            word = self.view.substr(selection)
            res = re.search('[\u4e00-\u9fa5]', word)
            if res:
                data = self.translateBaidu(word, 'zh', 'en')
                self.word_list = data
                self.view.show_popup_menu(data, self.on_done, 0)
            pass

如果sublime報錯, 那應該python文件縮進出毛病了, ctrl+P調用一下命令

Indentation: Convert to Tabs

再到Preferences->Key Bindings, 綁定快捷鍵

{
      "keys": ["alt+n"],
      "command": "translate"
}
user avatar tianmiaogongzuoshi_5ca47d59bef41 头像 cyzf 头像 alibabawenyujishu 头像 haoqidewukong 头像 smalike 头像 qingzhan 头像 aqiongbei 头像 chongdianqishi 头像 leexiaohui1997 头像 banana_god 头像 huichangkudelingdai 头像 xiaoxxuejishu 头像
点赞 161 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.