我正在尝试开发一个扩展来显示颜色代码作为图标,但是 Albert 正在缓存所使用的图像(SVG/PNG)。
以下是代码片段:
# import cairosvg
import albert
import time
import os
import re
__title__ = "colors"
__version__ = "0.4.2"
__triggers__ = "col "
__authors__ = "scmanjarrez"
# __exec_deps__ = ["cairosvg"]
CWD = os.path.dirname(__file__)
HEX = re.compile(r'#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})', re.IGNORECASE)
RGB = re.compile(r'\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)|'
r'(\d{1,3})\s(\d{1,3})\s(\d{1,3})')
# Can be omitted
def initialize():
pass
# Can be omitted
def finalize():
pass
def parse_line(line):
hex = True
match = HEX.match(line)
if match:
col = (match.group(1), match.group(2), match.group(3))
else:
hex = False
match = RGB.match(line)
if match:
col = (match.group(1), match.group(2), match.group(3))
if match.group(1) is None:
col = (match.group(4), match.group(5), match.group(6))
if hex:
hexcol = f"#{col[0]}{col[1]}{col[2]}"
rgbcol = (f"({int(col[0], 16)}, "
f"{int(col[1], 16)}, "
f"{int(col[2], 16)})")
else:
hexcol = f"#{col[0]:x}{col[1]:x}{col[2]:x}"
rgbcol = (f"({int(col[0])}, "
f"{int(col[1])}, "
f"{int(col[2])})")
return hexcol, rgbcol
def handleQuery(query):
if not query.isTriggered:
return
results = []
if not query.string:
item = albert.Item()
item.icon = f"{CWD}/cwheel.svg"
item.text = "Albert color plugin"
item.subtext = "Allowed formats: (r,g,b), r g b and #rrggbb."
results.append(item)
else:
newsvg = ''
with open(f"{CWD}/color.svg", 'r') as cf:
svg = cf.read()
hexcol, rgbcol = parse_line(query.string)
newsvg = re.sub(r'fill:.*?;', f'fill:{hexcol};', svg)
if newsvg:
with open(f"{CWD}/color.svg", 'w') as cf:
cf.write(newsvg)
# cairosvg.svg2png(
# url=f"{CWD}/color.svg", write_to="/tmp/color.png")
item = albert.Item()
item.icon = f"{CWD}/color.svg"
# item.icon = "/tmp/color.png"
item.text = f"hex: {hexcol} | rgb: {rgbcol}"
results.append(item)
return results
即使我改变触发器,它也使用相同的颜色,但 SVG/PNG 在文件资源管理器中正确更新。
答案1
目前这是不可能的。出于性能原因,图标会被缓存。但是,您可以使用名称中的 RGB 代码为每种颜色创建一个文件。这会使缓存膨胀,但由于您使用 /tmp,因此这应该不是什么大问题。