Store the initial part of the line, up to the first control characteer,
in a string. If it is followed immediately by \n, \r\n or \f, it can
be printed without going through the cursor tracking logic.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
patchew/logviewer.py | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/patchew/logviewer.py b/patchew/logviewer.py
index 1e3495b..4523d1c 100644
--- a/patchew/logviewer.py
+++ b/patchew/logviewer.py
@@ -44,6 +44,8 @@ class ANSI2HTMLConverter(object):
def _reset(self):
self.line = []
self.pos = 0
+ self.lazy_contents = ''
+ self.lazy_accumulate = True
# self.line holds the characters for the current line.
# Writing can overwrite some characters if self.pos is
@@ -51,6 +53,8 @@ class ANSI2HTMLConverter(object):
# Moving the cursor right can add spaces to the end.
def _write(self, chars):
+ assert not self.lazy_accumulate or self.lazy_contents == ''
+ self.lazy_accumulate = False
cur_len = len(self.line)
if self.pos < cur_len:
last = min(cur_len - self.pos, len(chars))
@@ -65,6 +69,8 @@ class ANSI2HTMLConverter(object):
def _set_pos(self, pos):
self.pos = pos
if self.pos > len(self.line):
+ assert not self.lazy_accumulate or self.lazy_contents == ''
+ self.lazy_accumulate = False
num = self.pos - len(self.line)
self.line += [' '] * num
@@ -77,6 +83,14 @@ class ANSI2HTMLConverter(object):
yield self.RE_ENTITIES.sub(lambda x: self.ENTITIES[x.group(0)], text)
def _write_line(self, suffix):
+ # If the line consists of a single string of text without no escapes
+ # or control chararcters, convert() special cases it
+ if self.lazy_contents != '':
+ yield from self._write_span(self.lazy_contents)
+ yield suffix
+ self._reset()
+ return
+
text = "".join(self.line)
yield from self._write_span(text)
yield suffix
@@ -86,14 +100,27 @@ class ANSI2HTMLConverter(object):
yield from self._write_prefix()
for m in self.RE.finditer(input):
if m.group(1):
- self._write(m.group(1))
+ if self.lazy_accumulate:
+ self.lazy_contents += m.group(1)
+ else:
+ self._write(m.group(1))
else:
seq = m.group(2)
+ # _write_line can deal with lazy storage. Everything else
+ # must be flushed to self.line with _write.
if seq == '\n':
yield from self._write_line('\n')
+ continue
elif seq == '\f':
yield from self._write_line('\n<hr>')
- elif seq == '\b':
+ continue
+
+ if self.lazy_contents != '':
+ content = self.lazy_contents
+ self.lazy_contents = ''
+ self._write(content)
+
+ if seq == '\b':
if self.pos > 0:
self.pos -= 1
elif seq == '\t':
--
2.14.3
On Mon, 02/26 12:27, Paolo Bonzini wrote:
> Store the initial part of the line, up to the first control characteer,
> in a string. If it is followed immediately by \n, \r\n or \f, it can
> be printed without going through the cursor tracking logic.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> patchew/logviewer.py | 31 +++++++++++++++++++++++++++++--
> 1 file changed, 29 insertions(+), 2 deletions(-)
>
> diff --git a/patchew/logviewer.py b/patchew/logviewer.py
> index 1e3495b..4523d1c 100644
> --- a/patchew/logviewer.py
> +++ b/patchew/logviewer.py
> @@ -44,6 +44,8 @@ class ANSI2HTMLConverter(object):
> def _reset(self):
> self.line = []
> self.pos = 0
> + self.lazy_contents = ''
> + self.lazy_accumulate = True
>
> # self.line holds the characters for the current line.
> # Writing can overwrite some characters if self.pos is
> @@ -51,6 +53,8 @@ class ANSI2HTMLConverter(object):
> # Moving the cursor right can add spaces to the end.
>
> def _write(self, chars):
> + assert not self.lazy_accumulate or self.lazy_contents == ''
> + self.lazy_accumulate = False
> cur_len = len(self.line)
> if self.pos < cur_len:
> last = min(cur_len - self.pos, len(chars))
> @@ -65,6 +69,8 @@ class ANSI2HTMLConverter(object):
> def _set_pos(self, pos):
> self.pos = pos
> if self.pos > len(self.line):
> + assert not self.lazy_accumulate or self.lazy_contents == ''
> + self.lazy_accumulate = False
> num = self.pos - len(self.line)
> self.line += [' '] * num
>
> @@ -77,6 +83,14 @@ class ANSI2HTMLConverter(object):
> yield self.RE_ENTITIES.sub(lambda x: self.ENTITIES[x.group(0)], text)
>
> def _write_line(self, suffix):
> + # If the line consists of a single string of text without no escapes
"with no escapes"?
> + # or control chararcters, convert() special cases it
What do you mean by "convert()?
> + if self.lazy_contents != '':
> + yield from self._write_span(self.lazy_contents)
> + yield suffix
> + self._reset()
> + return
> +
> text = "".join(self.line)
> yield from self._write_span(text)
> yield suffix
> @@ -86,14 +100,27 @@ class ANSI2HTMLConverter(object):
> yield from self._write_prefix()
> for m in self.RE.finditer(input):
> if m.group(1):
> - self._write(m.group(1))
> + if self.lazy_accumulate:
> + self.lazy_contents += m.group(1)
> + else:
> + self._write(m.group(1))
> else:
> seq = m.group(2)
> + # _write_line can deal with lazy storage. Everything else
> + # must be flushed to self.line with _write.
> if seq == '\n':
> yield from self._write_line('\n')
> + continue
> elif seq == '\f':
> yield from self._write_line('\n<hr>')
> - elif seq == '\b':
> + continue
> +
> + if self.lazy_contents != '':
> + content = self.lazy_contents
> + self.lazy_contents = ''
> + self._write(content)
> +
> + if seq == '\b':
> if self.pos > 0:
> self.pos -= 1
> elif seq == '\t':
> --
> 2.14.3
>
>
Fam
On 01/03/2018 07:33, Fam Zheng wrote: > On Mon, 02/26 12:27, Paolo Bonzini wrote: >> Store the initial part of the line, up to the first control characteer, >> in a string. If it is followed immediately by \n, \r\n or \f, it can >> be printed without going through the cursor tracking logic. >> >> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> >> --- >> patchew/logviewer.py | 31 +++++++++++++++++++++++++++++-- >> 1 file changed, 29 insertions(+), 2 deletions(-) >> >> diff --git a/patchew/logviewer.py b/patchew/logviewer.py >> index 1e3495b..4523d1c 100644 >> --- a/patchew/logviewer.py >> +++ b/patchew/logviewer.py >> @@ -44,6 +44,8 @@ class ANSI2HTMLConverter(object): >> def _reset(self): >> self.line = [] >> self.pos = 0 >> + self.lazy_contents = '' >> + self.lazy_accumulate = True >> >> # self.line holds the characters for the current line. >> # Writing can overwrite some characters if self.pos is >> @@ -51,6 +53,8 @@ class ANSI2HTMLConverter(object): >> # Moving the cursor right can add spaces to the end. >> >> def _write(self, chars): >> + assert not self.lazy_accumulate or self.lazy_contents == '' >> + self.lazy_accumulate = False >> cur_len = len(self.line) >> if self.pos < cur_len: >> last = min(cur_len - self.pos, len(chars)) >> @@ -65,6 +69,8 @@ class ANSI2HTMLConverter(object): >> def _set_pos(self, pos): >> self.pos = pos >> if self.pos > len(self.line): >> + assert not self.lazy_accumulate or self.lazy_contents == '' >> + self.lazy_accumulate = False >> num = self.pos - len(self.line) >> self.line += [' '] * num >> >> @@ -77,6 +83,14 @@ class ANSI2HTMLConverter(object): >> yield self.RE_ENTITIES.sub(lambda x: self.ENTITIES[x.group(0)], text) >> >> def _write_line(self, suffix): >> + # If the line consists of a single string of text without no escapes > > "with no escapes"? Yes, fixed. >> + # or control chararcters, convert() special cases it > > What do you mean by "convert()? The convert() method in ANSI2HTMLConverter. Paolo
© 2016 - 2025 Red Hat, Inc.