由于自己是程序员,而且比较痴迷于使用各种工具,虽然可能这些工具并没有给我的效率带来太大的提高,但是我就是喜欢折腾这些软件,因为能给我带来快乐和满足感,你说谁不想爽呢。
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 中获得的结果保存到系统的剪贴板中了。
最后来个实际使用的截图吧:
折腾完毕。