0

I'm trying to develop an extension to show a color code as the icon, however, Albert is caching the images used (SVG/PNG).

Here is the snippet:

# 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

Even when I change the trigger, it uses the same color, but the SVG/PNG is updated correctly in the file explorer.

enter image description here

1

This is not possible atm. Icons are cached for performance reasons. However you could create a file for each color using the RGB code in the name. This would bloat the cache but since you use /tmp this should not be much of an issue.

1
  • Yes, you answered me in the tg group. Thanks!
    – Sr. S
    Nov 18 '21 at 21:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.