def steps(self): all_steps = [] previous_numbers = None for spec in self.spec_list: if isinstance(spec, str): numbers = range_set_to_list(spec) else: numbers = spec if previous_numbers: all_steps.append( steplib.HighlightLines(self.code_box, previous_numbers, False) ) all_steps.extend([ steplib.HighlightLines(self.code_box, numbers, True), steplib.CellEnd() ]) previous_numbers = numbers return all_steps
def steps(self): return [ steplib.CellEnd(), ]
def _line_to_steps(self, line, insert_pos, replace_pos): steps = [] # --- Skip animation for "output" content first_token = line.parts[0].token is_console = self.code.lexer.is_console if is_console and not token_is_a(first_token, Generic.Prompt): # in console mode only lines with prompts get typewriter # animation, everything else is just added directly return [ steplib.InsertRows(self.code_box, insert_pos, line), ] # --- Typewriter animation # insert a blank row first with contents of line changing what is on # it as animation continues dummy_parts = [ CodePart(Token, ''), ] row_line = CodeLine(dummy_parts, self.code.lexer) step = steplib.InsertRows(self.code_box, insert_pos, row_line) steps.append(step) current_parts = [] num_parts = len(line.parts) for count, part in enumerate(line.parts): if part.token in self.continuous: # part is a chunk that gets output all together, replace the # dummy line with the whole contents current_parts.append(part) row_line = CodeLine(deepcopy(current_parts), self.code.lexer) step = steplib.ReplaceRows(self.code_box, replace_pos, row_line) steps.append(step) if part.token == Generic.Prompt: # stop animation if this is a prompt, wait for keypress steps.append(steplib.CellEnd()) elif count == 0 and token_is_a( part.token, Token.Text) and (part.text.rstrip() == ''): # first token is leading whitespace, don't animate it, just # insert it current_parts.append(part) row_line = CodeLine(deepcopy(current_parts), self.code.lexer) step = steplib.ReplaceRows(self.code_box, replace_pos, row_line) steps.append(step) else: new_part = CodePart(part.token, '') current_parts.append(new_part) typewriter = '' for letter in part.text: typewriter += letter new_part = CodePart(part.token, typewriter) current_parts[-1] = new_part output_parts = deepcopy(current_parts) # If not last step in animation, add a cursor to the line is_last_part = (count + 1 == num_parts) is_last_letter = (len(typewriter) == len(part.text)) if not (is_last_part and is_last_letter): output_parts.append(CodePart(Token, '\u2588')) row_line = CodeLine(output_parts, self.code.lexer) step = steplib.ReplaceRows(self.code_box, replace_pos, row_line) steps.append(step) steps.append(steplib.Sleep(self.delay_until_next_letter)) return steps