Ejemplo n.º 1
0
class ZenEditor():

	def __init__(self, window):

		self.window = window

		self.last_wrap = ''
		self.last_expand = ''
		self.last_lorem_ipsum = 'list 5*5'

		self.placeholder = zen_core.get_caret_placeholder()
		zen_core.set_caret_placeholder('')		

		self.html_navigation = None
		self.snippet_document = {}

	# --- Original interface ---------------------------------------------------

	def set_context(self, view):

		default_locale = locale.getdefaultlocale()[0]
		if default_locale:
			lang = re.sub(r'_[^_]+$', '', default_locale)
			if lang != default_locale:
				zen_core.set_variable('lang', lang)
				zen_core.set_variable('locale', default_locale.replace('_', '-'))
			else:
				zen_core.set_variable('lang', default_locale)
				zen_core.set_variable('locale', default_locale)
		
		self.document = self.window.get_active_document()
		if self.document:
			zen_core.set_variable('charset', self.document.get_encoding().get_charset())
			
		self.view = view
		if self.view:
			self.buffer = self.view.get_buffer()
			if self.view.get_insert_spaces_instead_of_tabs():
				zen_core.set_variable('indentation', " " * self.view.get_tab_width())
			else:
				zen_core.set_variable('indentation', "\t")
		
			#zen_core.set_newline(???)
		
			if USE_SNIPPETS:
				if not (self.view in self.snippet_document):
					self.snippet_document[self.view] = SnippetDocument(None, self.view)
			else:
				self.snippet_document[self.view] = None

	def get_selection_range(self):

		offset_start = self.get_insert_offset()
		offset_end = self.get_selection_bound_offset()

		if offset_start < offset_end:
			return offset_start, offset_end

		return offset_end, offset_start

	def create_selection(self, offset_start, offset_end=None):

		if offset_end is None:
			iter_start = self.buffer.get_iter_at_offset(offset_start)
			self.buffer.place_cursor(iter_start)

		else:
			iter_start = self.buffer.get_iter_at_offset(offset_start)
			iter_end = self.buffer.get_iter_at_offset(offset_end)
			self.buffer.select_range(iter_start, iter_end)

	def get_current_line_range(self):

		iter_start = self.get_insert_iter()
		iter_start.set_line_offset(0)
		iter_end = iter_start.copy()

		if iter_end.forward_visible_line():
			iter_end.backward_char()

		else:
			iter_end = self.buffer.get_end_iter()

		return iter_start.get_offset(), iter_end.get_offset()

	def get_caret_pos(self):
		return self.get_insert_offset()

	def set_caret_pos(self, pos):
		self.buffer.place_cursor(self.buffer.get_iter_at_offset(pos))

	def get_current_line(self):

		offset_start, offset_end = self.get_current_line_range()
		iter_start = self.buffer.get_iter_at_offset(offset_start)
		iter_end = self.buffer.get_iter_at_offset(offset_end)
		return self.buffer.get_text(iter_start, iter_end).decode('UTF-8')

	def replace_content(self, value, offset_start=None, offset_end=None):

		if offset_start is None and offset_end is None:
			iter_start = self.buffer.get_iter_at_offset(0)
			iter_end = self.get_end_iter()

		elif offset_end is None:
			iter_start = self.buffer.get_iter_at_offset(offset_start)
			iter_end = self.buffer.get_iter_at_offset(offset_start)

		else:
			iter_start = self.buffer.get_iter_at_offset(offset_start)
			iter_end = self.buffer.get_iter_at_offset(offset_end)

		self.buffer.delete(iter_start, iter_end)
		self.set_caret_pos(offset_start)
		self.insertion_start = self.get_insert_offset()
		
		padding = zen_actions.get_current_line_padding(self)
		padding = re.sub('[\r\n]', '', padding)
		self.buffer.insert_at_cursor(zen_core.pad_string(value, padding))

		self.insertion_end = self.get_insert_offset()

	def get_content(self):
		iter_start = self.buffer.get_iter_at_offset(0)
		iter_end = self.get_end_iter()
		return self.buffer.get_text(iter_start, iter_end).decode('UTF-8')

	def get_syntax(self):
		lang = self.window.get_active_document().get_language()
		lang = lang and lang.get_name()
		if lang == 'CSS': lang = 'css'
		elif lang == 'XSLT': lang = 'xsl'
		else: lang = 'html'
		return lang

	def get_profile_name(self):
		return 'xhtml'

	def prompt(self, title):
		done, result = zen_dialog.main(self, self.window, None, title)
		if done:
			return result
		return ''

	def get_selection(self):
		offset_start, offset_end = self.get_selection_range()
		iter_start = self.buffer.get_iter_at_offset(offset_start)
		iter_end = self.buffer.get_iter_at_offset(offset_end)
		return self.buffer.get_text(iter_start, iter_end).decode('UTF-8')

	def get_file_path(self):
		return re.sub('^file://', '', self.document.get_uri())

	# --- Iter and offset oneliners --------------------------------------------

	def get_insert_iter(self):
		return self.buffer.get_iter_at_mark(self.buffer.get_insert())
		
	def get_insert_offset(self):
		return self.get_insert_iter().get_offset()

	def get_selection_bound_iter(self):
		return self.buffer.get_iter_at_mark(self.buffer.get_selection_bound())

	def get_selection_bound_offset(self):
		return self.get_selection_bound_iter().get_offset()

	def get_end_iter(self):
		return self.buffer.get_iter_at_offset(self.buffer.get_char_count())

	def get_end_offset(self):
		return self.get_end_iter().get_offset()

	#--- Miscellaneous stuff ---------------------------------------------------

	def start_edit(self):
		# bug when the cursor is at the very beginning
		if self.insertion_start == 0:
			self.insertion_start = 1
		self.set_caret_pos(self.insertion_start)
		if not self.next_edit_point() or (self.get_insert_offset() > self.insertion_end):
			self.set_caret_pos(self.insertion_end)
	
	def show_caret(self):
		self.view.scroll_mark_onscreen(self.buffer.get_insert())

	def get_user_settings_error(self):
		return zen_core.get_variable('user_settings_error')

	def save_selection(self):
		self.save_offset_insert = self.get_insert_offset()
		self.save_offset_selection_bound = self.get_selection_bound_offset()

	def restore_selection(self):
		iter_insert = self.buffer.get_iter_at_offset(self.save_offset_insert)
		iter_selection_bound = self.buffer.get_iter_at_offset(self.save_offset_selection_bound)
		self.buffer.select_range(iter_insert, iter_selection_bound)

	def prepare_nav(self):
		offset_start, offset_end = self.get_selection_range()
		content = self.get_content()
		if not self.html_navigation:
			self.html_navigation = HtmlNavigation(content)
		return offset_start, offset_end, content

	#--- Snippet hook ----------------------------------------------------------
	
	def expand_with_snippet(self, abbr, mode = 0):
		# mode_names = { 0: 'expand abbr',  1: 'expand with abbr', 2: 'wrap with abbr' }

		if mode < 2:
			content = zen_core.expand_abbreviation(abbr, self.get_syntax(), self.get_profile_name())
		else:
			content = self.core_wrap_with_abbreviation(abbr)

		if content:

			global placeholder_count
			placeholder_count = 0
			search_string = '(' + self.placeholder + '|\{' + self.placeholder + '|>' + self.placeholder + '[^<]+<' + ')'
			content = re.sub(search_string, placeholder_feed, content)

			offset_start, offset_end = self.get_selection_range()
			if offset_start == offset_end and mode == 0:
				offset_start -= len(abbr)

			snippet = ZenSnippet(abbr, content)
			iter_start = self.buffer.get_iter_at_offset(offset_start)
			iter_end = self.buffer.get_iter_at_offset(offset_end)

			self.snippet_document[self.view].apply_snippet(snippet, iter_start, iter_end)
		
		return content

	#--- Expand abbreviation ---------------------------------------------------

	def expand_abbreviation(self):

		zen_core.set_caret_placeholder(self.placeholder)
		
		abbr = zen_actions.find_abbreviation(self)

		if abbr:

			if self.snippet_document[self.view]:
				self.expand_with_snippet(abbr)

			else:
				self.buffer.begin_user_action()
				content = zen_core.expand_abbreviation(abbr, self.get_syntax(), self.get_profile_name())
				if content:
					content = content.replace(self.placeholder, '')
					content = re.sub('\$\d+|\$\{\d+:[^\}]*\}', '', content)
					unused, offset_end = self.get_selection_range()
					self.replace_content(content, offset_end - len(abbr), offset_end)
					self.start_edit()
				self.buffer.end_user_action()

		zen_core.set_caret_placeholder('')

	#--- Expand with abbreviation ----------------------------------------------

	def callback_expand_with_abbreviation(self, done, abbr, last = False):

		self.buffer.begin_user_action()

		if done:
			self.buffer.undo()
			self.restore_selection()

		if last and self.snippet_document[self.view]:
			content = self.expand_with_snippet(abbr, 1)

		else:

			content = zen_core.expand_abbreviation(abbr, self.get_syntax(), self.get_profile_name())

			if content:
				content = content.replace(self.placeholder, '')
				content = re.sub('\$\d+|\$\{\d+:[^\}]*\}', '', content)
				self.replace_content(content, self.get_insert_offset())

		self.buffer.end_user_action()

		return not not content

	def expand_with_abbreviation(self):

		zen_core.set_caret_placeholder(self.placeholder)
		self.save_selection()

		done, self.last_expand = zen_dialog.main(self, self.window, self.callback_expand_with_abbreviation, self.last_expand, True)

		if done and not self.snippet_document[self.view]:
			self.start_edit()

		zen_core.set_caret_placeholder('')

	#--- Wrap with abbreviation ------------------------------------------------

	def core_wrap_with_abbreviation(self, abbr):
	
		if not abbr:
			return None

		syntax = self.get_syntax()
		profile_name = self.get_profile_name()

		start_offset, end_offset = self.get_selection_range()
		content = self.get_content()

		if start_offset == end_offset:
			rng = html_matcher.match(content, start_offset, profile_name)
			if rng[0] is None:
				return None
			else:
				start_offset, end_offset = rng

		start_offset, end_offset = zen_actions.narrow_to_non_space(content, start_offset, end_offset)
		line_bounds = zen_actions.get_line_bounds(content, start_offset)
		padding = zen_actions.get_line_padding(content[line_bounds[0]:line_bounds[1]])

		new_content = content[start_offset:end_offset]
		return zen_core.wrap_with_abbreviation(abbr, zen_actions.unindent_text(new_content, padding), syntax, profile_name)

	def callback_wrap_with_abbreviation(self, done, abbr, last = False):

		self.buffer.begin_user_action()

		if done:
			self.buffer.undo()
			self.restore_selection()

		if last and self.snippet_document[self.view]:
			content = self.expand_with_snippet(abbr, 2)

		else:

			content = self.core_wrap_with_abbreviation(abbr)

			if content:
				content = content.replace(self.placeholder, '')
				content = re.sub('\$\d+|\$\{\d+:[^\}]*\}', '', content)
				offset_start, offset_end = self.get_selection_range()
				self.replace_content(content, offset_start, offset_end)

		self.buffer.end_user_action()

		return not not content

	def wrap_with_abbreviation(self):

		zen_core.set_caret_placeholder(self.placeholder)
		self.save_selection()

		done, self.last_wrap = zen_dialog.main(self, self.window, self.callback_wrap_with_abbreviation, self.last_wrap, True)

		if done and not self.snippet_document[self.view]:
			self.start_edit()

		zen_core.set_caret_placeholder('')

	#--- Zenify ----------------------------------------------------------------

	def zenify(self, mode):

		offset_start, offset_end, content = self.prepare_nav()
		result = self.html_navigation.zenify(offset_start, offset_end, content, mode)

		if result:
			self.save_selection()
			self.prompt(result)
			self.restore_selection()

	#--- Lorem ipsum -----------------------------------------------------------

	def callback_lorem_ipsum(self, done, cmd, last = False):
		self.buffer.begin_user_action()
		if done:
			self.buffer.undo()
			self.restore_selection()
		content = lorem_ipsum(cmd)
		if content:
			self.replace_content(content, self.get_insert_offset())
		self.buffer.end_user_action()
		return not not content

	def lorem_ipsum(self):
		self.save_selection()
		done, self.last_lorem_ipsum = zen_dialog.main(self, self.window, self.callback_lorem_ipsum, self.last_lorem_ipsum, False)

	#--- Select inward or outward ----------------------------------------------

	def match_pair_inward(self):
		offset_start, offset_end, content = self.prepare_nav()
		offset_start, offset_end = self.html_navigation.inner_bounds(offset_start, offset_end, content)
		if not (offset_start is None or offset_end is None):
			self.create_selection(offset_start, offset_end)

	def match_pair_outward(self):
		offset_start, offset_end, content = self.prepare_nav()
		offset_start, offset_end = self.html_navigation.outer_bounds(offset_start, offset_end, content)
		if not (offset_start is None or offset_end is None):
			self.create_selection(offset_start, offset_end)

	#--- Tag jumps -------------------------------------------------------------
	
	def new_tag(self, direction):

		offset_start, offset_end, content = self.prepare_nav()

		if direction == 'next':
			node = self.html_navigation.next_tag(offset_start, offset_end, content)

		else:
			node = self.html_navigation.previous_tag(offset_start, offset_end, content)

		if node:
			iter_start = self.buffer.get_iter_at_offset(node.start)
			iter_end = self.buffer.get_iter_at_offset(node.end)
			self.create_selection(node.start, node.end)
			self.show_caret()

	def prev_tag(self):
		self.new_tag('previous')

	def next_tag(self):
		self.new_tag('next')

	#--- Node jumps ------------------------------------------------------------

	def new_node(self, direction, with_spaces = True):

		offset_start, offset_end, content = self.prepare_nav()

		while True:

			if direction == 'next':
				node = self.html_navigation.next_node(offset_start, offset_end, content)

			else:
				node = self.html_navigation.previous_node(offset_start, offset_end, content)

			if node:

				iter_start = self.buffer.get_iter_at_offset(node.start)
				iter_end = self.buffer.get_iter_at_offset(node.end)

				found = self.buffer.get_text(iter_start, iter_end).decode('UTF-8')
				if not with_spaces and found.isspace() and found.find('\n') != -1:
					offset_start = node.start
					offset_end = node.end

				else:
					self.create_selection(node.start, node.end)
					break

			else:
				break

		self.show_caret()

	def prev_node(self):
		self.new_node('previous')

	def next_node(self):
		self.new_node('next')

	#--- Edit points jumps -----------------------------------------------------

	def prev_edit_point(self):
		result = zen_actions.prev_edit_point(self)
		self.show_caret()
		return result

	def next_edit_point(self):
		result = zen_actions.next_edit_point(self)
		self.show_caret()
		return result

	#--- Image actions ---------------------------------------------------------

	def update_image_size(self):
		self.buffer.begin_user_action()
		update_image_size(self)
		self.buffer.end_user_action()

	def encode_decode_base64(self):
		self.buffer.begin_user_action()
		try:
			zen_actions.encode_decode_base64(self)
		except:
			pass
		self.buffer.end_user_action()

	#--- Other edition actions -------------------------------------------------

	def merge_lines(self):
		self.buffer.begin_user_action()
		zen_actions.merge_lines(self)
		self.buffer.end_user_action()

	def remove_tag(self):
		self.buffer.begin_user_action()
		zen_actions.remove_tag(self)
		self.buffer.end_user_action()

	def split_join_tag(self):
		self.buffer.begin_user_action()
		zen_actions.split_join_tag(self)
		self.buffer.end_user_action()

	def toggle_comment(self):
		self.buffer.begin_user_action()
		zen_actions.toggle_comment(self)
		self.buffer.end_user_action()
Ejemplo n.º 2
0
class ZenEditor():

    def __init__(self, window):

        self.window = window

        self.last_wrap = ''
        self.last_expand = ''
        self.last_lorem_ipsum = 'list 5*5'

        self.placeholder = zen_core.get_caret_placeholder()
        zen_core.set_caret_placeholder('')

        self.html_navigation = None
        self.snippet_document = {}

    # --- Original interface ---------------------------------------------------
    def set_context(self, view):

        default_locale = locale.getdefaultlocale()[0]
        if default_locale:
            lang = re.sub(r'_[^_]+$', '', default_locale)
            if lang != default_locale:
                zen_core.set_variable('lang', lang)
                zen_core.set_variable('locale', default_locale.replace('_', '-'))
            else:
                zen_core.set_variable('lang', default_locale)
                zen_core.set_variable('locale', default_locale)

        self.document = self.window.get_active_document()
        if self.document:
            zen_core.set_variable('charset', self.document.get_encoding().get_charset())

        self.view = view
        if self.view:
            self.buffer = self.view.get_buffer()
            if self.view.get_insert_spaces_instead_of_tabs():
                zen_core.set_variable('indentation', " " * self.view.get_tab_width())
            else:
                zen_core.set_variable('indentation', "\t")

            #zen_core.set_newline(???)

            if USE_SNIPPETS:
                if not (self.view in self.snippet_document):
                    self.snippet_document[self.view] = SnippetDocument()
                    self.snippet_document[self.view].view = self.view
            else:
                self.snippet_document[self.view] = None

    def get_selection_range(self):

        offset_start = self.get_insert_offset()
        offset_end = self.get_selection_bound_offset()

        if offset_start < offset_end:
            return offset_start, offset_end

        return offset_end, offset_start

    def create_selection(self, offset_start, offset_end=None):

        if offset_end is None:
            iter_start = self.buffer.get_iter_at_offset(offset_start)
            self.buffer.place_cursor(iter_start)

        else:
            iter_start = self.buffer.get_iter_at_offset(offset_start)
            iter_end = self.buffer.get_iter_at_offset(offset_end)
            self.buffer.select_range(iter_start, iter_end)

    def get_current_line_range(self):

        iter_start = self.get_insert_iter()
        iter_start.set_line_offset(0)
        iter_end = iter_start.copy()

        if iter_end.forward_visible_line():
            iter_end.backward_char()

        else:
            iter_end = self.buffer.get_end_iter()

        return iter_start.get_offset(), iter_end.get_offset()

    def get_caret_pos(self):
        return self.get_insert_offset()

    def set_caret_pos(self, pos):
        self.buffer.place_cursor(self.buffer.get_iter_at_offset(pos))

    def get_current_line(self):

        offset_start, offset_end = self.get_current_line_range()
        iter_start = self.buffer.get_iter_at_offset(offset_start)
        iter_end = self.buffer.get_iter_at_offset(offset_end)
        return self.buffer.get_text(iter_start, iter_end, True).decode('UTF-8')

    def replace_content(self, value, offset_start=None, offset_end=None):

        if offset_start is None and offset_end is None:
            iter_start = self.buffer.get_iter_at_offset(0)
            iter_end = self.get_end_iter()

        elif offset_end is None:
            iter_start = self.buffer.get_iter_at_offset(offset_start)
            iter_end = self.buffer.get_iter_at_offset(offset_start)

        else:
            iter_start = self.buffer.get_iter_at_offset(offset_start)
            iter_end = self.buffer.get_iter_at_offset(offset_end)

        self.buffer.delete(iter_start, iter_end)
        self.set_caret_pos(offset_start)
        self.insertion_start = self.get_insert_offset()

        padding = zen_actions.get_current_line_padding(self)
        padding = re.sub('[\r\n]', '', padding)
        self.buffer.insert_at_cursor(zen_core.pad_string(value, padding))

        self.insertion_end = self.get_insert_offset()

    def get_content(self):
        iter_start = self.buffer.get_iter_at_offset(0)
        iter_end = self.get_end_iter()
        return self.buffer.get_text(iter_start, iter_end, True).decode('UTF-8')

    def get_syntax(self):
        lang = self.window.get_active_document().get_language()
        lang = lang and lang.get_name()
        if lang == 'CSS': lang = 'css'
        elif lang == 'XSLT': lang = 'xsl'
        else: lang = 'html'
        return lang

    def get_profile_name(self):
        return 'xhtml'

    def prompt(self, title):
        done, result = zen_dialog.main(self, self.window, None, title)
        if done:
            return result
        return ''

    def get_selection(self):
        offset_start, offset_end = self.get_selection_range()
        iter_start = self.buffer.get_iter_at_offset(offset_start)
        iter_end = self.buffer.get_iter_at_offset(offset_end)
        return self.buffer.get_text(iter_start, iter_end, True).decode('UTF-8')

    def get_file_path(self):
        return re.sub('^file://', '', self.document.get_uri())

    # --- Iter and offset oneliners --------------------------------------------

    def get_insert_iter(self):
        return self.buffer.get_iter_at_mark(self.buffer.get_insert())

    def get_insert_offset(self):
        return self.get_insert_iter().get_offset()

    def get_selection_bound_iter(self):
        return self.buffer.get_iter_at_mark(self.buffer.get_selection_bound())

    def get_selection_bound_offset(self):
        return self.get_selection_bound_iter().get_offset()

    def get_end_iter(self):
        return self.buffer.get_iter_at_offset(self.buffer.get_char_count())

    def get_end_offset(self):
        return self.get_end_iter().get_offset()

    #--- Miscellaneous stuff ---------------------------------------------------

    def start_edit(self):
        # bug when the cursor is at the very beginning
        if self.insertion_start == 0:
            self.insertion_start = 1
        self.set_caret_pos(self.insertion_start)
        if not self.next_edit_point() or (self.get_insert_offset() > self.insertion_end):
            self.set_caret_pos(self.insertion_end)

    def show_caret(self):
        self.view.scroll_mark_onscreen(self.buffer.get_insert())

    def get_user_settings_error(self):
        return zen_core.get_variable('user_settings_error')

    def save_selection(self):
        self.save_offset_insert = self.get_insert_offset()
        self.save_offset_selection_bound = self.get_selection_bound_offset()

    def restore_selection(self):
        iter_insert = self.buffer.get_iter_at_offset(self.save_offset_insert)
        iter_selection_bound = self.buffer.get_iter_at_offset(self.save_offset_selection_bound)
        self.buffer.select_range(iter_insert, iter_selection_bound)

    def prepare_nav(self):
        offset_start, offset_end = self.get_selection_range()
        content = self.get_content()
        if not self.html_navigation:
            self.html_navigation = HtmlNavigation(content)
        return offset_start, offset_end, content

    #--- Snippet hook ----------------------------------------------------------

    def expand_with_snippet(self, abbr, mode = 0):
        # mode_names = { 0: 'expand abbr',  1: 'expand with abbr', 2: 'wrap with abbr' }

        if mode < 2:
            content = zen_core.expand_abbreviation(abbr, self.get_syntax(), self.get_profile_name())
        else:
            content = self.core_wrap_with_abbreviation(abbr)

        if content:

            global placeholder_count
            placeholder_count = 0
            search_string = '(' + self.placeholder + '|\{' + self.placeholder + '|>' + self.placeholder + '[^<]+<' + ')'
            content = re.sub(search_string, placeholder_feed, content)

            offset_start, offset_end = self.get_selection_range()
            if offset_start == offset_end and mode == 0:
                offset_start -= len(abbr)

            snippet = ZenSnippet(abbr, content)
            iter_start = self.buffer.get_iter_at_offset(offset_start)
            iter_end = self.buffer.get_iter_at_offset(offset_end)

            self.snippet_document[self.view].apply_snippet(snippet, iter_start, iter_end)

        return content

    #--- Expand abbreviation ---------------------------------------------------

    def expand_abbreviation(self):

        zen_core.set_caret_placeholder(self.placeholder)

        abbr = zen_actions.find_abbreviation(self)

        if abbr:

            if self.snippet_document[self.view]:
                self.expand_with_snippet(abbr)

            else:
                self.buffer.begin_user_action()
                content = zen_core.expand_abbreviation(abbr, self.get_syntax(), self.get_profile_name())
                if content:
                    content = content.replace(self.placeholder, '')
                    content = re.sub('\$\d+|\$\{\d+:[^\}]*\}', '', content)
                    unused, offset_end = self.get_selection_range()
                    self.replace_content(content, offset_end - len(abbr), offset_end)
                    self.start_edit()
                self.buffer.end_user_action()

        zen_core.set_caret_placeholder('')

    #--- Expand with abbreviation ----------------------------------------------

    def callback_expand_with_abbreviation(self, done, abbr, last = False):

        self.buffer.begin_user_action()

        if done:
            self.buffer.undo()
            self.restore_selection()

        if last and self.snippet_document[self.view]:
            content = self.expand_with_snippet(abbr, 1)

        else:

            content = zen_core.expand_abbreviation(abbr, self.get_syntax(), self.get_profile_name())

            if content:
                content = content.replace(self.placeholder, '')
                content = re.sub('\$\d+|\$\{\d+:[^\}]*\}', '', content)
                self.replace_content(content, self.get_insert_offset())

        self.buffer.end_user_action()

        return not not content

    def expand_with_abbreviation(self):

        zen_core.set_caret_placeholder(self.placeholder)
        self.save_selection()

        done, self.last_expand = zen_dialog.main(self, self.window, self.callback_expand_with_abbreviation, self.last_expand, True)

        if done and not self.snippet_document[self.view]:
            self.start_edit()

        zen_core.set_caret_placeholder('')

    #--- Wrap with abbreviation ------------------------------------------------

    def core_wrap_with_abbreviation(self, abbr):

        if not abbr:
            return None

        syntax = self.get_syntax()
        profile_name = self.get_profile_name()

        start_offset, end_offset = self.get_selection_range()
        content = self.get_content()

        if start_offset == end_offset:
            rng = html_matcher.match(content, start_offset, profile_name)
            if rng[0] is None:
                return None
            else:
                start_offset, end_offset = rng

        start_offset, end_offset = zen_actions.narrow_to_non_space(content, start_offset, end_offset)
        line_bounds = zen_actions.get_line_bounds(content, start_offset)
        padding = zen_actions.get_line_padding(content[line_bounds[0]:line_bounds[1]])

        new_content = content[start_offset:end_offset]
        return zen_core.wrap_with_abbreviation(abbr, zen_actions.unindent_text(new_content, padding), syntax, profile_name)

    def callback_wrap_with_abbreviation(self, done, abbr, last = False):

        self.buffer.begin_user_action()

        if done:
            self.buffer.undo()
            self.restore_selection()

        if last and self.snippet_document[self.view]:
            content = self.expand_with_snippet(abbr, 2)

        else:

            content = self.core_wrap_with_abbreviation(abbr)

            if content:
                content = content.replace(self.placeholder, '')
                content = re.sub('\$\d+|\$\{\d+:[^\}]*\}', '', content)
                offset_start, offset_end = self.get_selection_range()
                self.replace_content(content, offset_start, offset_end)

        self.buffer.end_user_action()

        return not not content

    def wrap_with_abbreviation(self):

        zen_core.set_caret_placeholder(self.placeholder)
        self.save_selection()

        done, self.last_wrap = zen_dialog.main(self, self.window, self.callback_wrap_with_abbreviation, self.last_wrap, True)

        if done and not self.snippet_document[self.view]:
            self.start_edit()

        zen_core.set_caret_placeholder('')

    #--- Zenify ----------------------------------------------------------------

    def zenify(self, mode):

        offset_start, offset_end, content = self.prepare_nav()
        result = self.html_navigation.zenify(offset_start, offset_end, content, mode)

        if result:
            self.save_selection()
            self.prompt(result)
            self.restore_selection()

    #--- Lorem ipsum -----------------------------------------------------------

    def callback_lorem_ipsum(self, done, cmd, last = False):
        self.buffer.begin_user_action()
        if done:
            self.buffer.undo()
            self.restore_selection()
        content = lorem_ipsum(cmd)
        if content:
            self.replace_content(content, self.get_insert_offset())
        self.buffer.end_user_action()
        return not not content

    def lorem_ipsum(self):
        self.save_selection()
        done, self.last_lorem_ipsum = zen_dialog.main(self, self.window, self.callback_lorem_ipsum, self.last_lorem_ipsum, False)

    #--- Select inward or outward ----------------------------------------------

    def match_pair_inward(self):
        offset_start, offset_end, content = self.prepare_nav()
        offset_start, offset_end = self.html_navigation.inner_bounds(offset_start, offset_end, content)
        if not (offset_start is None or offset_end is None):
            self.create_selection(offset_start, offset_end)

    def match_pair_outward(self):
        offset_start, offset_end, content = self.prepare_nav()
        offset_start, offset_end = self.html_navigation.outer_bounds(offset_start, offset_end, content)
        if not (offset_start is None or offset_end is None):
            self.create_selection(offset_start, offset_end)

    #--- Tag jumps -------------------------------------------------------------

    def new_tag(self, direction):

        offset_start, offset_end, content = self.prepare_nav()

        if direction == 'next':
            node = self.html_navigation.next_tag(offset_start, offset_end, content)

        else:
            node = self.html_navigation.previous_tag(offset_start, offset_end, content)

        if node:
            iter_start = self.buffer.get_iter_at_offset(node.start)
            iter_end = self.buffer.get_iter_at_offset(node.end)
            self.create_selection(node.start, node.end)
            self.show_caret()

    def prev_tag(self):
        self.new_tag('previous')

    def next_tag(self):
        self.new_tag('next')

    #--- Node jumps ------------------------------------------------------------

    def new_node(self, direction, with_spaces = True):

        offset_start, offset_end, content = self.prepare_nav()

        while True:

            if direction == 'next':
                node = self.html_navigation.next_node(offset_start, offset_end, content)

            else:
                node = self.html_navigation.previous_node(offset_start, offset_end, content)

            if node:

                iter_start = self.buffer.get_iter_at_offset(node.start)
                iter_end = self.buffer.get_iter_at_offset(node.end)

                found = self.buffer.get_text(iter_start, iter_end, True).decode('UTF-8')
                if not with_spaces and found.isspace() and found.find('\n') != -1:
                    offset_start = node.start
                    offset_end = node.end

                else:
                    self.create_selection(node.start, node.end)
                    break

            else:
                break

        self.show_caret()

    def prev_node(self):
        self.new_node('previous')

    def next_node(self):
        self.new_node('next')

    #--- Edit points jumps -----------------------------------------------------

    def prev_edit_point(self):
        result = zen_actions.prev_edit_point(self)
        self.show_caret()
        return result

    def next_edit_point(self):
        result = zen_actions.next_edit_point(self)
        self.show_caret()
        return result

    #--- Image actions ---------------------------------------------------------

    def update_image_size(self):
        self.buffer.begin_user_action()
        update_image_size(self)
        self.buffer.end_user_action()

    def encode_decode_base64(self):
        self.buffer.begin_user_action()
        try:
            zen_actions.encode_decode_base64(self)
        except:
            pass
        self.buffer.end_user_action()

    #--- Other edition actions -------------------------------------------------

    def merge_lines(self):
        self.buffer.begin_user_action()
        zen_actions.merge_lines(self)
        self.buffer.end_user_action()

    def remove_tag(self):
        self.buffer.begin_user_action()
        zen_actions.remove_tag(self)
        self.buffer.end_user_action()

    def split_join_tag(self):
        self.buffer.begin_user_action()
        zen_actions.split_join_tag(self)
        self.buffer.end_user_action()

    def toggle_comment(self):
        self.buffer.begin_user_action()
        zen_actions.toggle_comment(self)
        self.buffer.end_user_action()
Ejemplo n.º 3
0
	def prepare_nav(self):
		offset_start, offset_end = self.get_selection_range()
		content = self.get_content()
		if not self.html_navigation:
			self.html_navigation = HtmlNavigation(content)
		return offset_start, offset_end, content
Ejemplo n.º 4
0
 def prepare_nav(self):
     offset_start, offset_end = self.get_selection_range()
     content = self.get_content()
     if not self.html_navigation:
         self.html_navigation = HtmlNavigation(content)
     return offset_start, offset_end, content