def match_pair(editor, direction='out', syntax=None): """ Find and select HTML tag pair @param editor: Editor instance @type editor: ZenEditor @param direction: Direction of pair matching: 'in' or 'out'. @type direction: str """ direction = direction.lower() if syntax is None: syntax = editor.get_profile_name() range_start, range_end = editor.get_selection_range() cursor = range_end content = editor.get_content() rng = None old_open_tag = html_matcher.last_match['opening_tag'] old_close_tag = html_matcher.last_match['closing_tag'] if direction == 'in' and old_open_tag and range_start != range_end: # user has previously selected tag and wants to move inward if not old_close_tag: # unary tag was selected, can't move inward return False elif old_open_tag.start == range_start: if content[old_open_tag.end] == '<': # test if the first inward tag matches the entire parent tag's content _r = html_matcher.find(content, old_open_tag.end + 1, syntax) if _r[0] == old_open_tag.end and _r[1] == old_close_tag.start: rng = html_matcher.match(content, old_open_tag.end + 1, syntax) else: rng = (old_open_tag.end, old_close_tag.start) else: rng = (old_open_tag.end, old_close_tag.start) else: new_cursor = content[0:old_close_tag.start].find( '<', old_open_tag.end) search_pos = new_cursor + 1 if new_cursor != -1 else old_open_tag.end rng = html_matcher.match(content, search_pos, syntax) else: rng = html_matcher.match(content, cursor, syntax) if rng and rng[0] is not None: editor.create_selection(rng[0], rng[1]) return True else: return False
def match_pair(editor, direction='out', syntax=None): """ Find and select HTML tag pair @param editor: Editor instance @type editor: ZenEditor @param direction: Direction of pair matching: 'in' or 'out'. @type direction: str """ direction = direction.lower() if syntax is None: syntax = editor.get_profile_name() range_start, range_end = editor.get_selection_range() cursor = range_end content = editor.get_content() rng = None old_open_tag = html_matcher.last_match['opening_tag'] old_close_tag = html_matcher.last_match['closing_tag'] if direction == 'in' and old_open_tag and range_start != range_end: # user has previously selected tag and wants to move inward if not old_close_tag: # unary tag was selected, can't move inward return False elif old_open_tag.start == range_start: if content[old_open_tag.end] == '<': # test if the first inward tag matches the entire parent tag's content _r = html_matcher.find(content, old_open_tag.end + 1, syntax) if _r[0] == old_open_tag.end and _r[1] == old_close_tag.start: rng = html_matcher.match(content, old_open_tag.end + 1, syntax) else: rng = (old_open_tag.end, old_close_tag.start) else: rng = (old_open_tag.end, old_close_tag.start) else: new_cursor = content[0:old_close_tag.start].find('<', old_open_tag.end) search_pos = new_cursor + 1 if new_cursor != -1 else old_open_tag.end rng = html_matcher.match(content, search_pos, syntax) else: rng = html_matcher.match(content, cursor, syntax) if rng and rng[0] is not None: editor.create_selection(rng[0], rng[1]) return True else: return False
def act(controller, bundle, options): context = tea.get_context(controller) direction = tea.get_option(options, 'direction', 'out') # Since input is always a selection of some kind, check if we have one rng = tea.get_range(context) cursor = rng.location + rng.length range_start, range_end = rng.location, rng.location + rng.length content = context.string() old_open_tag = html_matcher.last_match['opening_tag'] old_close_tag = html_matcher.last_match['closing_tag'] if direction.lower() == 'in' and old_open_tag and range_start != range_end: # user has previously selected tag and wants to move inward if not old_close_tag: # unary tag was selected, can't move inward return False elif old_open_tag.start == range_start: if content[old_open_tag.end] == '<': # test if the first inward tag matches the entire parent tag's content _start, _end = html_matcher.find(content, old_open_tag.end + 1) if _start == old_open_tag.end and _end == old_close_tag.start: start, end = html_matcher.match(content, old_open_tag.end + 1) else: start, end = old_open_tag.end, old_close_tag.start else: start, end = old_open_tag.end, old_close_tag.start else: new_cursor = content.find('<', old_open_tag.end, old_close_tag.start) search_pos = new_cursor != -1 and new_cursor + 1 or old_open_tag.end start, end = html_matcher.match(content, search_pos) else: start, end = html_matcher.match(content, cursor) if start is not None: new_range = tea.new_range(start, end - start) tea.set_selected_range(context, new_range) return True else: return False