MAX_PERCENTS = 100. class Bar(object): """superclass""" bars = None def __init__(self, value): """ Args: value (float): value between 0. and 100. meaning percents """ self.value = value class HBar(Bar): """horizontal bar (1 char)""" bars = [ u"\u2581", u"\u2582", u"\u2583", u"\u2584", u"\u2585", u"\u2586", u"\u2587", u"\u2588" ] def __init__(self, value): """ Args: value (float): value between 0. and 100. meaning percents """ super(HBar, self).__init__(value) self.step = MAX_PERCENTS / len(HBar.bars) def get_char(self): """ Decide which char to draw Return: str """ for i in range(len(HBar.bars)): left = i * self.step right = (i + 1) * self.step if left <= self.value < right: return self.bars[i] return self.bars[-1] def hbar(value): """wrapper function""" return HBar(value).get_char() class VBar(Bar): """vertical bar (can be more than 1 char)""" bars = [ u"\u258f", u"\u258e", u"\u258d", u"\u258c", u"\u258b", u"\u258a", u"\u2589", u"\u2588" ] def __init__(self, value, width=1): """ Args: value (float): value between 0. and 100. meaning percents width (int): width """ super(VBar, self).__init__(value) self.step = MAX_PERCENTS / (len(VBar.bars) * width) self.width = width def get_chars(self): """ Decide which char to draw Return: str """ if self.value == 100: return self.bars[-1] * self.width if self.width == 1: for i in range(len(VBar.bars)): left = i * self.step right = (i + 1) * self.step if left <= self.value < right: return self.bars[i] else: full_parts = int(self.value // (self.step * len(Vbar.bars))) remainder = self.value - full_parts * self.step * CHARS empty_parts = self.width - full_parts if remainder >= 0: empty_parts -= 1 part_vbar = VBar(remainder * self.width) # scale to width chars = self.bars[-1] * full_parts chars += part_vbar.get_chars() chars += " " * empty_parts return chars def vbar(value, width): """wrapper function""" return VBar(value, width).get_chars() # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4