def highlight_line(self, line, offset, last_highlight):
if not self.colorizer.terminal_capable:
return line
if last_highlight:
line = last_highlight + line
limit = offset + len(line)
adjust = 0
for rule in self.highlights:
start = rule.get("start")
end = rule.get("end")
fg = rule.get("fg")
bg = rule.get("bg")
bold = rule.get("bold")
if offset <= start <= limit + adjust:
escape_seq = ""
if fg is not None:
if isinstance(fg, basestring):
fg = self.colorizer.COLOR_MAP[fg]
escape_seq += self.colorizer.tparm(
["setaf", "setf"], fg)
if bg is not None:
if isinstance(bg, basestring):
bg = self.colorizer.COLOR_MAP[bg]
escape_seq += self.colorizer.tparm(
["setab", "setb"], bg)
if bold:
escape_seq += self.colorizer.tparm(["bold"])
insert_at = start - offset + adjust
line = line[:insert_at] + escape_seq + line[insert_at:]
adjust += len(escape_seq)
last_highlight = escape_seq
if offset <= end <= limit + adjust:
escape_seq = self.colorizer.tparm(["sgr0"])
insert_at = end - offset + adjust
line = line[:insert_at] + escape_seq + line[insert_at:]
adjust += len(escape_seq)
last_highlight = None
# Always terminate active highlight at the linebreak because we don't
# know what's being rendered to our right. We will resume
# last_highlight on next line.
if last_highlight:
line += self.colorizer.tparm(["sgr0"])
return line, last_highlight
评论列表
文章目录