由于自己是程序员,而且比较痴迷于使用各种工具,虽然可能这些工具并没有给我的效率带来太大的提高,但是我就是喜欢折腾这些软件,因为能给我带来快乐和满足感,你说谁不想爽呢。
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我就自己开始造轮子了。
找到Number Convertor这个Workflow,选中任意一个Script Filter右键,弹出菜单之后点击Configure,或者直接双击也行,然后弹出一个配置页面,配置页面的右下方有一个Open workflow folder的按钮,点击之后会打开当前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了。
同理可以再设置一个HexToRGB的行为:
转换成功到了之后,我们把结果保存到剪贴板中,并且通过鼠标拖拽Script Filter节点上的小圆点到Copy to Clipboard节点上,这样就能把Script Filter中获得的结果保存到系统的剪贴板中了。
最后来个实际使用的截图吧:
折腾完毕。