示例#1
0
    def format_info(self, color):
        """ Format the selected color info """
        rgba = RGBA(color)

        try:
            web_color = webcolors.hex_to_name(color)
        except:
            web_color = None

        info = ['<h1 class="header">%s</h1>' % color]
        if web_color is not None:
            info.append('<strong>%s</strong><br><br>' % web_color)
        info.append('<a href="__palettes__">%s</a><br><br>' %
                    color_box(color, border_color, size=64))
        info.append('<span class="key">r:</span> %d ' % rgba.r +
                    '<span class="key">g:</span> %d ' % rgba.g +
                    '<span class="key">b:</span> %d<br>' % rgba.b)
        h, s, v = rgba.tohsv()
        info.append('<span class="key">h:</span> %.0f ' % (h * 360.0) +
                    '<span class="key">s:</span> %.0f ' % (s * 100.0) +
                    '<span class="key">v:</span> %.0f<br>' % (v * 100.0))
        h, l, s = rgba.tohls()
        info.append('<span class="key">h:</span> %.0f ' % (h * 360.0) +
                    '<span class="key">s:</span> %.0f ' % (s * 100.0) +
                    '<span class="key">l:</span> %.0f<br>' % (l * 100.0))
        return ''.join(info)
示例#2
0
def translate_color(m, use_hex_argb=False, decode=False):
    """Translate the match object to a color w/ alpha."""

    color = None
    alpha = None
    alpha_dec = None
    if m.group('hex_compressed'):
        if decode:
            content = m.group('hex_compressed_content').decode('utf-8')
        else:
            content = m.group('hex_compressed_content')
        color = "#%02x%02x%02x" % (int(content[0:1] * 2,
                                       16), int(content[1:2] * 2,
                                                16), int(content[2:3] * 2, 16))
    elif m.group('hexa_compressed') and use_hex_argb:
        if decode:
            content = m.group('hexa_compressed_content').decode('utf-8')
        else:
            content = m.group('hexa_compressed_content')
        color = "#%02x%02x%02x" % (int(content[1:2] * 2,
                                       16), int(content[2:3] * 2,
                                                16), int(content[3:] * 2, 16))
        alpha = content[0:1]
        alpha_dec = fmt_float(float(int(alpha, 16)) / 255.0, 3)
    elif m.group('hexa_compressed'):
        if decode:
            content = m.group('hexa_compressed_content').decode('utf-8')
        else:
            content = m.group('hexa_compressed_content')
        color = "#%02x%02x%02x" % (int(content[0:1] * 2,
                                       16), int(content[1:2] * 2,
                                                16), int(content[2:3] * 2, 16))
        alpha = content[3:]
        alpha_dec = fmt_float(float(int(alpha, 16)) / 255.0, 3)
    elif m.group('hex'):
        if decode:
            content = m.group('hex_content').decode('utf-8')
        else:
            content = m.group('hex_content')
        if len(content) == 6:
            color = "#%02x%02x%02x" % (int(
                content[0:2], 16), int(content[2:4], 16), int(
                    content[4:6], 16))
        else:
            color = "#%02x%02x%02x" % (int(
                content[0:1] * 2, 16), int(content[1:2] * 2,
                                           16), int(content[2:3] * 2, 16))
    elif m.group('hexa') and use_hex_argb:
        if decode:
            content = m.group('hexa_content').decode('utf-8')
        else:
            content = m.group('hexa_content')
        if len(content) == 8:
            color = "#%02x%02x%02x" % (int(
                content[2:4], 16), int(content[4:6], 16), int(content[6:], 16))
            alpha = content[0:2]
            alpha_dec = fmt_float(float(int(alpha, 16)) / 255.0, 3)
        else:
            color = "#%02x%02x%02x" % (int(
                content[1:2] * 2, 16), int(content[2:3] * 2,
                                           16), int(content[3:] * 2, 16))
            alpha = content[0:1]
            alpha_dec = fmt_float(float(int(alpha, 16)) / 255.0, 3)
    elif m.group('hexa'):
        if decode:
            content = m.group('hexa_content').decode('utf-8')
        else:
            content = m.group('hexa_content')
        if len(content) == 8:
            color = "#%02x%02x%02x" % (int(
                content[0:2], 16), int(content[2:4], 16), int(
                    content[4:6], 16))
            alpha = content[6:]
            alpha_dec = fmt_float(float(int(alpha, 16)) / 255.0, 3)
        else:
            color = "#%02x%02x%02x" % (int(
                content[0:1] * 2, 16), int(content[1:2] * 2,
                                           16), int(content[2:3] * 2, 16))
            alpha = content[3:]
            alpha_dec = fmt_float(float(int(alpha, 16)) / 255.0, 3)
    elif m.group('rgb'):
        if decode:
            content = [
                x.strip()
                for x in m.group('rgb_content').decode('utf-8').split(',')
            ]
        else:
            content = [x.strip() for x in m.group('rgb_content').split(',')]
        if content[0].endswith('%'):
            r = round_int(
                clamp(float(content[0].strip('%')), 0.0, 255.0) *
                (255.0 / 100.0))
            g = round_int(
                clamp(float(content[1].strip('%')), 0.0, 255.0) *
                (255.0 / 100.0))
            b = round_int(
                clamp(float(content[2].strip('%')), 0.0, 255.0) *
                (255.0 / 100.0))
            color = "#%02x%02x%02x" % (r, g, b)
        else:
            color = "#%02x%02x%02x" % (clamp(
                round_int(float(content[0])), 0,
                255), clamp(round_int(float(content[1])), 0,
                            255), clamp(round_int(float(content[2])), 0, 255))
    elif m.group('rgba'):
        if decode:
            content = [
                x.strip()
                for x in m.group('rgba_content').decode('utf-8').split(',')
            ]
        else:
            content = [x.strip() for x in m.group('rgba_content').split(',')]
        if content[0].endswith('%'):
            r = round_int(
                clamp(float(content[0].strip('%')), 0.0, 255.0) *
                (255.0 / 100.0))
            g = round_int(
                clamp(float(content[1].strip('%')), 0.0, 255.0) *
                (255.0 / 100.0))
            b = round_int(
                clamp(float(content[2].strip('%')), 0.0, 255.0) *
                (255.0 / 100.0))
            color = "#%02x%02x%02x" % (r, g, b)
        else:
            color = "#%02x%02x%02x" % (clamp(
                round_int(float(content[0])), 0,
                255), clamp(round_int(float(content[1])), 0,
                            255), clamp(round_int(float(content[2])), 0, 255))
        if content[3].endswith('%'):
            alpha, alpha_dec = alpha_percent_normalize(content[3])
        else:
            alpha, alpha_dec = alpha_dec_normalize(content[3])
    elif m.group('gray'):
        if decode:
            content = m.group('gray_content').decode('utf-8')
        else:
            content = m.group('gray_content')
        if content.endswith('%'):
            g = round_int(
                clamp(float(content.strip('%')), 0.0, 255.0) * (255.0 / 100.0))
        else:
            g = clamp(round_int(float(content)), 0, 255)
        color = "#%02x%02x%02x" % (g, g, g)
    elif m.group('graya'):
        if decode:
            content = [
                x.strip()
                for x in m.group('graya_content').decode('utf-8').split(',')
            ]
        else:
            content = [x.strip() for x in m.group('graya_content').split(',')]
        if content[0].endswith('%'):
            g = round_int(
                clamp(float(content[0].strip('%')), 0.0, 255.0) *
                (255.0 / 100.0))
        else:
            g = clamp(round_int(float(content[0])), 0, 255)
        color = "#%02x%02x%02x" % (g, g, g)
        if content[1].endswith('%'):
            alpha, alpha_dec = alpha_percent_normalize(content[1])
        else:
            alpha, alpha_dec = alpha_dec_normalize(content[1])
    elif m.group('hsl'):
        if decode:
            content = [
                x.strip()
                for x in m.group('hsl_content').decode('utf-8').split(',')
            ]
        else:
            content = [x.strip() for x in m.group('hsl_content').split(',')]
        rgba = RGBA()
        hue = float(content[0])
        if hue < 0.0 or hue > 360.0:
            hue = hue % 360.0
        h = hue / 360.0
        s = clamp(float(content[1].strip('%')), 0.0, 100.0) / 100.0
        l = clamp(float(content[2].strip('%')), 0.0, 100.0) / 100.0
        rgba.fromhls(h, l, s)
        color = rgba.get_rgb()
    elif m.group('hsla'):
        if decode:
            content = [
                x.strip()
                for x in m.group('hsla_content').decode('utf-8').split(',')
            ]
        else:
            content = [x.strip() for x in m.group('hsla_content').split(',')]
        rgba = RGBA()
        hue = float(content[0])
        if hue < 0.0 or hue > 360.0:
            hue = hue % 360.0
        h = hue / 360.0
        s = clamp(float(content[1].strip('%')), 0.0, 100.0) / 100.0
        l = clamp(float(content[2].strip('%')), 0.0, 100.0) / 100.0
        rgba.fromhls(h, l, s)
        color = rgba.get_rgb()
        if content[3].endswith('%'):
            alpha, alpha_dec = alpha_percent_normalize(content[3])
        else:
            alpha, alpha_dec = alpha_dec_normalize(content[3])
    elif m.group('hwb'):
        if decode:
            content = [
                x.strip()
                for x in m.group('hwb_content').decode('utf-8').split(',')
            ]
        else:
            content = [x.strip() for x in m.group('hwb_content').split(',')]
        rgba = RGBA()
        hue = float(content[0])
        if hue < 0.0 or hue > 360.0:
            hue = hue % 360.0
        h = hue / 360.0
        w = clamp(float(content[1].strip('%')), 0.0, 100.0) / 100.0
        b = clamp(float(content[2].strip('%')), 0.0, 100.0) / 100.0
        rgba.fromhwb(h, w, b)
        color = rgba.get_rgb()
    elif m.group('hwba'):
        if decode:
            content = [
                x.strip()
                for x in m.group('hwba_content').decode('utf-8').split(',')
            ]
        else:
            content = [x.strip() for x in m.group('hwba_content').split(',')]
        rgba = RGBA()
        hue = float(content[0])
        if hue < 0.0 or hue > 360.0:
            hue = hue % 360.0
        h = hue / 360.0
        w = clamp(float(content[1].strip('%')), 0.0, 100.0) / 100.0
        b = clamp(float(content[2].strip('%')), 0.0, 100.0) / 100.0
        rgba.fromhwb(h, w, b)
        color = rgba.get_rgb()
        if content[3].endswith('%'):
            alpha, alpha_dec = alpha_percent_normalize(content[3])
        else:
            alpha, alpha_dec = alpha_dec_normalize(content[3])
    elif m.group('webcolors'):
        try:
            if decode:
                color = csscolors.name2hex(
                    m.group('webcolors').decode('utf-8')).lower()
            else:
                color = csscolors.name2hex(m.group('webcolors')).lower()
        except:
            pass
    return color, alpha, alpha_dec
示例#3
0
 def insert_color(self, target_color):
     sels = self.view.sel()
     if (len(sels) == 1 and sels[0].size() == 0):
         try:
             web_color = webcolors.hex_to_name(target_color)
         except:
             web_color = None
         point = sels[0].begin()
         visible = self.view.visible_region()
         start = point - 50
         end = point + 50
         convert_rgb = False
         convert_hsl = False
         alpha = None
         region = sublime.Region(point)
         if start < visible.begin():
             start = visible.begin()
         if end > visible.end():
             end = visible.end()
         bfr = self.view.substr(sublime.Region(start, end))
         ref = point - start
         found = False
         for m in COLOR_RE.finditer(bfr):
             if ref >= m.start(0) and ref < m.end(0):
                 found = True
                 if m.group('hex'):
                     region = sublime.Region(
                         m.start('hex') + start,
                         m.end('hex') + start)
                     break
                 elif m.group('rgb'):
                     if web_color:
                         region = sublime.Region(
                             m.start('rgb') + start,
                             m.end('rgb') + start)
                     else:
                         region = sublime.Region(
                             m.start('rgb_content') + start,
                             m.end('rgb_content') + start)
                         convert_rgb = True
                     break
                 elif m.group('rgba'):
                     web_color = None
                     region = sublime.Region(
                         m.start('rgba_content') + start,
                         m.end('rgba_content') + start)
                     convert_rgb = True
                     content = [
                         x.strip()
                         for x in m.group('rgba_content').split(',')
                     ]
                     alpha = content[3]
                     break
                 elif m.group('hsl'):
                     if web_color:
                         region = sublime.Region(
                             m.start('hsl') + start,
                             m.end('hsl') + start)
                     else:
                         region = sublime.Region(
                             m.start('hsl_content') + start,
                             m.end('hsl_content') + start)
                         convert_hsl = True
                     break
                 elif m.group('hsla'):
                     web_color = None
                     region = sublime.Region(
                         m.start('hsla_content') + start,
                         m.end('hsla_content') + start)
                     convert_hsl = True
                     content = [
                         x.strip().rstrip('%')
                         for x in m.group('hsla_content').split(',')
                     ]
                     alpha = content[3]
                     break
                 elif m.group('hash'):
                     region = sublime.Region(
                         m.start('hash') + start,
                         m.end('hash') + start)
                     break
                 elif m.group('rgb'):
                     if not web_color:
                         convert_rgb = True
                     break
                 elif m.group('rgba'):
                     convert_rgb = True
                     alpha = '1'
                     break
                 elif m.group('hsl'):
                     if not web_color:
                         convert_hsl = True
                     break
                 elif m.group('rgb'):
                     convert_hsl = True
                     alpha = '1'
                     break
                 else:
                     found = False
         if not found:
             word_region = self.view.word(sels[0])
             word = self.view.substr(word_region)
             try:
                 webcolors.name_to_hex(word).lower()
                 region = word_region
             except:
                 pass
         if web_color:
             value = web_color
         elif convert_rgb:
             value = "%d, %d, %d" % (int(
                 target_color[1:3], 16), int(
                     target_color[3:5], 16), int(target_color[5:7], 16))
             if alpha:
                 value += ', %s' % alpha
         elif convert_hsl:
             hsl = RGBA(target_color)
             h, l, s = hsl.tohls()
             value = "%d, %d%%, %d%%" % (int(
                 '%.0f' %
                 (h * 360.0)), int('%.0f' %
                                   (s * 100.0)), int('%.0f' % (l * 100.0)))
             if alpha:
                 value += ', %s' % alpha
         else:
             value = target_color
         self.view.sel().subtract(sels[0])
         self.view.sel().add(region)
         self.view.run_command("insert", {"characters": value})
     self.view.hide_popup()
示例#4
0
    def show_color_info(self, update=False):
        """ Show the color under the cursor """

        color = None
        sels = self.view.sel()
        if (len(sels) == 1 and sels[0].size() == 0):
            point = sels[0].begin()
            visible = self.view.visible_region()
            start = point - 50
            end = point + 50
            if start < visible.begin():
                start = visible.begin()
            if end > visible.end():
                end = visible.end()
            bfr = self.view.substr(sublime.Region(start, end))
            ref = point - start
            for m in COLOR_RE.finditer(bfr):
                if ref >= m.start(0) and ref < m.end(0):
                    if m.group('hex'):
                        content = m.group('hex_content')
                        if len(content) == 6:
                            color = "%02x%02x%02x" % (int(
                                content[0:2], 16), int(
                                    content[2:4], 16), int(content[4:6], 16))
                        else:
                            color = "%02x%02x%02x" % (int(
                                content[0:1] * 2, 16), int(
                                    content[1:2] * 2,
                                    16), int(content[2:3] * 2, 16))
                        break
                    elif m.group('rgb'):
                        content = [
                            x.strip()
                            for x in m.group('rgb_content').split(',')
                        ]
                        color = "%02x%02x%02x" % (int(
                            content[0]), int(content[1]), int(content[2]))
                        break
                    elif m.group('rgba'):
                        content = [
                            x.strip()
                            for x in m.group('rgba_content').split(',')
                        ]
                        color = "%02x%02x%02x%02x" % (
                            int(content[0]), int(content[1]), int(content[2]),
                            int('%.0f' % (float(content[3]) * 255.0)))
                        break
                    elif m.group('hsl'):
                        content = [
                            x.strip().rstrip('%')
                            for x in m.group('hsl_content').split(',')
                        ]
                        rgba = RGBA()
                        h = float(content[0]) / 360.0
                        s = float(content[1]) / 100.0
                        l = float(content[2]) / 100.0
                        rgba.fromhls(h, l, s)
                        color = rgba.get_rgb()[1:]
                        break
                    elif m.group('hsla'):
                        content = [
                            x.strip().rstrip('%')
                            for x in m.group('hsla_content').split(',')
                        ]
                        rgba = RGBA()
                        h = float(content[0]) / 360.0
                        s = float(content[1]) / 100.0
                        l = float(content[2]) / 100.0
                        rgba.fromhls(h, l, s)
                        color = rgba.get_rgb()[1:]
                        color += "%02X" % int('%.0f' %
                                              (float(content[3]) * 255.0))
                        break
            if color is None:
                word = self.view.substr(self.view.word(sels[0]))
                try:
                    color = webcolors.name_to_hex(word).lower()[1:]
                except:
                    pass
        if color is not None:
            html = [
                '<style>%s</style>' % (css if css is not None else '') +
                '<div class="content">' +
                # '<a href="__close__"><img style="width: 16px; height: 16px;" src="%s"></a>' % cross +
                self.format_info('#' + color.lower()) + '</div>'
            ]
            if update:
                self.view.update_popup(''.join(html))
            else:
                self.view.show_popup(''.join(html),
                                     location=-1,
                                     max_width=600,
                                     on_navigate=self.on_navigate)
        elif update:
            self.view.hide_popup()