Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- """
- Titlecase: https://github.com/ppannuto/python-titlecase
- Original Perl version by: John Gruber http://daringfireball.net/ 10 May 2008
- Python version by Stuart Colville http://muffinresearch.co.uk
- License: http://www.opensource.org/licenses/mit-license.php
- """
- import os
- import argparse
- import re
- import sys
- SMALL = 'a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|v\.?|via|vs\.?'
- PUNCT = r"""!"#$%&'‘()*+,\-–‒—―./:;?@[\\\]_`{|}~"""
- SMALL_WORDS = re.compile(r'^(%s)$' % SMALL, re.I)
- INLINE_PERIOD = re.compile(r'[a-z][.][a-z]', re.I)
- UC_ELSEWHERE = re.compile(r'[%s]*?[a-zA-Z]+[A-Z]+?' % PUNCT)
- CAPFIRST = re.compile(r"^[%s]*?([A-Za-z])" % PUNCT)
- SMALL_FIRST = re.compile(r'^([%s]*)(%s)\b' % (PUNCT, SMALL), re.I)
- SMALL_LAST = re.compile(r'\b(%s)[%s]?$' % (SMALL, PUNCT), re.I)
- SUBPHRASE = re.compile(r'([:.;?!\-–‒—―][ ])(%s)' % SMALL)
- APOS_SECOND = re.compile(r"^[dol]{1}['‘]{1}[a-z]+(?:['s]{2})?$", re.I)
- UC_INITIALS = re.compile(r"^(?:[A-Z]{1}\.{1}|[A-Z]{1}\.{1}[A-Z]{1})+$")
- MAC_MC = re.compile(r"^([Mm]c|MC)(\w.+)")
- class Immutable(object):
- pass
- text_type = unicode if sys.version_info < (3,) else str
- class ImmutableString(text_type, Immutable):
- pass
- class ImmutableBytes(bytes, Immutable):
- pass
- def _mark_immutable(text):
- if isinstance(text, bytes):
- return ImmutableBytes(text)
- return ImmutableString(text)
- def set_small_word_list(small=SMALL):
- global SMALL_WORDS
- global SMALL_FIRST
- global SMALL_LAST
- global SUBPHRASE
- SMALL_WORDS = re.compile(r'^(%s)$' % small, re.I)
- SMALL_FIRST = re.compile(r'^([%s]*)(%s)\b' % (PUNCT, small), re.I)
- SMALL_LAST = re.compile(r'\b(%s)[%s]?$' % (small, PUNCT), re.I)
- SUBPHRASE = re.compile(r'([:.;?!][ ])(%s)' % small)
- def titlecase(text, callback=None, small_first_last=True):
- """
- Titlecases input text
- This filter changes all words to Title Caps, and attempts to be clever
- about *un*capitalizing SMALL words like a/an/the in the input.
- The list of "SMALL words" which are not capped comes from
- the New York Times Manual of Style, plus 'vs' and 'v'.
- """
- lines = re.split('[\r\n]+', text)
- processed = []
- for line in lines:
- all_caps = line.upper() == line
- words = re.split('[\t ]', line)
- tc_line = []
- for word in words:
- if callback:
- new_word = callback(word, all_caps=all_caps)
- if new_word:
- # Address #22: If a callback has done something
- # specific, leave this string alone from now on
- tc_line.append(_mark_immutable(new_word))
- continue
- if all_caps:
- if UC_INITIALS.match(word):
- tc_line.append(word)
- continue
- if APOS_SECOND.match(word):
- if len(word[0]) == 1 and word[0] not in 'aeiouAEIOU':
- word = word[0].lower() + word[1] + word[2].upper() + word[3:]
- else:
- word = word[0].upper() + word[1] + word[2].upper() + word[3:]
- tc_line.append(word)
- continue
- match = MAC_MC.match(word)
- if match:
- tc_line.append("%s%s" % (match.group(1).capitalize(),
- titlecase(match.group(2),callback,small_first_last)))
- continue
- if INLINE_PERIOD.search(word) or (not all_caps and UC_ELSEWHERE.match(word)):
- tc_line.append(word)
- continue
- if SMALL_WORDS.match(word):
- tc_line.append(word.lower())
- continue
- if "/" in word and "//" not in word:
- slashed = map(
- lambda t: titlecase(t,callback,False),
- word.split('/')
- )
- tc_line.append("/".join(slashed))
- continue
- if '-' in word:
- hyphenated = map(
- lambda t: titlecase(t,callback,small_first_last),
- word.split('-')
- )
- tc_line.append("-".join(hyphenated))
- continue
- if all_caps:
- word = word.lower()
- # Just a normal word that needs to be capitalized
- tc_line.append(CAPFIRST.sub(lambda m: m.group(0).upper(), word))
- if small_first_last and tc_line:
- if not isinstance(tc_line[0], Immutable):
- tc_line[0] = SMALL_FIRST.sub(lambda m: '%s%s' % (
- m.group(1),
- m.group(2).capitalize()
- ), tc_line[0])
- if not isinstance(tc_line[-1], Immutable):
- tc_line[-1] = SMALL_LAST.sub(
- lambda m: m.group(0).capitalize(), tc_line[-1]
- )
- result = " ".join(tc_line)
- result = SUBPHRASE.sub(lambda m: '%s%s' % (
- m.group(1),
- m.group(2).capitalize()
- ), result)
- processed.append(result)
- return "\n".join(processed)
- def cmd():
- '''Handler for command line invocation'''
- # Try to handle any reasonable thing thrown at this.
- # Consume '-f' and '-o' as input/output, allow '-' for stdin/stdout
- # and treat any subsequent arguments as a space separated string to
- # be titlecased (so it still works if people forget quotes)
- parser = argparse.ArgumentParser()
- in_group = parser.add_mutually_exclusive_group()
- in_group.add_argument('string', nargs='*', default=[],
- help='String to titlecase')
- in_group.add_argument('-f', '--input-file',
- help='File to read from to titlecase')
- parser.add_argument('-o', '--output-file',
- help='File to write titlecased output to)')
- args = parser.parse_args()
- if args.input_file is not None:
- if args.input_file == '-':
- ifile = sys.stdin
- else:
- ifile = open(args.input_file)
- else:
- ifile = sys.stdin
- if args.output_file is not None:
- if args.output_file == '-':
- ofile = sys.stdout
- else:
- ofile = open(args.output_file, 'w')
- else:
- ofile = sys.stdout
- if len(args.string) > 0:
- in_string = ' '.join(args.string)
- else:
- with ifile:
- in_string = ifile.read()
- with ofile:
- ofile.write(titlecase(in_string))
- path = raw_input("Enter path to folder: ")
- for root, dirs, files in os.walk(path):
- for name in files:
- old = os.path.join(root, name)
- new = os.path.join(root, titlecase(name))
- os.rename(old, new)
- print "Alldone"
Advertisement
Add Comment
Please, Sign In to add comment