text: #!/usr/bin/env python
  
  """Manipulate Mac OS clipboard ("scrap") from Python.
  
  See also: pbcopy(1), pbpaste(1)"""
  
  from sys import stdin, stdout
  from optparse import OptionParser
  from Carbon.Scrap import GetCurrentScrap, ClearCurrentScrap
  import MacOS
  
  def paste(flavorType='TEXT', verbose=False):
      try:
          scrap = GetCurrentScrap()
          return scrap.GetScrapFlavorData(flavorType)
      except MacOS.Error as e:
          if verbose or e[0] != -102:
              # -102 == noTypeErr
              raise
          return ""
  
  def copy(text, flavorType='TEXT'):
      ClearCurrentScrap()
      scrap = GetCurrentScrap()
      scrap.PutScrapFlavor(flavorType, 0, text)
  
  def list_flavors():
      scrap = GetCurrentScrap()
      return [(name, scrap.GetScrapFlavorSize(name))
              for name, flags in scrap.GetScrapFlavorInfoList()]
  
  def main():
      parser = OptionParser()
      parser.set_defaults(flavor='TEXT', translate=True, copy=False,
                          list_=False, verbose=False)
      parser.add_option("-c", "--copy", dest="copy", action="store_true",
                        help="copy stdin to clipboard [default: paste clipboard"
                             " to stdout]")
      parser.add_option("-l", "--list", dest="list_", action="store_true",
                        help="list currently available flavors with data sizes")
      parser.add_option("-x", "--notrans", dest="translate",
                        action="store_false",
                        help="don't translate CR to LF on output")
      parser.add_option("-f", "--flavor", dest="flavor", action="store",
                        help="specify flavor [default: TEXT]")
      parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
                        help="complain if scrap flavor not found [default:"
                             " treat as empty]")
      
      options, args = parser.parse_args()
      if options.list_:
          for flavor in list_flavors():
              print("'%s' %9d" % flavor)
      elif options.copy:
          copy(stdin.read(), options.flavor)
      else:
          text = paste(options.flavor, options.verbose)
          if options.translate:
              text = text.replace('\r', '\n')
          stdout.write(text)
  
  __all__ = ['paste', 'copy', 'list_flavors', 'main']
  
  if __name__ == "__main__":
      main()
  