##// END OF EJS Templates
Backport PR #5459: Fix interact animation page jump FF...
Backport PR #5459: Fix interact animation page jump FF Firefox doesn't render images immediately as the data is available. When animating the way that we animate, this causes the output area to collapse quickly before returning to its original size. When the output area collapses, FireFox scrolls upwards in attempt to compensate for the lost vertical content (so it looks like you are on the same spot in the page, with respect to the contents below the image's prior location). The solution is to resize the image output after the `img onload` event has fired. This PR: - Releases the `clear_output` height lock after the image has been loaded (instead of immediately or using a timeout). - Removes a `setTimeout` call in the `append_output` method. - `clear_output` in zmqshell no longer sends `\r` to the stream outputs. closes #5128

File last commit:

r11009:e16cf2f8
r16229:ff1462d3
Show More
completion_lexer.py
74 lines | 2.4 KiB | text/x-python | PythonLexer
/ IPython / qt / console / completion_lexer.py
epatters
Initial checkin of Qt frontend code.
r2602 # System library imports
from pygments.token import Token, is_token_subtype
class CompletionLexer(object):
Bernardo B. Marques
remove all trailling spaces
r4872 """ Uses Pygments and some auxillary information to lex code snippets for
epatters
Initial checkin of Qt frontend code.
r2602 symbol contexts.
"""
# Maps Lexer names to a list of possible name separators
separator_map = { 'C' : [ '.', '->' ],
'C++' : [ '.', '->', '::' ],
'Python' : [ '.' ] }
def __init__(self, lexer):
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640 """ Create a CompletionLexer using the specified Pygments lexer.
"""
epatters
Initial checkin of Qt frontend code.
r2602 self.lexer = lexer
def get_context(self, string):
""" Assuming the cursor is at the end of the specified string, get the
context (a list of names) for the symbol at cursor position.
"""
context = []
reversed_tokens = list(self._lexer.get_tokens(string))
reversed_tokens.reverse()
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640 # Pygments often tacks on a newline when none is specified in the input.
# Remove this newline.
epatters
Initial checkin of Qt frontend code.
r2602 if reversed_tokens and reversed_tokens[0][1].endswith('\n') and \
not string.endswith('\n'):
reversed_tokens.pop(0)
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
Made use of plain text consistent.
r2720 current_op = ''
epatters
Initial checkin of Qt frontend code.
r2602 for token, text in reversed_tokens:
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
if is_token_subtype(token, Token.Name):
# Handle a trailing separator, e.g 'foo.bar.'
if current_op in self._name_separators:
if not context:
epatters
Made use of plain text consistent.
r2720 context.insert(0, '')
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Handle non-separator operators and punction.
elif current_op:
break
epatters
Initial checkin of Qt frontend code.
r2602 context.insert(0, text)
epatters
Made use of plain text consistent.
r2720 current_op = ''
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Pygments doesn't understand that, e.g., '->' is a single operator
# in C++. This is why we have to build up an operator from
# potentially several tokens.
epatters
Initial checkin of Qt frontend code.
r2602 elif token is Token.Operator or token is Token.Punctuation:
current_op = text + current_op
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Break on anything that is not a Operator, Punctuation, or Name.
epatters
Initial checkin of Qt frontend code.
r2602 else:
break
return context
def get_lexer(self, lexer):
return self._lexer
def set_lexer(self, lexer, name_separators=None):
self._lexer = lexer
if name_separators is None:
self._name_separators = self.separator_map.get(lexer.name, ['.'])
else:
self._name_separators = list(name_separators)
lexer = property(get_lexer, set_lexer)
Bernardo B. Marques
remove all trailling spaces
r4872