Changeset 1497

Show
Ignore:
Timestamp:
07/21/08 20:33:13 (5 weeks ago)
Author:
rob
Message:

Fixed #404: added GuessIndentSize? action that uses the SciTE algorithm to determine tab size

Location:
trunk/peppy
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/peppy/fundamental_menu.py

    r1477 r1497  
    1111from peppy.fundamental import * 
    1212from peppy.lib.userparams import * 
     13from peppy.lib.textutil import * 
    1314 
    1415 
     
    222223        return self.mode.locals.use_tab_characters 
    223224 
     225class GuessIndentSize(SelectAction): 
     226    """Guess the tab size of the current document or selection and set the view parameters""" 
     227    name = "Guess Indent Size" 
     228    default_menu = ("View", 309) 
     229 
     230    def action(self, index=-1, multiplier=1): 
     231        s = self.mode 
     232        (start, end) = s.GetSelection() 
     233        if start==end: 
     234            text = s.GetText() 
     235        else: 
     236            text = s.GetTextRange(start, end) 
     237        size = guessSpacesPerIndent(text) 
     238        if size == 0: 
     239            s.locals.use_tab_characters = True 
     240            self.frame.SetStatusText("Indenting with tab characters") 
     241        elif size > 0: 
     242            s.locals.use_tab_characters = False 
     243            s.locals.indent_size = size 
     244            self.frame.SetStatusText("%d spaces per indent, indenting with spaces" % (size)) 
     245        else: 
     246            self.frame.SetStatusText("Can't determine indent size from document") 
     247        s.setTabStyle() 
     248 
    224249class TabHighlight(FundamentalRadioToggle): 
    225250    local_setting = 'tab_highlight_style' 
     
    457482                     
    458483                    IndentationGuides, IndentSize, IndentWithTabsOrSpaces, 
    459                     TabSize, 
     484                    TabSize, GuessIndentSize, 
    460485                     
    461486                    CaretLineHighlight, CaretWidth, ViewWhitespace, 
  • trunk/peppy/lib/textutil.py

    r1141 r1497  
    130130        return True 
    131131    return False 
     132 
     133 
     134def guessSpacesPerIndent(text): 
     135    """Guess the number of spaces per indent level 
     136     
     137    Takes from the SciTE source file SciTEBase::DiscoverIndentSetting 
     138    """ 
     139    tabsizes = [0]*9 
     140    indent = 0 # current line indentation 
     141    previndent = 0 # previous line indentation 
     142    prevsize = -1 # previous line tab size 
     143    newline = True 
     144    for c in text: 
     145        if c == '\n' or c == '\r': 
     146            newline = True 
     147            indent = 0 
     148        elif newline: 
     149            if c == ' ': 
     150                indent += 1 
     151            else: 
     152                if indent: 
     153                    if indent == previndent and prevsize >= 0: 
     154                        tabsizes[prevsize] += 1 
     155                    elif indent > previndent and previndent >= 0: 
     156                        if indent - previndent <= 8: 
     157                            prevsize = indent - previndent 
     158                            tabsizes[prevsize] += 1 
     159                        else: 
     160                            prevsize = -1 
     161                    previndent = indent 
     162                elif c == '\t': 
     163                    tabsizes[0] += 1 
     164                newline = False 
     165     
     166    # find maximum non-zero indent 
     167    index = -1 
     168    for i, size in enumerate(tabsizes): 
     169        if size > 0 and (index == -1 or size > tabsizes[index]): 
     170            index = i 
     171     
     172    return index 
     173 
     174 
     175if __name__ == "__main__": 
     176    import sys 
     177     
     178    for file in sys.argv[1:]: 
     179        fh = open(file) 
     180        text = fh.read() 
     181        print "file=%s, tabsize=%d" % (file, guessSpacesPerIndent(text))