summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Bahling <sbahling@suse.de>2014-08-18 15:45:22 +0200
committerAndreas Schneider <asn@cryptomilk.org>2014-08-18 17:39:36 +0200
commit3d14328637bc4a64dbe69f98b7a7fa0e67a62f8f (patch)
tree19270acb2af3eff39828311f49c058b3e6c4a959
parent3ab297a975186b007769835e02577bd2e93df299 (diff)
downloadcpaste-3d14328637bc4a64dbe69f98b7a7fa0e67a62f8f.tar.gz
cpaste-3d14328637bc4a64dbe69f98b7a7fa0e67a62f8f.tar.xz
cpaste-3d14328637bc4a64dbe69f98b7a7fa0e67a62f8f.zip
Add language guessing
-rwxr-xr-xcpaste42
1 files changed, 37 insertions, 5 deletions
diff --git a/cpaste b/cpaste
index 5df0b86..dfaf00e 100755
--- a/cpaste
+++ b/cpaste
@@ -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'}