Esempio n. 1
0
def act(controller, bundle, options):
    context = cp.get_context(controller)
    line_ending = cp.get_line_ending(context)
    
    direction = cp.get_option(options, 'direction', 'down')
    duplicate = cp.get_option(options, 'duplicate', False)
    
    text, target_range = cp.lines_and_range(context)
    select_range = cp.get_range(context)
    
    if duplicate:
        cloned = text
        
        if not cloned.endswith(line_ending):
            cloned += line_ending
        
        if direction.lower() == 'down':
            select_range = cp.new_range(select_range.location + len(cloned), select_range.length)
        
        text = cloned + text
    else:
        if direction.lower() == 'down':
            line_after = cp.get_line_after(context, target_range)
            if line_after is None: return
            
            # we care about the original length of line after, not the balanced one we'll get in a second
            len_line_after = len(line_after)
            
            line_after, text = cp.balance_line_endings(line_after, text, line_ending)
            line_delta = len(line_after) - len_line_after
            
            select_start = select_range.location + len(line_after)
            select_end = min(select_start + select_range.length, len(context.string()))
            
            text = line_after + text
            
            select_range = cp.new_range(select_start, max(0,select_end - select_start))
            target_range = cp.new_range(target_range.location, max(0, target_range.length + len(line_after) - (len(line_after) - len_line_after)))
        else:
            line_before = cp.get_line_before(context, target_range)
            if line_before is None: return
            
            # we care about the original length of line before, not the balanced one we'll get in a second
            len_line_before = len(line_before)
            
            text, line_before = cp.balance_line_endings(text, line_before, line_ending)
            
            text = text + line_before
            select_range = cp.new_range(select_range.location - len_line_before, select_range.length)
            target_range = cp.new_range(target_range.location - len_line_before, target_range.length + len_line_before)
    
    cp.insert_text_and_select(context, text, target_range, select_range)
Esempio n. 2
0
def act(controller, bundle, options):
    context = cp.get_context(controller)
    line_ending = cp.get_line_ending(context)
    
    hash_type = cp.get_option(options, 'type', 'md5').lower()
    
    text, target_range = cp.lines_and_range(context)
    
    if hash_type == 'adler-32':
        text = str(zlib.adler32(text))
    elif hash_type == 'crc-32':
        text = str(zlib.crc32(text))
    elif hash_type == 'md5':
        text = hashlib.md5(text).hexdigest()
    elif hash_type == 'rmd160':
        text = hashlib.new('rmd160', string=text).hexdigest()
    elif hash_type == 'sha-1':
        text = hashlib.sha1(text).hexdigest()
    elif hash_type == 'sha-224':
        text = hashlib.sha224(text).hexdigest()
    elif hash_type == 'sha-256':
        text = hashlib.sha256(text).hexdigest()
    elif hash_type == 'sha-384':
        text = hashlib.sha384(text).hexdigest()
    elif hash_type == 'sha-512':
        text = hashlib.sha512(text).hexdigest()
    else:
        return
    
    cp.insert_text(context, text, target_range)
Esempio n. 3
0
def act(controller, bundle, options):
    '''
    Required action method
    
    Setting decode=True will decode instead of encoding
    '''
    
    context = cp.get_context(controller)
    decode = cp.get_option(options, 'decode', False)
    
    selection, range = cp.selection_and_range(context)
    
    # do nothing unless they selected something
    if range.length == 0:
        return
    
    if decode:
        try:
            text = base64.b64decode(selection)
            
        # base64decode raises a TypeError if the string doesn't have the right
        # padding, or if it's invalid base64... We'll just catch this error
        # and do nothing at all :)
        except TypeError:
            return
        
        # also, base64decode tends to return an empty string, which is also lame
        if range.length and not len(text):
            return
    
    else:
        text = base64.b64encode(selection)
    
    cp.insert_text(context, text, range)
Esempio n. 4
0
def act(controller, bundle, options):
    '''
    Required action method
    '''
    
    context = cp.get_context(controller)
    
    from_lang = cp.get_option(options, 'from', 'markdown').lower()
    to_lang = cp.get_option(options, 'to', 'html').lower()
    
    selection, range = cp.selection_and_range(context)
    
    # grab the whole document if they haven't selected anything...
    if range.length == 0:
        selection = context.string()
        range = cp.new_range(0, len(selection))
    
    # what are we coming from?
    if from_lang == 'markdown':
        html = markdown(selection)
    elif from_lang == 'textile':
        html = textile(selection)
    elif from_lang == 'rest':
        html = rest2html(selection)
    elif from_lang == 'html':
    	html = selection
    else:
    	return
    
    # what are we going to?
    if to_lang == 'markdown':
    	text = html2text(html)
    elif to_lang == 'textile':
    	text = html2textile(html)
    elif to_lang == 'rest':
        text = html2rest(html)
    elif to_lang == 'html':
    	text = html
    else:
    	return
    
    cp.insert_text(context, text, range)
Esempio n. 5
0
def act(controller, bundle, options):
    '''
    Required action method
    
    if supplied, message will be written instead of Hello World
    
    Setting replace=True replace the current selection instead of inserting
    '''
    
    context = cp.get_context(controller)
    
    message = cp.get_option(options, 'message', 'Hello World')
    replace_selection = cp.get_option(options, 'replace', False)
    
    range = cp.get_range(context)
    
    if not replace_selection:
        range = cp.new_range(range.location, 0)
    
    cp.insert_text(context, message, range)
Esempio n. 6
0
def act(controller, bundle, options):
    '''
    Required action method
    '''

    context = cp.get_context(controller)
    line_ending = cp.get_line_ending(context)
    lines, range = cp.lines_and_range(context)

    if lines.endswith(line_ending):
        lines = lines[:-len(line_ending)]
        range = cp.new_range(range.location, range.length - len(line_ending))

    try:
        newlines = line_ending.join(wrap_comment(
            lines.split(line_ending),
            context.tabWidth(),
            cp.get_option(options, 'width'),
            cp.get_option(options, 'min_width')
        ))
        cp.insert_text_and_select(context, newlines, range, cp.new_range(range.location, len(newlines)))
    except:
        cp.beep()
        raise
Esempio n. 7
0
def act(controller, bundle, options):
    context = cp.get_context(controller)
    line_ending = cp.get_line_ending(context)
    
    direction = cp.get_option(options, 'direction', 'right')
    
    line_text, line_range = cp.lines_and_range(context)
    selection, select_range = cp.selection_and_range(context)
    if select_range.length == 0:
        selection, select_range = cp.words_and_range(context)
    
    cp.say(context, 'word(s)', '||%s||' % selection)
    return
    
    if direction.lower() == 'left':
        prefix = line_text[:(select_range.location - line_range.location)]
        
        if not prefix.strip():
            cp.beep()
            return
        
        # we care about the original length of line after, not the balanced one we'll get in a second
        len_line_after = len(line_after)
        
        line_after, text = cp.balance_line_endings(line_after, text, line_ending)
        line_delta = len(line_after) - len_line_after
        
        select_start = select_range.location + len(line_after)
        select_end = min(select_start + select_range.length, len(context.string()))
        
        text = line_after + text
        
        select_range = cp.new_range(select_start, max(0,select_end - select_start))
        target_range = cp.new_range(target_range.location, max(0, target_range.length + len(line_after) - (len(line_after) - len_line_after)))
    else:
        line_before = cp.get_line_before(context, target_range)
        if line_before is None: return
        
        # we care about the original length of line before, not the balanced one we'll get in a second
        len_line_before = len(line_before)
        
        text, line_before = cp.balance_line_endings(text, line_before, line_ending)
        
        text = text + line_before
        select_range = cp.new_range(select_range.location - len_line_before, select_range.length)
        target_range = cp.new_range(target_range.location - len_line_before, target_range.length + len_line_before)
    
    cp.insert_text_and_select(context, text, target_range, select_range)
Esempio n. 8
0
def act(controller, bundle, options):
    '''
    Required action method
    
    Supplying a lang option will override the automatic language guessing
    (which might not be such a bad thing...)
    '''
    
    context = cp.get_context(controller)

    lang = cp.get_option(options, 'lang', 'auto').lower()
    
    # get the file extension so we can guess the language.
    if lang == 'auto':
        path = context.path()
        if path is not None:
            pos = path.rfind('.')
            if pos != -1:
                lang = path[pos+1:]
    
    d = Docblock.get(lang)
    
    # get the current line
    text, target_range = cp.lines_and_range(context)
    
    # keep going until we find a non-empty line to document (up to X lines below the current line)
    tries_left = 3
    while tries_left and not text.strip():
        text, target_range = cp.get_line_after_and_range(context, target_range)
        
        if text is None:
            # we're at the end of the document?
            cp.beep()
            return
        
        tries_left -= 1
    
    insert_range = cp.new_range(target_range.location, 0)
    
    d.setLineEnding(cp.get_line_ending(context))
    docblock = d.doc(text)
    
    if docblock:
        cp.insert_text_with_insertion_point(context, docblock, insert_range)
    else:
        cp.beep()
def act(controller, bundle, options):
    '''
    Required action method
    
    Supplying a lang option will override the automatic language guessing
    (which might not be such a bad thing...)
    '''

    context = cp.get_context(controller)

    lang = cp.get_option(options, 'lang', 'auto').lower()

    # get the file extension so we can guess the language.
    if lang == 'auto':
        path = context.path()
        if path is not None:
            pos = path.rfind('.')
            if pos != -1:
                lang = path[pos + 1:]

    d = Docblock.get(lang)

    # get the current line
    text, target_range = cp.lines_and_range(context)

    # keep going until we find a non-empty line to document (up to X lines below the current line)
    tries_left = 3
    while tries_left and not text.strip():
        text, target_range = cp.get_line_after_and_range(context, target_range)

        if text is None:
            # we're at the end of the document?
            cp.beep()
            return

        tries_left -= 1

    insert_range = cp.new_range(target_range.location, 0)

    d.setLineEnding(cp.get_line_ending(context))
    docblock = d.doc(text)

    if docblock:
        cp.insert_text_with_insertion_point(context, docblock, insert_range)
    else:
        cp.beep()
Esempio n. 10
0
def act(controller, bundle, options):
    context = cp.get_context(controller)
    line_ending = cp.get_line_ending(context)

    direction = cp.get_option(options, 'direction', 'down')

    selection, current_range = cp.lines_and_range(context)

    if direction == 'down':
        target = select = cp.new_range(current_range.location + current_range.length, 0)
        if not selection.endswith(line_ending):
            select = cp.new_range(select.location + 1, 0)

    else:
        target = cp.new_range(max(current_range.location - 1, 0), 0)
        select = cp.new_range(current_range.location, 0)

    cp.insert_text_and_select(context, line_ending, target, select)
Esempio n. 11
0
def act(controller, bundle, options):
    '''
    Required action method
    
    Setting decode=True will decode instead of encoding
    '''
    
    context = cp.get_context(controller)
    decode = cp.get_option(options, 'decode', False)
    
    selection, range = cp.selection_and_range(context)
    
    # do nothing unless they selected something
    if range.length == 0:
        return
    
    if decode:
        text = enc.htmlDecode(selection)
    else:
        text = enc.htmlEncode(selection)
    
    cp.insert_text(context, text, range)
Esempio n. 12
0
def act(controller, bundle, options):
    '''
    Required action method
    
    Set desired capitalization with 'to_case' option
    '''
    
    context = cp.get_context(controller)
    to_case = cp.get_option(options, 'to_case', 'upper').lower()
    line_ending = cp.get_line_ending(context)
    
    text, range = cp.selection_and_range(context)
    
    # if nothing is selected, assume we're talking about the line.
    if range.length == 0:
        text, range = cp.lines_and_range(context)
        
        # we really only want most of this... lines_and_range returns a newline char at the end
        if text.endswith(line_ending):
            range = cp.new_range(range.location, range.length - len(line_ending))
            text = cp.get_selection(context, range)
    
    if to_case == 'upper':
        text = text.upper()
    elif to_case == 'lower':
        text = text.lower()
    elif to_case == 'title':
        text = line_ending.join([titlecase(x) for x in text.split(line_ending)])
    elif to_case == 'sentence':
        text = sentencecase(text)
    elif to_case == 'invert':
        text = text.swapcase()
    else:
        return
    
    # insert and select the resulting insertion
    cp.insert_text_and_select(context, text, range, cp.new_range(range.location, len(text)))