def act(controller, bundle, options): ''' Required action method input dictates what should be trimmed: - None (default): falls back to alternate - selection: ignores lines if they exist, just trims selection - selected_lines: each line in the selection alternate dictates what to fall back on - None (default): will do nothing if input is blank - line: will trim the line the caret is on - all_lines: all lines in the document trim dictates what part of the text should be trimmed: - both (default) - start - end If respect_indent is True, indent characters (as defined in preferences) at the beginning of the line will be left untouched. ''' context = tea.get_context(controller) input = tea.get_option(options, 'input') alternate = tea.get_option(options, 'alternate') trim = tea.get_option(options, 'trim', 'both') respect_indent = tea.get_option(options, 'respect_indent', False) discard_empty = tea.get_option(options, 'discard_empty', False) # Since input is always a selection of some kind, check if we have one range = tea.get_range(context) if (range.length == 0) or input is None: if alternate.lower() == 'line': text, range = tea.get_line(context) text = tea.trim(context, text, False, trim, respect_indent, True, discard_empty) elif alternate.lower() == 'all_lines': range = tea.new_range(0, context.string().length()) text = tea.get_selection(context, range) text = tea.trim(context, text, True, trim, respect_indent, True, discard_empty) else: if input.lower() == 'selected_lines': parse_lines = True else: parse_lines = False text = tea.get_selection(context, range) text = tea.trim(context, text, parse_lines, trim, respect_indent, True, discard_empty) tea.insert_text(context, text, range) new_range = tea.new_range(range.location, len(text)) tea.set_selected_range(context, new_range)
def act(context, input=None, alternate=None, trim='both', respect_indent=False, undo_name=None): ''' Required action method input dictates what should be trimmed: - None (default): falls back to alternate - selection: ignores lines if they exist, just trims selection - selected_lines: each line in the selection alternate dictates what to fall back on - None (default): will do nothing if input is blank - line: will trim the line the caret is on - all_lines: all lines in the document trim dictates what part of the text should be trimmed: - both (default) - start - end If respect_indent is True, indent characters (as defined in preferences) at the beginning of the line will be left untouched. ''' # Since input is always a selection of some kind, check if we have one ranges = tea.get_ranges(context) insertions = tea.new_recipe() if (len(ranges) == 1 and ranges[0].length == 0) or input is None: if alternate == 'line': text, range = tea.get_line(context, ranges[0]) text = tea.trim(context, text, False, trim, respect_indent) elif alternate == 'all_lines': range = tea.new_range(0, context.string().length()) text = tea.get_selection(context, range) text = tea.trim(context, text, True, trim, respect_indent) insertions.addReplacementString_forRange_(text, range) else: if input == 'selected_lines': parse_lines = True else: parse_lines = False for range in ranges: text = tea.get_selection(context, range) text = tea.trim(context, text, parse_lines, trim, respect_indent) insertions.addReplacementString_forRange_(text, range) if undo_name != None: insertions.setUndoActionName_(undo_name) return context.applyTextRecipe_(insertions)
def act(context, target=None, source=None, trim=False, discard_indent=False, search_string=None, regex=False): ''' Required action method target dictates what we're looking for: - text - if unspecified, simply selects the source source dictates how to gather the string to search for: - word (word under the caret) - line (line under the caret) - if unspecified, defaults to selection Setting trim=True will cause the source to be trimmed Setting discard_indent=True will cause leading whitespace to be trimmed (unnecessary unless trim=True) search_string will set the string to search for if target is text or zone - $SELECTED_TEXT will be replaced with the source text Setting regex=True will cause search_string to be evaluated as regex ''' range = tea.get_ranges(context)[0] if source == 'word': text, range = tea.get_word(context, range) elif source == 'line': text, range = tea.get_line(context, range) elif range.length > 0: text = tea.get_selection(context, range) # Make sure that we've got some text, even if it's an empty string if text is None: text = '' # Trim the source if trim: if discard_indent: trimmed = tea.trim(context, text, False) else: trimmed = tea.trim(context, text, False, 'end') start = text.find(trimmed) if start != -1: start = range.location + start length = len(trimmed) if source == 'line': # We don't want the linebreak if we're trimming length = length - 1 range = tea.new_range(start, length) text = trimmed if target is not None and text: if search_string is not None: search = search_string.replace('$SELECTED_TEXT', text) else: search = text # Find the start and end points of the substring start = end = None if regex: match = re.search(r'(' + search + r')', context.string()) if match: # Get the start and end points start, end = match.span(1) else: start = context.string().find(search) if start != -1: end = start + len(search) else: start = None # Construct the new target range if start is not None and end is not None: range = tea.new_range(start, end - start) # Set the new range tea.set_selected_range(context, range) return True
def act(controller, bundle, options): ''' Required action method target dictates what we're looking for: - text - if unspecified, simply selects the source source dictates how to gather the string to search for: - word (word under the caret) - line (line under the caret) - if unspecified, defaults to selection Setting trim=True will cause the source to be trimmed Setting discard_indent=True will cause leading whitespace to be trimmed (unnecessary unless trim=True) search_string will set the string to search for if target is text or zone - $SELECTED_TEXT will be replaced with the source text Setting regex=True will cause search_string to be evaluated as regex ''' context = tea.get_context(controller) target = tea.get_option(options, 'target') source = tea.get_option(options, 'source') trim = tea.get_option(options, 'trim', False) discard_indent = tea.get_option(options, 'discard_indent', False) search_string = tea.get_option(options, 'search_string') regex = tea.get_option(options, 'regex', False) range = tea.get_range(context) if source == 'word': text, range = tea.get_word(context, range) elif source == 'line': text, range = tea.get_line(context) elif range.length > 0: text = tea.get_selection(context, range) # Trim the source if trim: if discard_indent: trimmed = tea.trim(context, text, False, preserve_linebreaks=False) else: trimmed = tea.trim(context, text, False, 'end', preserve_linebreaks=False) start = text.find(trimmed) if start != -1: start = range.location + start length = len(trimmed) if source == 'line' and trimmed[-1:] in ['\r\n', '\r', '\n']: # We don't want the linebreak if we're trimming length = length - 1 range = tea.new_range(start, length) text = trimmed if target is not None and text: if search_string is not None: search = search_string.replace('$SELECTED_TEXT', text) else: search = text # Find the start and end points of the substring start = end = None if regex: match = re.search(r'(' + search + r')', context.string()) if match: # Get the start and end points start, end = match.span(1) else: start = context.string().find(search) if start != -1: end = start + len(search) else: start = None # Construct the new target range if start is not None and end is not None: range = tea.new_range(start, end - start) # Set the new range tea.set_selected_range(context, range)