def get_profile_name(self): """ Returns current output profile name (@see zen_coding#setup_profile) @return {String} """ forced_profile = zen.get_variable("profile") if forced_profile: return forced_profile close_string = tea.get_tag_closestring(self._context) if close_string == "/": return "xml" elif close_string != " /": return "html" else: return "xhtml"
def get_profile_name(self): """ Returns current output profile name (@see zen_coding#setup_profile) @return {String} """ forced_profile = zen.get_variable('profile') if forced_profile: return forced_profile close_string = tea.get_tag_closestring(self._context) if close_string == '/': return 'xml' elif close_string != ' /': return 'html' else: return 'xhtml'
def get_profile_name(self): """ Returns current output profile name (@see zen_coding#setup_profile) @return {String} """ # forced_profile = zen.get_variable('profile') # if forced_profile: # return forced_profile close_string = tea.get_tag_closestring(self._context) if close_string == '/': return 'xml' elif close_string != ' /': return 'html' else: return 'xhtml'
def act(context, default=None, alpha_numeric=True, extra_characters='', bidirectional=True, mode=None, close_string='', undo_name=None, **syntaxes): ''' Required action method Transforms the word under the cursor (or the word immediately previous to the cursor) into a snippet (or processes it using zen-coding) The snippet offers two placeholders: $EDITOR_SELECTION: replaced with the word, or any selected text $WORD: if text is selected, replaced just with the first word ''' if default is None: return False range = tea.get_single_range(context, True) if range == None: return False # Check for specific zone override snippet = tea.select_from_zones(context, range, default, **syntaxes) # Fetch the word word, new_range = tea.get_word_or_selection(context, range, alpha_numeric, extra_characters, bidirectional) if word == '': # No word, so nothing further to do return False # If we're using $WORD, make sure the word is just a word if snippet.find('$WORD') >= 0: fullword = word word = tea.parse_word(word) if word is None: word = '' else: fullword = word # We've got some extra work if the mode is HTML or zen # This is a really hacky solution, but I can't think of a concise way to # represent this functionality via XML # TODO remove it if mode == 'zen' and fullword.find(' ') < 0: # Explicitly load zen settings zen_settings = settings_loader.load_settings() zen_core.update_settings(zen_settings) # Set up the config variables zen_core.newline = tea.get_line_ending(context) zen_settings['variables']['indentation'] = tea.get_indentation_string(context) # This allows us to use smart incrementing tab stops in zen snippets point_ix = [0] def place_ins_point(text): point_ix[0] += 1 return '$%s' % point_ix[0] zen_core.insertion_point = place_ins_point # Detect the type of document we're working with zones = { 'css, css *': 'css', 'xsl, xsl *': 'xsl', 'xml, xml *': 'xml' } doc_type = tea.select_from_zones(context, range, 'html', **zones) # Setup the zen profile based on doc_type and XHTML status profile = {} if doc_type == 'html': close_string = tea.get_tag_closestring(context) if close_string == '/': profile['self_closing_tag'] = True elif close_string != ' /': profile['self_closing_tag'] = False elif doc_type == 'xml': profile = {'self_closing_tag': True, 'tag_nl': True} zen_core.setup_profile('tea_profile', profile) # Prepare the snippet snippet = zen_core.expand_abbreviation(fullword, doc_type, 'tea_profile') elif (mode == 'zen' or mode == 'html') and tea.is_selfclosing(word): # Self-closing, so construct the snippet from scratch snippet = '<' + fullword if fullword == word and not fullword in ['br', 'hr']: snippet += ' $1' snippet += '$E_XHTML>$0' # Special replacement in case we're using $WORD snippet = snippet.replace('$WORD', word) # Construct the snippet snippet = tea.construct_snippet(fullword, snippet) return tea.insert_snippet_over_range(context, snippet, new_range, undo_name)
def act( context, default=None, alpha_numeric=True, extra_characters="", bidirectional=True, mode=None, close_string="", undo_name=None, **syntaxes ): """ Required action method Transforms the word under the cursor (or the word immediately previous to the cursor) into a snippet (or processes it using zen-coding) The snippet offers two placeholders: $SELECTED_TEXT: replaced with the word, or any selected text $WORD: if text is selected, replaced just with the first word """ if default is None: return False range = tea.get_single_range(context, True) if range == None: return False # Check for specific zone override snippet = tea.select_from_zones(context, range, default, **syntaxes) # Fetch the word word, new_range = tea.get_word_or_selection(context, range, alpha_numeric, extra_characters, bidirectional) if word == "": # No word, so nothing further to do return False # If we're using $WORD, make sure the word is just a word if snippet.find("$WORD") >= 0: fullword = word word = tea.parse_word(word) if word is None: word = "" else: fullword = word # We've got some extra work if the mode is HTML or zen # This is a really hacky solution, but I can't think of a concise way to # represent this functionality via XML if mode == "zen" and fullword.find(" ") < 0: # Set up the config variables zen_core.newline = tea.get_line_ending(context) # This allows us to use smart incrementing tab stops in zen snippets global point_ix point_ix = 0 def place_ins_point(text): globals()["point_ix"] += 1 return "$%s" % point_ix zen_core.insertion_point = place_ins_point zen_core.sub_insertion_point = place_ins_point zen_core.selfclosing_string = tea.get_tag_closestring(context) zen_settings["indentation"] = tea.get_indentation_string(context) # Detect the type of document we're working with zones = {"css, css *": "css", "xsl, xsl *": "xsl", "xml, xml *": "xml"} doc_type = tea.select_from_zones(context, range, "html", **zones) # Prepare the snippet snippet = zen_core.expand_abbr(fullword, doc_type) elif (mode == "zen" or mode == "html") and tea.is_selfclosing(word): # Self-closing, so construct the snippet from scratch snippet = "<" + fullword if fullword == word and not fullword in ["br", "hr"]: snippet += " $1" snippet += "$E_XHTML>$0" # Indent the snippet snippet = tea.indent_snippet(context, snippet, new_range) # Special replacement in case we're using $WORD snippet = snippet.replace("$WORD", word) # Construct the snippet snippet = tea.construct_snippet(fullword, snippet) return tea.insert_snippet_over_range(context, snippet, new_range, undo_name)
def performActionWithContext_error_(self, context): ''' Gathers the necessary info, populates the environment, and runs the script ''' def execute(file, input): '''Utility function for running the script''' script = subprocess.Popen( [file], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) return script.communicate(str(input)) if self.script is None: tea.log('No script found') return False # Environment variables that won't change with repetition os.putenv('E_SUGARPATH', self.bundle_path) filepath = context.documentContext().fileURL() if filepath is not None: os.putenv('E_FILENAME', filepath.path().lastPathComponent()) if filepath.isFileURL(): os.putenv( 'E_DIRECTORY', filepath.path().stringByDeletingLastPathComponent() ) os.putenv('E_FILEPATH', filepath.path()) root = tea.get_root_zone(context) if root is False: root = '' os.putenv('E_ROOT_ZONE', root) # Set up the preferences prefs = tea.get_prefs(context) os.putenv('E_SOFT_TABS', str(prefs.insertsSpacesForTab())) os.putenv('E_TAB_SIZE', str(prefs.numberOfSpacesForTab())) os.putenv('E_LINE_ENDING', prefs.lineEndingString()) os.putenv('E_XHTML', tea.get_tag_closestring(context)) # Set up the user-defined shell variables defaults = NSUserDefaults.standardUserDefaults() for item in defaults.arrayForKey_('TEAShellVariables'): if 'variable' in item and item['variable'] != '': os.putenv(item['variable'], item['value']) # Initialize our common variables recipe = tea.new_recipe() ranges = tea.get_ranges(context) # Check the user script folder for overrides file = os.path.join(os.path.expanduser( '~/Library/Application Support/Espresso/TEA/Scripts/' ), self.script) if not os.path.exists(file): file = os.path.join(self.bundle_path, 'TEA', self.script) if not os.path.exists(file): # File doesn't exist in the bundle, either, so something is screwy return tea.say( context, 'Error: could not find script', 'TEA could not find the script associated with this action. '\ 'Please contact the Sugar developer, or make sure it is '\ 'installed here:\n\n'\ '~/Library/Application Support/Espresso/TEA/Scripts' ) # There's always at least one range; this thus supports multiple # discontinuous selections for range in ranges: # These environment variables may change with repetition, so reset os.putenv('E_SELECTED_TEXT', str(context.string().substringWithRange_(range)) ) word, wordrange = tea.get_word(context, range) os.putenv('E_CURRENT_WORD', str(word)) os.putenv('E_CURRENT_LINE', str(context.string().substringWithRange_( context.lineStorage().lineRangeForRange_(range) )) ) os.putenv( 'E_LINENUMBER', str(context.lineStorage().lineNumberForIndex_(range.location)) ) os.putenv('E_LINEINDEX', str( range.location - \ context.lineStorage().lineStartIndexForIndex_lineNumber_( range.location, None ) )) active = tea.get_active_zone(context, range) if active is False: active = '' os.putenv('E_ACTIVE_ZONE', str(active)) # Setup STDIN and track the source source = 'input' if self.input == 'selection': input = tea.get_selection(context, range) if input == '': if self.alt == 'document': input = context.string() elif self.alt == 'line': input, range = tea.get_line(context, range) # For this usage, we don't want to pass the final linebreak input = input[:-1] range = tea.new_range(range.location, range.length-1) elif self.alt == 'word': input, range = tea.get_word(context, range) elif self.alt == 'character': input, range = tea.get_character(context, range) source = 'alt' elif self.input == 'document': input = context.string() else: input = '' # Run the script try: output, error = execute(file, input) except: # Most likely cause of failure is lack of executable status try: os.chmod(file, 0755) output, error = execute(file, input) except: # Failed to execute completely, so exit with error return tea.say( context, 'Error: cannot execute script', 'Error: could not execute the script. Please contact '\ 'the Sugar author.' ) # Log errors if error: tea.log(str(error)) # Process the output output = output.decode('utf-8') if self.output == 'document' or \ (source == 'alt' and self.alt == 'document'): docrange = tea.new_range(0, context.string().length()) recipe.addReplacementString_forRange_(output, docrange) break elif self.output == 'text': recipe.addReplacementString_forRange_(output, range) elif self.output == 'snippet': recipe.addDeletedRange_(range) break # If no output, we don't need to go any further if self.output is None: return True # Made it here, so apply the recipe and return if self.undo is not None: recipe.setUndoActionName_(self.undo) recipe.prepare() if recipe.numberOfChanges() > 0: response = context.applyTextRecipe_(recipe) else: response = True if self.output == 'snippet': response = tea.insert_snippet(context, output) return response