Analyses characters in single font or all fonts.

def chars(self, font, block):
        """
        Analyses characters in single font or all fonts.
        """
        if font:
            font_files = self._getFont(font)
        else:
            font_files = fc.query()
        code_points = self._getFontChars(font_files)

        if not block:
            blocks = all_blocks
            ranges_column = map(itemgetter(3), blocks)
            overlapped = Ranges(code_points).getOverlappedList(ranges_column)
        else:
            blocks = [block]
            overlapped = [Ranges(code_points).getOverlapped(block[3])]

        if self._display['group']:
            char_count = block_count = 0
            for i, block in enumerate(blocks):
                o_count = len(overlapped[i])
                if o_count:
                    block_count += 1
                    char_count += o_count
                    total = sum(len(r) for r in block[3])
                    percent = 0 if total == 0 else o_count / total
                    print("{0:>6}  {1:47} {2:>4.0%} ({3}/{4})".format(block[0], block[2], percent, o_count, total))
                    if self._display['list']:
                        for point in overlapped[i]:
                            self._charInfo(point, padding=9)
            self._charSummary(char_count, block_count)
        else:
            for point in code_points:
                self._charInfo(point, padding=7)
            self._charSummary(len(code_points))