diff --git a/powerline/bindings/ipython/post_0_11.py b/powerline/bindings/ipython/post_0_11.py index 5901c63e..439793d9 100644 --- a/powerline/bindings/ipython/post_0_11.py +++ b/powerline/bindings/ipython/post_0_11.py @@ -10,10 +10,13 @@ class PowerlinePromptManager(PromptManager): self.powerline = powerline super(PowerlinePromptManager, self).__init__(**kwargs) - def _render(self, name, color=True, *args, **kwargs): + def render(self, name, color=True, *args, **kwargs): if name != 'in': - return super(PowerlinePromptManager, self)._render(name, color, *args, **kwargs) - return self.powerline.renderer.render(color=color) + return super(PowerlinePromptManager, self).render(name, color, *args, **kwargs) + res, res_nocolor = self.powerline.renderer.render(output_raw=True) + self.txtwidth = len(res_nocolor) + self.width = self.txtwidth + return res if color else res_nocolor def load_ipython_extension(ip): diff --git a/powerline/bindings/ipython/pre_0_11.py b/powerline/bindings/ipython/pre_0_11.py index 6bede602..36c1a315 100644 --- a/powerline/bindings/ipython/pre_0_11.py +++ b/powerline/bindings/ipython/pre_0_11.py @@ -9,8 +9,7 @@ class PowerlinePrompt(BasePrompt): super(PowerlinePrompt, self).__init__(*args, **kwargs) def set_p_str(self): - self.p_str = self.powerline.renderer.render() - self.p_str_nocolor = self.powerline.renderer.render(color=False) + self.p_str, self.p_str_nocolor = self.powerline.renderer.render(output_raw=True) def setup(prompt='1'): diff --git a/powerline/renderer.py b/powerline/renderer.py index d3483b57..11d2d66c 100644 --- a/powerline/renderer.py +++ b/powerline/renderer.py @@ -32,7 +32,14 @@ class Renderer(object): else: return self.theme - def render(self, mode=None, width=None, theme=None, segments=None, side=None): + @staticmethod + def _returned_value(rendered_highlighted, segments, output_raw): + if output_raw: + return rendered_highlighted, ''.join((segment['rendered_raw'] for segment in segments)) + else: + return rendered_highlighted + + def render(self, mode=None, width=None, theme=None, segments=None, side=None, output_raw=False): '''Render all segments. When a width is provided, low-priority segments are dropped one at @@ -50,7 +57,7 @@ class Renderer(object): rendered_highlighted = self._render_segments(mode, theme, segments) if not width: # No width specified, so we don't need to crop or pad anything - return rendered_highlighted + return self._returned_value(rendered_highlighted, segments, output_raw) # Create an ordered list of segments that can be dropped segments_priority = [segment for segment in sorted(segments, key=lambda segment: segment['priority'], reverse=True) if segment['priority'] > 0] @@ -70,7 +77,8 @@ class Renderer(object): segment['contents'] = segments_fillers_contents # Add remainder whitespace to the first filler segment segments_fillers[0]['contents'] += ' ' * segments_fillers_remainder - return self._render_segments(mode, theme, segments) + + return self._returned_value(self._render_segments(mode, theme, segments), segments, output_raw) def _render_segments(self, mode, theme, segments, render_highlighted=True): '''Internal segment rendering method. @@ -133,7 +141,8 @@ class Renderer(object): rendered_highlighted += self.hl() return rendered_highlighted - def _total_len(self, segments): + @staticmethod + def _total_len(segments): '''Return total/rendered length of all segments. This method uses the rendered_raw property of the segments and requires diff --git a/powerline/renderers/ipython.py b/powerline/renderers/ipython.py index 8d32bdf1..e8122093 100644 --- a/powerline/renderers/ipython.py +++ b/powerline/renderers/ipython.py @@ -5,12 +5,5 @@ from powerline.renderers.shell import ShellRenderer class IpythonRenderer(ShellRenderer): '''Powerline ipython segment renderer.''' - def render(self, color=True, *args, **kwargs): - self.color = color - return super(IpythonRenderer, self).render(*args, **kwargs) - def hl(self, *args, **kwargs): - if not self.color: - return '' - else: - return '\x01' + super(IpythonRenderer, self).hl(*args, **kwargs) + '\x02' + return '\x01' + super(IpythonRenderer, self).hl(*args, **kwargs) + '\x02'