diff --git a/dpaste/forms.py b/dpaste/forms.py index 3019f9e..2db6d1d 100644 --- a/dpaste/forms.py +++ b/dpaste/forms.py @@ -1,24 +1,23 @@ +import datetime + from django import forms from django.conf import settings from django.utils.translation import ugettext_lazy as _ + from dpaste.models import Snippet from dpaste.highlight import LEXER_LIST, LEXER_DEFAULT -import datetime -#=============================================================================== -# Snippet Form and Handling -#=============================================================================== EXPIRE_CHOICES = ( (3600, _(u'In one hour')), (3600 * 24 * 7, _(u'In one week')), (3600 * 24 * 30, _(u'In one month')), ) - -EXPIRE_DEFAULT = 3600 * 24 * 30 - +EXPIRE_DEFAULT = EXPIRE_CHOICES[2][0] MAX_CONTENT_LENGTH = getattr(settings, 'DPASTE_MAX_CONTENT_LENGTH', 250*1024*1024) +MAX_SNIPPETS_PER_USER = getattr(settings, 'DPASTE_MAX_SNIPPETS_PER_USER', 15) +\ class SnippetForm(forms.ModelForm): content = forms.CharField( label=_('Content'), @@ -29,7 +28,7 @@ class SnippetForm(forms.ModelForm): lexer = forms.ChoiceField( label=_(u'Lexer'), initial=LEXER_DEFAULT, - widget=forms.TextInput, + choices=LEXER_LIST, ) expire_options = forms.ChoiceField( @@ -55,35 +54,23 @@ class SnippetForm(forms.ModelForm): def __init__(self, request, *args, **kwargs): super(SnippetForm, self).__init__(*args, **kwargs) self.request = request - self.fields['lexer'].choices = LEXER_LIST - self.fields['lexer'].widget.attrs = { - 'autocomplete': 'off', - 'data-provide': 'typeahead', - 'data-source': '["%s"]' % '","'.join(dict(LEXER_LIST).keys()) - } # Set the recently used lexer if we have any session_lexer = self.request.session.get('lexer') if session_lexer and session_lexer in dict(LEXER_LIST).keys(): self.fields['lexer'].initial = session_lexer - def clean_lexer(self): - lexer = self.cleaned_data.get('lexer') - if not lexer: - return LEXER_DEFAULT - lexer = dict(LEXER_LIST).get(lexer, LEXER_DEFAULT) - return lexer - def clean_content(self): return self.cleaned_data.get('content', '').strip() def clean(self): + # The `title` field is a hidden honeypot field. If its filled, + # this is likely spam. if self.cleaned_data.get('title'): raise forms.ValidationError('This snippet was identified as Spam.') return self.cleaned_data def save(self, parent=None, *args, **kwargs): - # Set parent snippet if parent: self.instance.parent = parent @@ -97,7 +84,7 @@ class SnippetForm(forms.ModelForm): # Add the snippet to the user session list if self.request.session.get('snippet_list', False): - if len(self.request.session['snippet_list']) >= getattr(settings, 'MAX_SNIPPETS_PER_USER', 10): + if len(self.request.session['snippet_list']) >= MAX_SNIPPETS_PER_USER: self.request.session['snippet_list'].pop(0) self.request.session['snippet_list'] += [self.instance.pk] else: @@ -106,4 +93,4 @@ class SnippetForm(forms.ModelForm): # Save the lexer in the session so we can use it later again self.request.session['lexer'] = self.cleaned_data['lexer'] - return self.request, self.instance \ No newline at end of file + return self.instance \ No newline at end of file diff --git a/dpaste/highlight.py b/dpaste/highlight.py index ef0389d..84306b5 100644 --- a/dpaste/highlight.py +++ b/dpaste/highlight.py @@ -1,23 +1,102 @@ from pygments import highlight from pygments.lexers import * -from pygments.lexers import get_all_lexers from pygments.formatters import HtmlFormatter +from django.conf import settings -from django.utils.html import escape +""" +# Get a list of all lexer, and then remove all lexer which have '-' or '+' +# or 'with' in the name. Those are too specific and never used. This produces a +# tuple list of [(lexer, Lexer Display Name) ...] lexers. +from pygments.lexers import get_all_lexers +ALL_LEXER = set([(i[1][0], i[0]) for i in get_all_lexers()]) +LEXER_LIST = [l for l in ALL_LEXER if not ( + '-' in l[0] + or '+' in l[0] + or '+' in l[1] + or 'with' in l[1].lower() + or ' ' in l[1] + or l[0] in IGNORE_LEXER +)] +LEXER_LIST = sorted(LEXER_LIST) +""" -import logging -logger = logging.getLogger(__name__) +# The list of lexers. Its not worth to autogenerate this. See above how to +# retrieve this. +LEXER_LIST = getattr(settings, 'DPASTE_LEXER_LIST', ( + ('text', 'Text'), + ('text', '----------'), + ('apacheconf', 'ApacheConf'), + ('applescript', 'AppleScript'), + ('as', 'ActionScript'), + ('bash', 'Bash'), + ('bbcode', 'BBCode'), + ('c', 'C'), + ('clojure', 'Clojure'), + ('cobol', 'COBOL'), + ('css', 'CSS'), + ('cuda', 'CUDA'), + ('dart', 'Dart'), + ('delphi', 'Delphi'), + ('diff', 'Diff'), + ('django', 'Django'), + ('erlang', 'Erlang'), + ('fortran', 'Fortran'), + ('go', 'Go'), + ('groovy', 'Groovy'), + ('haml', 'Haml'), + ('haskell', 'Haskell'), + ('html', 'HTML'), + ('http', 'HTTP'), + ('ini', 'INI'), + ('java', 'Java'), + ('js', 'JavaScript'), + ('json', 'JSON'), + ('lua', 'Lua'), + ('make', 'Makefile'), + ('mako', 'Mako'), + ('mason', 'Mason'), + ('matlab', 'Matlab'), + ('modula2', 'Modula'), + ('monkey', 'Monkey'), + ('mysql', 'MySQL'), + ('numpy', 'NumPy'), + ('ocaml', 'OCaml'), + ('perl', 'Perl'), + ('php', 'PHP'), + ('postscript', 'PostScript'), + ('powershell', 'PowerShell'), + ('prolog', 'Prolog'), + ('properties', 'Properties'), + ('puppet', 'Puppet'), + ('python', 'Python'), + ('rb', 'Ruby'), + ('rst', 'reStructuredText'), + ('rust', 'Rust'), + ('sass', 'Sass'), + ('scala', 'Scala'), + ('scheme', 'Scheme'), + ('scilab', 'Scilab'), + ('scss', 'SCSS'), + ('smalltalk', 'Smalltalk'), + ('smarty', 'Smarty'), + ('sql', 'SQL'), + ('tcl', 'Tcl'), + ('tcsh', 'Tcsh'), + ('tex', 'TeX'), + ('vb.net', 'VB.net'), + ('vim', 'VimL'), + ('xml', 'XML'), + ('xquery', 'XQuery'), + ('xslt', 'XSLT'), + ('yaml', 'YAML'), +)) -# Python 3: python3 -LEXER_LIST = sorted([(i[0], i[0]) for i in get_all_lexers() if not ( - '+' in i[0] or - 'with' in i[0].lower() or - i[0].islower() -)]) -LEXER_LIST_NAME = dict([(i[0], i[1][0]) for i in get_all_lexers()]) +# The default lexer is python +LEXER_DEFAULT = getattr(settings, 'DPASTE_LEXER_DEFAULT', 'python') + +# Lexers which have wordwrap enabled by default +LEXER_WORDWRAP = getattr(settings, 'DPASTE_LEXER_WORDWRAP', ('text', 'rst')) -LEXER_DEFAULT = 'Python' -LEXER_WORDWRAP = ('text', 'rst') class NakedHtmlFormatter(HtmlFormatter): def wrap(self, source, outfile): @@ -28,25 +107,6 @@ class NakedHtmlFormatter(HtmlFormatter): yield i, t def pygmentize(code_string, lexer_name=LEXER_DEFAULT): - lexer_name = LEXER_LIST_NAME.get(lexer_name, None) - try: - if lexer_name: - lexer = get_lexer_by_name(lexer_name) - else: - raise Exception - except: - try: - lexer = guess_lexer(code_string) - except: - lexer = PythonLexer() - - try: - return highlight(code_string, lexer, NakedHtmlFormatter()) - except: - return escape(code_string) - -def guess_code_lexer(code_string, default_lexer='unknown'): - try: - return guess_lexer(code_string).name - except ValueError: - return default_lexer + lexer = lexer_name and get_lexer_by_name(lexer_name) \ + or PythonLexer() + return highlight(code_string, lexer, NakedHtmlFormatter()) diff --git a/dpaste/static/dpaste/__theme.css b/dpaste/static/dpaste/__theme.css deleted file mode 100644 index 7d966ad..0000000 --- a/dpaste/static/dpaste/__theme.css +++ /dev/null @@ -1,404 +0,0 @@ -body{ - margin: 0; - padding: 0; - font-family: Helvetica, Arial, sans-serif; - font-size: 13px; -} - -a:link, -a:visited{ - color: #3D813A; - text-decoration: none; -} - -a:hover{ - color: #52AA4D; - text-decoration: underline; -} - -p.hint{ - color: #333; - margin-top: 30px; -} - -p.hint em{ - color: black; - background-color: #c9f8b4; - display: inline-block; - padding: 2px 3px; - font-style: normal; -} - -hr.clear{ - clear: both; - border: none; - margin: 0; - padding: 0; - height: 0; - overflow: hidden; - font-size: 0; - line-height: 0; - visibility: hidden; -} - -div.success{ - background-color: green; - color: White; - margin: 10px 0; - padding: 10px 20px; -} - -div.success a{ - color: White; - text-decoration: underline; -} - -div.hint{ - padding: 5px 20px; - background-color: #F7F1C9; - margin: 20px 0; -} - - -/* ******************************************* - * Header - ******************************************* */ - -#header{ - background-color: #D6F1B7; - border-bottom: 1px solid #C6EB9A; - padding: 10px 20px; - font-size: 14px; -} - -#header span.new_snippet{ - float: right; -} - -#header h1{ - margin: 0; - color: #555555; - font-size: 14px; -} - -#header h1 span.date{ - color: gray; - color: #666; - padding-left: 15px; -} - -#header a:link, -#header a:visited{ - text-decoration: none; - color: #333; - font-weight: Bold; -} - -#header a:hover{ - text-decoration: underline; -} - -/* ******************************************* - * Content - ******************************************* */ - -#content{ - padding: 0 20px; - margin: 0; - width: 70%; - float: left; -} - - -#content h2{ - font-size: 1.3em; - line-height: 1.6em; -} - -#content h2.divider{ - font-size: 1em; - padding: 5px 20px; - background-color: #f8f8f8; - margin: 40px 0 20px 0; -} - -#content h2 span{ - font-weight: normal; -} - -div.accordion h2{ - cursor: pointer; - color: #3D813A; -} - -div.accordion h2:hover{ - text-decoration: underline; -} - -/* ******************************************* - * Snippet table - ******************************************* */ -div.snippet{ - overflow: auto; -} - -div.snippet-options{ - float: right; - font-size: 0.9em; - margin-top: 5px; -} - -div.snippet table{ - margin: 0; - padding: 0; - border-collapse: collapse; -} - -div.snippet table td{ - margin: 0; - padding: 0 4px; - vertical-align: top; -} - -div.snippet table th{ - border-right: 1px solid #ccc; - vertical-align: top; -} - -div.snippet table th a{ - display: block; - text-decoration: none; - color: #888; - text-align: right; - padding: 0 4px 0 18px; -} - -/* ******************************************* - * Form - ******************************************* */ -form.snippetform ol{ - margin: 0; - padding: 0; - list-style: none; -} - -form.snippetform ol li{ - margin: 0; - padding: 5px 10px; - border-bottom: 1px solid #EEE; - clear: left; -} - -form.snippetform label{ - width: 125px; - display: inline-block; -} - -form.snippetform #id_content{ - width: 80%; - height: 320px; - font-family: monospace; - font-size: 0.9em; -} - -form.snippetform #id_author, -form.snippetform #id_title{ - width: 60%; - opacity: 0.7; -} - -form.snippetform li.submit input{ - margin-left: 125px; -} - -form.snippetform ul.errorlist, -form.snippetform ul.errorlist li{ - margin: 0; - padding: 0; - list-style: none; - color: #c00; - font-weight: bold; - border: none; -} - -form.snippetform ul.errorlist li{ - padding: 10px 0 5px 0; -} -/* ******************************************* - * History + Tree - ******************************************* */ - -#sidebar{ - padding: 0 20px 0 10px; - margin: 20px 0 0 0; - float: right; - width: 20%; - overflow: auto; - border-left: 1px solid #DDD; -} - -#sidebar h2{ - font-size: 1em; - border-bottom: 1px solid #DDD; - color: #888; - margin-top: 0; - text-transform: uppercase; - width: auto !important; -} - -div.tree{ - margin: 0 0 15px 0; - line-height: 1.8em; -} - -div.tree ul, -div.tree ul li{ - margin: 0; - padding: 0; - list-style: none; -} - -div.tree ul li{ - clear: both; -} - -div.tree ul li div{ - border-bottom: 1px solid #EEE; -} - -div.tree span.diff{ - float: right; -} - -div.tree strong{ - color: #111; - font-weight: normal; -} - -div.tree ul li li{ - padding-left: 0; - margin-left: 15px; - color: #ccc; - list-style: circle; -} - -div.tree div.submit{ - margin: 8px 0 0 0; - text-align: right; -} - -div.tree div.submit input{ - font-size: 0.8em; -} - -/* ******************************************* - * Footer - ******************************************* */ - -#footer{ - position: fixed; - right: 1em; - bottom: 1em; -} - -#footer form.setlang{ - display: inline; - padding-right: 15px; -} - -#footer form.setlang input, -#footer form.setlang select{ - font-size: 0.8em; -} - -#footer a:link, -#footer a:visited{ - background-color: #D6F1B7; - color: #555; - text-decoration: none; - padding: 3px 6px; -} - -#footer a:hover, -#footer a:active{ - background-color: #D6F1B7; - color: #000; - text-decoration: none; -} - -/* ******************************************* - * Pygments - ******************************************* */ - -pre.code { - font-family: "Bitstream Vera Sans Mono", Monaco, Consolas, monospace; - font-size: 12px; - line-height: 17px; - margin: 0; - padding: 0; -} - -pre.code div.line:hover{ - background-color: #FFFFE6; -} - -pre.code div.line.marked, -pre.code div.line.marked *{ - background-color: #BAE688 !important; -} - -.code .c { color: #999988; font-style: italic } /* Comment */ -/* .code .err { color: #a61717; background-color: #e3d2d2 } /* Error */ -.code .k { font-weight: bold } /* Keyword */ -.code .o { font-weight: bold } /* Operator */ -.code .cm { color: #999988; font-style: italic } /* Comment.Multiline */ -.code .cp { color: #999999; font-weight: bold } /* Comment..codeproc */ -.code .c1 { color: #999988; font-style: italic } /* Comment.Single */ -.code .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ -.code .ge { font-style: italic } /* Generic.Emph */ -.code .gr { color: #aa0000 } /* Generic.Error */ -.code .gh { color: #999999 } /* Generic.Heading */ -.code .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ -.code .go { color: #888888 } /* Generic.Output */ -.code .gp { color: #555555 } /* Generic.Prompt */ -.code .gs { font-weight: bold } /* Generic.Strong */ -.code .gu { color: #aaaaaa } /* Generic.Subheading */ -.code .gt { color: #aa0000 } /* Generic.Traceback */ -.code .kc { font-weight: bold } /* Keyword.Constant */ -.code .kd { font-weight: bold } /* Keyword.Declaration */ -.code .kp { font-weight: bold } /* Keyword.Pseudo */ -.code .kr { font-weight: bold } /* Keyword.Reserved */ -.code .kt { color: #445588; font-weight: bold } /* Keyword.Type */ -.code .m { color: #009999 } /* Literal.Number */ -.code .s { color: #bb8844 } /* Literal.String */ -.code .na { color: #008080 } /* Name.Attribute */ -.code .nb { color: #999999 } /* Name.Builtin */ -.code .nc { color: #445588; font-weight: bold } /* Name.Class */ -.code .no { color: #ff99ff } /* Name.Constant */ -.code .ni { color: #800080 } /* Name.Entity */ -.code .ne { color: #990000; font-weight: bold } /* Name.Exception */ -.code .nf { color: #990000; font-weight: bold } /* Name.Function */ -.code .nn { color: #555555 } /* Name.Namespace */ -.code .nt { color: #000080 } /* Name.Tag */ -.code .nv { color: purple } /* Name.Variable */ -.code .ow { font-weight: bold } /* Operator.Word */ -.code .mf { color: #009999 } /* Literal.Number.Float */ -.code .mh { color: #009999 } /* Literal.Number.Hex */ -.code .mi { color: #009999 } /* Literal.Number.Integer */ -.code .mo { color: #009999 } /* Literal.Number.Oct */ -.code .sb { color: #bb8844 } /* Literal.String.Backtick */ -.code .sc { color: #bb8844 } /* Literal.String.Char */ -.code .sd { color: #bb8844 } /* Literal.String.Doc */ -.code .s2 { color: #bb8844 } /* Literal.String.Double */ -.code .se { color: #bb8844 } /* Literal.String.Escape */ -.code .sh { color: #bb8844 } /* Literal.String.Heredoc */ -.code .si { color: #bb8844 } /* Literal.String.Interpol */ -.code .sx { color: #bb8844 } /* Literal.String.Other */ -.code .sr { color: #808000 } /* Literal.String.Regex */ -.code .s1 { color: #bb8844 } /* Literal.String.Single */ -.code .ss { color: #bb8844 } /* Literal.String.Symbol */ -.code .bp { color: #999999 } /* Name.Builtin.Pseudo */ -.code .vc { color: #ff99ff } /* Name.Variable.Class */ -.code .vg { color: #ff99ff } /* Name.Variable.Global */ -.code .vi { color: #ff99ff } /* Name.Variable.Instance */ -.code .il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/dpaste/static/dpaste/typeahead.min.js b/dpaste/static/dpaste/typeahead.min.js new file mode 100644 index 0000000..c085f8a --- /dev/null +++ b/dpaste/static/dpaste/typeahead.min.js @@ -0,0 +1,7 @@ +/*! + * typeahead.js 0.9.3 + * https://github.com/twitter/typeahead + * Copyright 2013 Twitter, Inc. and other contributors; Licensed MIT + */ + +!function(a){var b="0.9.3",c={isMsie:function(){var a=/(msie) ([\w.]+)/i.exec(navigator.userAgent);return a?parseInt(a[2],10):!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof a},isNumber:function(a){return"number"==typeof a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof a},bind:a.proxy,bindAll:function(b){var c;for(var d in b)a.isFunction(c=b[d])&&(b[d]=a.proxy(c,b))},indexOf:function(a,b){for(var c=0;c=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},tokenizeQuery:function(b){return a.trim(b).toLowerCase().split(/[\s]+/)},tokenizeText:function(b){return a.trim(b).toLowerCase().split(/[\s\-_]+/)},getProtocol:function(){return location.protocol},noop:function(){}},d=function(){var a=/\s+/;return{on:function(b,c){var d;if(!c)return this;for(this._callbacks=this._callbacks||{},b=b.split(a);d=b.shift();)this._callbacks[d]=this._callbacks[d]||[],this._callbacks[d].push(c);return this},trigger:function(b,c){var d,e;if(!this._callbacks)return this;for(b=b.split(a);d=b.shift();)if(e=this._callbacks[d])for(var f=0;fa;a++)(b=f.key(a)).match(this.keyMatcher)&&c.push(b.replace(this.keyMatcher,""));for(a=c.length;a--;)this.remove(c[a]);return this},isExpired:function(a){var d=e(f.getItem(this._ttlKey(a)));return c.isNumber(d)&&b()>d?!0:!1}}:{get:c.noop,set:c.noop,remove:c.noop,clear:c.noop,isExpired:c.noop},c.mixin(a.prototype,g),a}(),g=function(){function a(a){c.bindAll(this),a=a||{},this.sizeLimit=a.sizeLimit||10,this.cache={},this.cachedKeysByAge=[]}return c.mixin(a.prototype,{get:function(a){return this.cache[a]},set:function(a,b){var c;this.cachedKeysByAge.length===this.sizeLimit&&(c=this.cachedKeysByAge.shift(),delete this.cache[c]),this.cache[a]=b,this.cachedKeysByAge.push(a)}}),a}(),h=function(){function b(a){c.bindAll(this),a=c.isString(a)?{url:a}:a,i=i||new g,h=c.isNumber(a.maxParallelRequests)?a.maxParallelRequests:h||6,this.url=a.url,this.wildcard=a.wildcard||"%QUERY",this.filter=a.filter,this.replace=a.replace,this.ajaxSettings={type:"get",cache:a.cache,timeout:a.timeout,dataType:a.dataType||"json",beforeSend:a.beforeSend},this._get=(/^throttle$/i.test(a.rateLimitFn)?c.throttle:c.debounce)(this._get,a.rateLimitWait||300)}function d(){j++}function e(){j--}function f(){return h>j}var h,i,j=0,k={};return c.mixin(b.prototype,{_get:function(a,b){function c(c){var e=d.filter?d.filter(c):c;b&&b(e),i.set(a,c)}var d=this;f()?this._sendRequest(a).done(c):this.onDeckRequestArgs=[].slice.call(arguments,0)},_sendRequest:function(b){function c(){e(),k[b]=null,f.onDeckRequestArgs&&(f._get.apply(f,f.onDeckRequestArgs),f.onDeckRequestArgs=null)}var f=this,g=k[b];return g||(d(),g=k[b]=a.ajax(b,this.ajaxSettings).always(c)),g},get:function(a,b){var d,e,f=this,g=encodeURIComponent(a||"");return b=b||c.noop,d=this.replace?this.replace(this.url,g):this.url.replace(this.wildcard,g),(e=i.get(d))?c.defer(function(){b(f.filter?f.filter(e):e)}):this._get(d,b),!!e}}),b}(),i=function(){function d(b){c.bindAll(this),c.isString(b.template)&&!b.engine&&a.error("no template engine specified"),b.local||b.prefetch||b.remote||a.error("one of local, prefetch, or remote is required"),this.name=b.name||c.getUniqueId(),this.limit=b.limit||5,this.minLength=b.minLength||1,this.header=b.header,this.footer=b.footer,this.valueKey=b.valueKey||"value",this.template=e(b.template,b.engine,this.valueKey),this.local=b.local,this.prefetch=b.prefetch,this.remote=b.remote,this.itemHash={},this.adjacencyList={},this.storage=b.name?new f(b.name):null}function e(a,b,d){var e,f;return c.isFunction(a)?e=a:c.isString(a)?(f=b.compile(a),e=c.bind(f.render,f)):e=function(a){return"

"+a[d]+"

"},e}var g={thumbprint:"thumbprint",protocol:"protocol",itemHash:"itemHash",adjacencyList:"adjacencyList"};return c.mixin(d.prototype,{_processLocalData:function(a){this._mergeProcessedData(this._processData(a))},_loadPrefetchData:function(d){function e(a){var b=d.filter?d.filter(a):a,e=m._processData(b),f=e.itemHash,h=e.adjacencyList;m.storage&&(m.storage.set(g.itemHash,f,d.ttl),m.storage.set(g.adjacencyList,h,d.ttl),m.storage.set(g.thumbprint,n,d.ttl),m.storage.set(g.protocol,c.getProtocol(),d.ttl)),m._mergeProcessedData(e)}var f,h,i,j,k,l,m=this,n=b+(d.thumbprint||"");return this.storage&&(f=this.storage.get(g.thumbprint),h=this.storage.get(g.protocol),i=this.storage.get(g.itemHash),j=this.storage.get(g.adjacencyList)),k=f!==n||h!==c.getProtocol(),d=c.isString(d)?{url:d}:d,d.ttl=c.isNumber(d.ttl)?d.ttl:864e5,i&&j&&!k?(this._mergeProcessedData({itemHash:i,adjacencyList:j}),l=a.Deferred().resolve()):l=a.getJSON(d.url).done(e),l},_transformDatum:function(a){var b=c.isString(a)?a:a[this.valueKey],d=a.tokens||c.tokenizeText(b),e={value:b,tokens:d};return c.isString(a)?(e.datum={},e.datum[this.valueKey]=a):e.datum=a,e.tokens=c.filter(e.tokens,function(a){return!c.isBlankString(a)}),e.tokens=c.map(e.tokens,function(a){return a.toLowerCase()}),e},_processData:function(a){var b=this,d={},e={};return c.each(a,function(a,f){var g=b._transformDatum(f),h=c.getUniqueId(g.value);d[h]=g,c.each(g.tokens,function(a,b){var d=b.charAt(0),f=e[d]||(e[d]=[h]);!~c.indexOf(f,h)&&f.push(h)})}),{itemHash:d,adjacencyList:e}},_mergeProcessedData:function(a){var b=this;c.mixin(this.itemHash,a.itemHash),c.each(a.adjacencyList,function(a,c){var d=b.adjacencyList[a];b.adjacencyList[a]=d?d.concat(c):c})},_getLocalSuggestions:function(a){var b,d=this,e=[],f=[],g=[];return c.each(a,function(a,b){var d=b.charAt(0);!~c.indexOf(e,d)&&e.push(d)}),c.each(e,function(a,c){var e=d.adjacencyList[c];return e?(f.push(e),(!b||e.length").css({position:"absolute",left:"-9999px",visibility:"hidden",whiteSpace:"nowrap",fontFamily:b.css("font-family"),fontSize:b.css("font-size"),fontStyle:b.css("font-style"),fontVariant:b.css("font-variant"),fontWeight:b.css("font-weight"),wordSpacing:b.css("word-spacing"),letterSpacing:b.css("letter-spacing"),textIndent:b.css("text-indent"),textRendering:b.css("text-rendering"),textTransform:b.css("text-transform")}).insertAfter(b)}function f(a,b){return a=(a||"").replace(/^\s*/g,"").replace(/\s{2,}/g," "),b=(b||"").replace(/^\s*/g,"").replace(/\s{2,}/g," "),a===b}return c.mixin(b.prototype,d,{_handleFocus:function(){this.trigger("focused")},_handleBlur:function(){this.trigger("blured")},_handleSpecialKeyEvent:function(a){var b=this.specialKeyCodeMap[a.which||a.keyCode];b&&this.trigger(b+"Keyed",a)},_compareQueryToInputValue:function(){var a=this.getInputValue(),b=f(this.query,a),c=b?this.query.length!==a.length:!1;c?this.trigger("whitespaceChanged",{value:this.query}):b||this.trigger("queryChanged",{value:this.query=a})},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$hint=this.$input=this.$overflowHelper=null},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(a){this.query=a},getInputValue:function(){return this.$input.val()},setInputValue:function(a,b){this.$input.val(a),!b&&this._compareQueryToInputValue()},getHintValue:function(){return this.$hint.val()},setHintValue:function(a){this.$hint.val(a)},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},isOverflow:function(){return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>this.$input.width()},isCursorAtEnd:function(){var a,b=this.$input.val().length,d=this.$input[0].selectionStart;return c.isNumber(d)?d===b:document.selection?(a=document.selection.createRange(),a.moveStart("character",-b),b===a.text.length):!0}}),b}(),k=function(){function b(b){c.bindAll(this),this.isOpen=!1,this.isEmpty=!0,this.isMouseOverDropdown=!1,this.$menu=a(b.menu).on("mouseenter.tt",this._handleMouseenter).on("mouseleave.tt",this._handleMouseleave).on("click.tt",".tt-suggestion",this._handleSelection).on("mouseover.tt",".tt-suggestion",this._handleMouseover)}function e(a){return a.data("suggestion")}var f={suggestionsList:''},g={suggestionsList:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"}};return c.mixin(b.prototype,d,{_handleMouseenter:function(){this.isMouseOverDropdown=!0},_handleMouseleave:function(){this.isMouseOverDropdown=!1},_handleMouseover:function(b){var c=a(b.currentTarget);this._getSuggestions().removeClass("tt-is-under-cursor"),c.addClass("tt-is-under-cursor")},_handleSelection:function(b){var c=a(b.currentTarget);this.trigger("suggestionSelected",e(c))},_show:function(){this.$menu.css("display","block")},_hide:function(){this.$menu.hide()},_moveCursor:function(a){var b,c,d,f;if(this.isVisible()){if(b=this._getSuggestions(),c=b.filter(".tt-is-under-cursor"),c.removeClass("tt-is-under-cursor"),d=b.index(c)+a,d=(d+1)%(b.length+1)-1,-1===d)return this.trigger("cursorRemoved"),void 0;-1>d&&(d=b.length-1),f=b.eq(d).addClass("tt-is-under-cursor"),this._ensureVisibility(f),this.trigger("cursorMoved",e(f))}},_getSuggestions:function(){return this.$menu.find(".tt-suggestions > .tt-suggestion")},_ensureVisibility:function(a){var b=this.$menu.height()+parseInt(this.$menu.css("paddingTop"),10)+parseInt(this.$menu.css("paddingBottom"),10),c=this.$menu.scrollTop(),d=a.position().top,e=d+a.outerHeight(!0);0>d?this.$menu.scrollTop(c+d):e>b&&this.$menu.scrollTop(c+(e-b))},destroy:function(){this.$menu.off(".tt"),this.$menu=null},isVisible:function(){return this.isOpen&&!this.isEmpty},closeUnlessMouseIsOverDropdown:function(){this.isMouseOverDropdown||this.close()},close:function(){this.isOpen&&(this.isOpen=!1,this.isMouseOverDropdown=!1,this._hide(),this.$menu.find(".tt-suggestions > .tt-suggestion").removeClass("tt-is-under-cursor"),this.trigger("closed"))},open:function(){this.isOpen||(this.isOpen=!0,!this.isEmpty&&this._show(),this.trigger("opened"))},setLanguageDirection:function(a){var b={left:"0",right:"auto"},c={left:"auto",right:" 0"};"ltr"===a?this.$menu.css(b):this.$menu.css(c)},moveCursorUp:function(){this._moveCursor(-1)},moveCursorDown:function(){this._moveCursor(1)},getSuggestionUnderCursor:function(){var a=this._getSuggestions().filter(".tt-is-under-cursor").first();return a.length>0?e(a):null},getFirstSuggestion:function(){var a=this._getSuggestions().first();return a.length>0?e(a):null},renderSuggestions:function(b,d){var e,h,i,j,k,l="tt-dataset-"+b.name,m='
%body
',n=this.$menu.find("."+l);0===n.length&&(h=a(f.suggestionsList).css(g.suggestionsList),n=a("
").addClass(l).append(b.header).append(h).append(b.footer).appendTo(this.$menu)),d.length>0?(this.isEmpty=!1,this.isOpen&&this._show(),i=document.createElement("div"),j=document.createDocumentFragment(),c.each(d,function(c,d){d.dataset=b.name,e=b.template(d.datum),i.innerHTML=m.replace("%body",e),k=a(i.firstChild).css(g.suggestion).data("suggestion",d),k.children().each(function(){a(this).css(g.suggestionChild)}),j.appendChild(k[0])}),n.show().find(".tt-suggestions").html(j)):this.clearSuggestions(b.name),this.trigger("suggestionsRendered")},clearSuggestions:function(a){var b=a?this.$menu.find(".tt-dataset-"+a):this.$menu.find('[class^="tt-dataset-"]'),c=b.find(".tt-suggestions");b.hide(),c.empty(),0===this._getSuggestions().length&&(this.isEmpty=!0,this._hide())}}),b}(),l=function(){function b(a){var b,d,f;c.bindAll(this),this.$node=e(a.input),this.datasets=a.datasets,this.dir=null,this.eventBus=a.eventBus,b=this.$node.find(".tt-dropdown-menu"),d=this.$node.find(".tt-query"),f=this.$node.find(".tt-hint"),this.dropdownView=new k({menu:b}).on("suggestionSelected",this._handleSelection).on("cursorMoved",this._clearHint).on("cursorMoved",this._setInputValueToSuggestionUnderCursor).on("cursorRemoved",this._setInputValueToQuery).on("cursorRemoved",this._updateHint).on("suggestionsRendered",this._updateHint).on("opened",this._updateHint).on("closed",this._clearHint).on("opened closed",this._propagateEvent),this.inputView=new j({input:d,hint:f}).on("focused",this._openDropdown).on("blured",this._closeDropdown).on("blured",this._setInputValueToQuery).on("enterKeyed tabKeyed",this._handleSelection).on("queryChanged",this._clearHint).on("queryChanged",this._clearSuggestions).on("queryChanged",this._getSuggestions).on("whitespaceChanged",this._updateHint).on("queryChanged whitespaceChanged",this._openDropdown).on("queryChanged whitespaceChanged",this._setLanguageDirection).on("escKeyed",this._closeDropdown).on("escKeyed",this._setInputValueToQuery).on("tabKeyed upKeyed downKeyed",this._managePreventDefault).on("upKeyed downKeyed",this._moveDropdownCursor).on("upKeyed downKeyed",this._openDropdown).on("tabKeyed leftKeyed rightKeyed",this._autocomplete)}function e(b){var c=a(g.wrapper),d=a(g.dropdown),e=a(b),f=a(g.hint);c=c.css(h.wrapper),d=d.css(h.dropdown),f.css(h.hint).css({backgroundAttachment:e.css("background-attachment"),backgroundClip:e.css("background-clip"),backgroundColor:e.css("background-color"),backgroundImage:e.css("background-image"),backgroundOrigin:e.css("background-origin"),backgroundPosition:e.css("background-position"),backgroundRepeat:e.css("background-repeat"),backgroundSize:e.css("background-size")}),e.data("ttAttrs",{dir:e.attr("dir"),autocomplete:e.attr("autocomplete"),spellcheck:e.attr("spellcheck"),style:e.attr("style")}),e.addClass("tt-query").attr({autocomplete:"off",spellcheck:!1}).css(h.query);try{!e.attr("dir")&&e.attr("dir","auto")}catch(i){}return e.wrap(c).parent().prepend(f).append(d)}function f(a){var b=a.find(".tt-query");c.each(b.data("ttAttrs"),function(a,d){c.isUndefined(d)?b.removeAttr(a):b.attr(a,d)}),b.detach().removeData("ttAttrs").removeClass("tt-query").insertAfter(a),a.remove()}var g={wrapper:'',hint:'',dropdown:''},h={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none"},query:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"}};return c.isMsie()&&c.mixin(h.query,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),c.isMsie()&&c.isMsie()<=7&&(c.mixin(h.wrapper,{display:"inline",zoom:"1"}),c.mixin(h.query,{marginTop:"-1px"})),c.mixin(b.prototype,d,{_managePreventDefault:function(a){var b,c,d=a.data,e=!1;switch(a.type){case"tabKeyed":b=this.inputView.getHintValue(),c=this.inputView.getInputValue(),e=b&&b!==c;break;case"upKeyed":case"downKeyed":e=!d.shiftKey&&!d.ctrlKey&&!d.metaKey}e&&d.preventDefault()},_setLanguageDirection:function(){var a=this.inputView.getLanguageDirection();a!==this.dir&&(this.dir=a,this.$node.css("direction",a),this.dropdownView.setLanguageDirection(a))},_updateHint:function(){var a,b,d,e,f,g=this.dropdownView.getFirstSuggestion(),h=g?g.value:null,i=this.dropdownView.isVisible(),j=this.inputView.isOverflow();h&&i&&!j&&(a=this.inputView.getInputValue(),b=a.replace(/\s{2,}/g," ").replace(/^\s+/g,""),d=c.escapeRegExChars(b),e=new RegExp("^(?:"+d+")(.*$)","i"),f=e.exec(h),this.inputView.setHintValue(a+(f?f[1]:"")))},_clearHint:function(){this.inputView.setHintValue("")},_clearSuggestions:function(){this.dropdownView.clearSuggestions()},_setInputValueToQuery:function(){this.inputView.setInputValue(this.inputView.getQuery())},_setInputValueToSuggestionUnderCursor:function(a){var b=a.data;this.inputView.setInputValue(b.value,!0)},_openDropdown:function(){this.dropdownView.open()},_closeDropdown:function(a){this.dropdownView["blured"===a.type?"closeUnlessMouseIsOverDropdown":"close"]()},_moveDropdownCursor:function(a){var b=a.data;b.shiftKey||b.ctrlKey||b.metaKey||this.dropdownView["upKeyed"===a.type?"moveCursorUp":"moveCursorDown"]()},_handleSelection:function(a){var b="suggestionSelected"===a.type,d=b?a.data:this.dropdownView.getSuggestionUnderCursor();d&&(this.inputView.setInputValue(d.value),b?this.inputView.focus():a.data.preventDefault(),b&&c.isMsie()?c.defer(this.dropdownView.close):this.dropdownView.close(),this.eventBus.trigger("selected",d.datum,d.dataset))},_getSuggestions:function(){var a=this,b=this.inputView.getQuery();c.isBlankString(b)||c.each(this.datasets,function(c,d){d.getSuggestions(b,function(c){b===a.inputView.getQuery()&&a.dropdownView.renderSuggestions(d,c)})})},_autocomplete:function(a){var b,c,d,e,f;("rightKeyed"!==a.type&&"leftKeyed"!==a.type||(b=this.inputView.isCursorAtEnd(),c="ltr"===this.inputView.getLanguageDirection()?"leftKeyed"===a.type:"rightKeyed"===a.type,b&&!c))&&(d=this.inputView.getQuery(),e=this.inputView.getHintValue(),""!==e&&d!==e&&(f=this.dropdownView.getFirstSuggestion(),this.inputView.setInputValue(f.value),this.eventBus.trigger("autocompleted",f.datum,f.dataset)))},_propagateEvent:function(a){this.eventBus.trigger(a.type)},destroy:function(){this.inputView.destroy(),this.dropdownView.destroy(),f(this.$node),this.$node=null},setQuery:function(a){this.inputView.setQuery(a),this.inputView.setInputValue(a),this._clearHint(),this._clearSuggestions(),this._getSuggestions()}}),b}();!function(){var b,d={},f="ttView";b={initialize:function(b){function g(){var b,d=a(this),g=new e({el:d});b=c.map(h,function(a){return a.initialize()}),d.data(f,new l({input:d,eventBus:g=new e({el:d}),datasets:h})),a.when.apply(a,b).always(function(){c.defer(function(){g.trigger("initialized")})})}var h;return b=c.isArray(b)?b:[b],0===b.length&&a.error("no datasets provided"),h=c.map(b,function(a){var b=d[a.name]?d[a.name]:new i(a);return a.name&&(d[a.name]=b),b}),this.each(g)},destroy:function(){function b(){var b=a(this),c=b.data(f);c&&(c.destroy(),b.removeData(f))}return this.each(b)},setQuery:function(b){function c(){var c=a(this).data(f);c&&c.setQuery(b)}return this.each(c)}},jQuery.fn.typeahead=function(a){return b[a]?b[a].apply(this,[].slice.call(arguments,1)):b.initialize.apply(this,arguments)}}()}(window.jQuery); \ No newline at end of file diff --git a/dpaste/templates/dpaste/base.html b/dpaste/templates/dpaste/base.html index 28d7444..6094cee 100644 --- a/dpaste/templates/dpaste/base.html +++ b/dpaste/templates/dpaste/base.html @@ -28,33 +28,6 @@ {% block script_footer %} - - {% endblock %} diff --git a/dpaste/templates/dpaste/snippet_details.html b/dpaste/templates/dpaste/snippet_details.html index 8f7568c..1140331 100644 --- a/dpaste/templates/dpaste/snippet_details.html +++ b/dpaste/templates/dpaste/snippet_details.html @@ -81,15 +81,15 @@ {{ block.super }}