用 Python 写一个简单的 Alfred Workflow 用于颜色值的转换

由于自己是程序员,而且比较痴迷于使用各种工具,虽然可能这些工具并没有给我的效率带来太大的提高,但是我就是喜欢折腾这些软件,因为能给我带来快乐和满足感,你说谁不想爽呢。

Alfred 是我使用 Mac 之后安装的第二个工具软件(正常工作需要的开发软件和浏览器之类的通用软件不算),第一个是 Dash,第二个是 Alfred。Dash 是在试用了 5 分钟不到,查看 Android 帮助文档如飞的响应速度,让我直接购买了正版授权。Alfred 是在当做 Launch 软件使用了快 1 年之后,看了很多人提到的关于 Workflow 的增强功能之后,在某个非常想购物的日子里头买了一个 PowerPack,从此用上了 Workflow 的功能,当然在这一年里头实际上我也就只用了有道词典这么一个 Workflow,其他的几乎不怎么使用,主要还是习惯问题。

这几天手痒,总觉得自己不像个能折腾的程序员,刚好看到一个用于转化数字的 Workflow 感觉还不错,试用了一下之后,我发现其实我自己也有一个比较强的需求可以通过这个 Workflow 来完成。在做 Unity3D 的开发过程中,我们时常会需要使用到调色板来给界面上的文字进行着色,就是设置颜色值。但是美术一般提供过来的就是效果图,或者是 RGB 值,通常格式是这样的 (234,120,54),但是在实际的开发中我们并不是每次都是针对一个 UILabel(我们的 UI 使用 NGUI 开发)进行字体颜色设置,因为有的时候我们只是想突出显示一段文字中的某一部分,这个时候依赖于 NGUI UILabel 的 BBCode 机制,我们可以通过 [ffbbcc] 需要指定颜色显示的文字内容 [-] 这样的方式来实现同一个 UILabel 下的文字使用不同的颜色进行显示。

那么这个时候有一个能快速转换(234,120,54)为 #ea7836 就有一些必要了,参考那个 Number Convertor 我就自己开始造轮子了。

Alfred Workflow设置页面

找到 Number Convertor 这个 Workflow,选中任意一个 Script Filter 右键,弹出菜单之后点击 Configure,或者直接双击也行,然后弹出一个配置页面,配置页面的右下方有一个 Open workflow folder 的按钮,点击之后会打开当前 Workflow 对应的所在目录,然后我们会发现这个目录下面有以下的内容:

Alfred Workflow对应目录

仔细查看一下,我们会发现所有的转化逻辑都是通过 number_convertor.py 文件来完成的,但是这个脚本依赖于一个叫 Workflow 的 Python 库,这个目录里头的 workflow 就是干这个用的。这个 Python 的库可以在这里找到。

以下是的脚本内容:

# -*- coding: utf-8 -*-
import sys
from workflow import Workflow

def main(wf):
    cmd = wf.args[0]
    input_str = wf.args[1]

    values_str = ""
    if cmd == "2rgb":
        values_str = conver_hex_to_rgb(input_str)
        desc = u'将%s 转化为 RGB 格式' % (input_str)
    elif cmd == "2hex":
        values_str = convert_rgb_to_hex(input_str)
        desc = u'将%s 转化为 HEX 格式' % (input_str)
    wf.add_item(title=values_str, subtitle=desc, arg=values_str, valid=True)
    wf.send_feedback()

def ignore_exception(IgnoreException=Exception,DefaultVal=None):
    """ Decorator for ignoring exception from a function
    e.g.   @ignore_exception(DivideByZero)
    e.g.2. ignore_exception(DivideByZero)(Divide)(2/0)
    """
    def dec(function):
        def _dec(*args, **kwargs):
            try:
                return function(*args, **kwargs)
            except IgnoreException:
                return DefaultVal
        return _dec
    return dec

sint = ignore_exception(ValueError,0)(int)


def convert_decimal_to_hex(numstr):
    decimal_var = sint(numstr)
    return "{0:#0{1}x}".format(decimal_var,4)[2:]

def convert_rgb_to_hex(rgb_str):
    if rgb_str.startswith("(") and rgb_str.endswith(")"):
        splits = rgb_str.strip("()").split(",")
        if (len(splits) == 3):
            red_decimal_str = splits[0]
            red_hex = convert_decimal_to_hex(red_decimal_str)
            green_decimal_str = splits[1]
            green_hex = convert_decimal_to_hex(green_decimal_str)
            blue_decimal_str = splits[2]
            blue_hex = convert_decimal_to_hex(blue_decimal_str)
            hex_str = "#" + red_hex + green_hex + blue_hex
            return hex_str
    	else:
    		return ""
    else:
        return ""

def conver_hex_to_rgb(hex_str):
	if hex_str.startswith("#"):
		hex_str = hex_str[1:]
        if len(hex_str) == 6:
            red_decimal_var = sint(hex_str[0:2],16)
            green_decimal_var = sint(hex_str[2:4],16)
            blue_decimal_var = sint(hex_str[4:6],16)
            return "(%d,%d,%d)" % (red_decimal_var, green_decimal_var, blue_decimal_var)
        elif len(hex_str) == 3:
            red_decimal_var = sint(hex_str[0:1] + hex_str[0:1],16)
            green_decimal_var = sint(hex_str[1:2] + hex_str[1:2],16)
            blue_decimal_var = sint(hex_str[2:3] + hex_str[2:3],16)
            return "(%d,%d,%d)" % (red_decimal_var, green_decimal_var, blue_decimal_var)
	else:
		return ""

if __name__ == u"__main__":
    wf = Workflow()
    sys.exit(wf.run(main))


然后我们就可以通过 Workflow -> Add Templates -> Essentials -> Script Filter to Script 创建一个 Workflow,然后通过上面提到的方法进入设置页面打开 Workflow 所在目录,按照 alfred-workflow 的 Python 库的安装方式安装设置好 alfred-workflow,然后将写好的 Python 脚本放到相应的位置,最终目录里头的内容如下:

目录结构

然后再回到 Workflow 设置页面设置一下 keyword 和调用 Python 脚本的方法和参数就 OK 了。

QQ20150511-7@2x

同理可以再设置一个 HexToRGB 的行为:

QQ20150511-8@2x

转换成功到了之后,我们把结果保存到剪贴板中,并且通过鼠标拖拽 Script Filter 节点上的小圆点到 Copy to Clipboard 节点上,这样就能把 Script Filter 中获得的结果保存到系统的剪贴板中了。

Screen Shot 2015-05-11 at 11.35.16 PM

最后来个实际使用的截图吧:

Screen Shot 2015-05-11 at 11.38.12 PM

折腾完毕。