From e55a6af25858f33bbaad84f7a834667f3279aef9 Mon Sep 17 00:00:00 2001 From: Gregory Eremin Date: Thu, 11 Jul 2013 01:20:10 +0700 Subject: [PATCH] Syntax selector --- app/assets/javascripts/dropdown.coffee | 33 +++++++++ app/assets/javascripts/pastemaster.coffee | 8 +-- app/assets/stylesheets/dropdown.styl | 86 +++++++++++++++++++++++ app/assets/stylesheets/pastemaster.styl | 19 ++--- app/paste.rb | 10 ++- pastemaster.rb | 10 ++- views/default.slim | 2 + views/form.slim | 15 ++-- 8 files changed, 158 insertions(+), 25 deletions(-) create mode 100644 app/assets/javascripts/dropdown.coffee create mode 100644 app/assets/stylesheets/dropdown.styl diff --git a/app/assets/javascripts/dropdown.coffee b/app/assets/javascripts/dropdown.coffee new file mode 100644 index 0000000..ed7b8bb --- /dev/null +++ b/app/assets/javascripts/dropdown.coffee @@ -0,0 +1,33 @@ +class Selector + constructor: (selector) -> + @input = $("#{selector}-input") + @dropdown = $(selector) + @placeholder = @dropdown.children 'span' + @prefix = @placeholder.text() + @options = @dropdown.find 'ul.dropdown > li' + this.initEvents() + + initEvents: -> + self = this + + @dropdown.on 'click', (e) -> + $(this).toggleClass('active') + false + + @options.on 'click', (e) -> + $el = $(this) + $el.siblings().removeClass 'selected' + $el.addClass 'selected' + self.placeholder.text "#{self.prefix}: #{$el.text()}" + self.setValue $el.data 'value' + + @options.filter('.selected').click() + @dropdown.removeClass 'active' + + setValue: (value) -> + @input.val value + +$ -> + new Selector '#type' + $(document).on 'click', (e) -> + $('.wrapper-dropdown').removeClass 'active' diff --git a/app/assets/javascripts/pastemaster.coffee b/app/assets/javascripts/pastemaster.coffee index f3ebfd2..536df71 100644 --- a/app/assets/javascripts/pastemaster.coffee +++ b/app/assets/javascripts/pastemaster.coffee @@ -1,8 +1,8 @@ $ -> - $form = $('#pasteform') - $contents = $('#contents') - $_button = $('#submitbtn') - $button = $('#submitlnk') + $form = $('form') + $contents = $form.find('textarea') + $_button = $form.find('input[type="submit"]') + $button = $form.find('a[role="submit"]') # Hide generic button, show styled button $_button.hide() diff --git a/app/assets/stylesheets/dropdown.styl b/app/assets/stylesheets/dropdown.styl new file mode 100644 index 0000000..ab12a72 --- /dev/null +++ b/app/assets/stylesheets/dropdown.styl @@ -0,0 +1,86 @@ +.wrapper-dropdown + position absolute + right 9em + + width 15em + padding 0.5em 1em + margin 0.4em auto + + background #f5f5f5 + background-image -webkit-linear-gradient(top, #ffffff, #f5f5f5) + background-image linear-gradient(to bottom, #ffffff, #f5f5f5) + + color #666 + outline none + cursor pointer + + border #ddd 1px solid + border-radius 5px + + &:after + content "" + width 0 + height 0 + position absolute + right 16px + top 50% + margin-top -6px + border-width 6px 0 6px 6px + border-style solid + border-color transparent #666 + + .dropdown + position absolute + bottom 2em + left 0 + right 0 + background #fafafa + list-style none + font-weight normal + border #ddd 1px solid + border-radius 5px + opacity 0 + pointer-events none + height 20em + overflow-x ellipsis + overflow-y auto + padding 0 + + li + display block + text-decoration none + color #9e9e9e + padding 10px 20px + white-space nowrap + overflow hidden + text-overflow ellipsis + + &:hover + background #ccc + color #fff + + &.selected + background #eee + + &.active + background #fafafa + + .dropdown + opacity 1 + pointer-events auto + + &:after + border-color #aaa transparent + border-width 0 6px 6px 6px + margin-top -3px + +/* No CSS3 support */ + +.no-opacity, .no-pointerevents + .wrapper-dropdown .dropdown + display none + opacity 1 + pointer-events auto + + .wrapper-dropdown.active .dropdown + display block diff --git a/app/assets/stylesheets/pastemaster.styl b/app/assets/stylesheets/pastemaster.styl index a98fd80..47c377b 100644 --- a/app/assets/stylesheets/pastemaster.styl +++ b/app/assets/stylesheets/pastemaster.styl @@ -51,40 +51,33 @@ textarea { height: 100%; line-height: 120%; resize: none; - border-style: solid; - border-color: #ddd; + border: #ddd 1px solid; border-radius: 5px; padding: .5em; } -#submitbtn, #submitlnk { +form input[type="submit"], form a[role="submit"] { float: right; } -#submitlnk { +form a[role="submit"] { background-color: #fefefe; background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); background-image: linear-gradient(to bottom, #ffffff, #f5f5f5); box-shadow: 0 1px 2px 2px #ffffff; color: #666; text-shadow: 0 0 2px #ffffff; - border-style: solid; - border-color: #ddd; + border: #ddd 1px solid; border-radius: 4px; - border-width: 1px; border-bottom-width: 4px; font-size: 1em; width: 5em; text-align: center; padding: .4em 0; - margin: .5em 0; + margin: .4em 0; text-decoration: none; display: none; } -#submitlnk:active { +form a[role="submit"]:active { box-shadow: 0 0 2px 2px #eee inset; border-bottom-width: 1px; } - -p { - width: 100%; -} diff --git a/app/paste.rb b/app/paste.rb index 2f3475a..06f0108 100644 --- a/app/paste.rb +++ b/app/paste.rb @@ -10,7 +10,7 @@ class Paste def initialize(contents, type = nil) @contents = contents - @type = type + @type = type if available_types.include?(type) end def save @@ -37,14 +37,18 @@ class Paste end def highlighted - Pygments.highlight(@contents, lexer: 'ruby', options: { linenos: 'table' }) + Pygments.highlight(contents, lexer: type, options: { linenos: 'table' }) end def paragraph - "
#{@contents}
" + "
#{contents}
" end def html type ? highlighted : paragraph end + + def available_types + @available_types ||= Pygments::Lexer.all.map(&:aliases).flatten + end end diff --git a/pastemaster.rb b/pastemaster.rb index 7f35b98..f6d8379 100644 --- a/pastemaster.rb +++ b/pastemaster.rb @@ -30,12 +30,20 @@ class Pastemaster < Sinatra::Application use CoffeeAssets use StylusAssets + def fetch_lexers + @lexers_list ||= Pygments::Lexer.all.map do |lexer| + { alias: lexer.aliases.first, name: lexer.name } + end.sort_by{ |a| a[:name] } + end + get '/' do + @lexers = fetch_lexers + slim :form, layout: :default end post '/' do - paste = Paste.new(params[:contents]) + paste = Paste.new(params[:contents], params[:type]) id = paste.save redirect "/#{id}/#{paste.key}" diff --git a/views/default.slim b/views/default.slim index f98db94..10b87ff 100644 --- a/views/default.slim +++ b/views/default.slim @@ -4,6 +4,7 @@ html title Pastemaster link rel="stylesheet" href="/normalize.css?v2.1.2" link rel="stylesheet" href="/assets/pastemaster.css?r1" + link rel="stylesheet" href="/assets/dropdown.css?r1" link rel="stylesheet" href="/pygments_solarized_modified.css?r1" body h1 @@ -12,3 +13,4 @@ html .container== yield script type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js" script type="text/javascript" src="/assets/pastemaster.js?r1" + script type="text/javascript" src="/assets/dropdown.js?r1" diff --git a/views/form.slim b/views/form.slim index 7362bed..b74cbdb 100644 --- a/views/form.slim +++ b/views/form.slim @@ -1,4 +1,11 @@ -form#pasteform action="/" method="post" accept-charset="UTF-8" - textarea#contents name="contents" - input#submitbtn type="submit" value="Save" - a#submitlnk href="#" role="submit" Save +form action="/" method="post" accept-charset="UTF-8" + textarea name="contents" + input id="type-input" type="hidden" name="type" value="" + div id="type" class="wrapper-dropdown" tabindex="1" + span Syntax + ul.dropdown + li.selected data-value="" Plain Text + - for lexer in @lexers + li data-value=lexer[:alias] =lexer[:name] + input type="submit" value="Save" + a href="#" role="submit" Save