diff options
author | Scott Bahling <sbahling@suse.de> | 2014-08-18 15:45:22 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2014-08-18 17:39:36 +0200 |
commit | 3d14328637bc4a64dbe69f98b7a7fa0e67a62f8f (patch) | |
tree | 19270acb2af3eff39828311f49c058b3e6c4a959 | |
parent | 3ab297a975186b007769835e02577bd2e93df299 (diff) | |
download | cpaste-3d14328637bc4a64dbe69f98b7a7fa0e67a62f8f.tar.gz cpaste-3d14328637bc4a64dbe69f98b7a7fa0e67a62f8f.tar.xz cpaste-3d14328637bc4a64dbe69f98b7a7fa0e67a62f8f.zip |
Add language guessing
-rwxr-xr-x | cpaste | 42 |
1 files changed, 37 insertions, 5 deletions
@@ -23,13 +23,24 @@ ####################################################################### # # Requires: python-requests +# Optionally requires: python-Pygments # import sys import json import requests from optparse import OptionParser +try: + from pygments.lexers import guess_lexer, guess_lexer_for_filename + guess_lang = True +except ImportError: + guess_lang = False +default_lang = 'text' + +# Map numpy to python because the numpy lexer gives false positives +# when guessing. +lexer_lang_map = {'numpy': 'python'} paste_url = 'https://cpaste.org' @@ -37,8 +48,8 @@ paste_url = 'https://cpaste.org' parser = OptionParser() parser.add_option("-f", "--file", dest="filename", help="Read from a file instead of stdin", metavar="FILE") -parser.add_option("-l", "--lang", action="store", type="string", dest="lang", default="text", - help="Specifiy the language (defaults to text).", metavar="LANG") +parser.add_option("-l", "--lang", action="store", type="string", dest="lang", + help="Specifiy the language.", metavar="LANG") parser.add_option("-p", "--private", action="store_true", dest="private", default=False, help="Create a private post") @@ -52,19 +63,40 @@ if options.filename: if not f: print "Oops, could not open file!" - paste_data = f.readlines() + paste_data = f.read() else: - paste_data = sys.stdin.readlines() + paste_data = sys.stdin.read() if not paste_data: print "Oops, we have no data" sys.exit(1) +if not options.lang and guess_lang: + # If we have a filename, try guessing using the more reliable + # guess_lexer_for_filename function. + # If that fails, try the guess_lexer function on the code. + if options.filename: + try: + options.lang = guess_lexer_for_filename(options.filename, + paste_data).name.lower() + except: + print "No guess by filename" + pass + if not options.lang: + try: + options.lang = guess_lexer(paste_data).name.lower() + options.lang = lexer_lang_map.get(options.lang, options.lang) + except: + pass + +# Use default if no language specified or guessed +options.lang = options.lang or default_lang + if int(options.expire) != 86400: options.expire = int(options.expire) * 60 # json payload -payload = {'data':''.join(paste_data), 'language': options.lang, 'private': options.private, 'expire': options.expire} +payload = {'data': paste_data, 'language': options.lang, 'private': options.private, 'expire': options.expire} # http content type headers = {'Content-Type': 'application/json'} |