用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

折腾完毕。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据