From 9f4af3173c955cd4a5a8059435efa841403dfe36 Mon Sep 17 00:00:00 2001 From: Tom Preston-Werner Date: Tue, 13 Jul 2010 22:08:23 -0700 Subject: [PATCH] Initial work on the editbar. --- lib/gollum/frontend/app.rb | 4 +- lib/gollum/frontend/public/css/editbar.css | 84 ++++++++++++++++++ lib/gollum/frontend/public/images/buttons.png | Bin 0 -> 16166 bytes .../frontend/public/images/twiddle-down.png | Bin 0 -> 181 bytes .../frontend/public/images/twiddle-right.png | Bin 0 -> 184 bytes .../frontend/public/javascript/gollum.js | 82 +++++++++++++++++ .../jquery.text_selection-1.0.0.min.js | 1 + lib/gollum/frontend/templates/edit.mustache | 22 ++++- lib/gollum/frontend/templates/layout.mustache | 5 +- lib/gollum/frontend/templates/page.mustache | 6 -- 10 files changed, 194 insertions(+), 10 deletions(-) create mode 100644 lib/gollum/frontend/public/css/editbar.css create mode 100644 lib/gollum/frontend/public/images/buttons.png create mode 100644 lib/gollum/frontend/public/images/twiddle-down.png create mode 100644 lib/gollum/frontend/public/images/twiddle-right.png create mode 100644 lib/gollum/frontend/public/javascript/gollum.js create mode 100644 lib/gollum/frontend/public/javascript/jquery.text_selection-1.0.0.min.js diff --git a/lib/gollum/frontend/app.rb b/lib/gollum/frontend/app.rb index 4b3b0d70..267580a8 100644 --- a/lib/gollum/frontend/app.rb +++ b/lib/gollum/frontend/app.rb @@ -62,12 +62,12 @@ module Precious end post '/create/:name' do - page = params[:name] + name = params[:name] wiki = Gollum::Wiki.new($path) format = params[:format].intern - wiki.write_page(page, format, params[:content], commit_message) + wiki.write_page(name, format, params[:content], commit_message) redirect "/#{name}" end diff --git a/lib/gollum/frontend/public/css/editbar.css b/lib/gollum/frontend/public/css/editbar.css new file mode 100644 index 00000000..e836ffb5 --- /dev/null +++ b/lib/gollum/frontend/public/css/editbar.css @@ -0,0 +1,84 @@ +#editbar { + border-left: 1px solid #888; + border-top: 1px solid #888; + border-right: 1px solid #888; + width: 100%; + background: white; + background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#EBF1FF)); + background: -moz-linear-gradient(top, #fff, #EBF1FF); + overflow: hidden; +} + + #editbar .group { + float: left; + height: 26px; + margin: 3px; + padding-right: 6px; + } + + #editbar .group-separator { + border-right: 1px solid #ddd; + } + + #editbar .button { + width: 22px; + height: 22px; + background: url(/images/buttons.png); + text-indent: -100px; + cursor: pointer; + overflow: hidden; + padding: 2px; + display: block; + float: left; + } + + #editbar .bold { + background-position: 2px -142px; + } + + #editbar .italic { + background-position: 2px -862px; + } + + #editbar .link { + background-position: 2px -1654px; + } + + #editbar .image { + background-position: 2px -1438px; + } + + #editbar .tab { + float: left; + display: block; + font-family: sans-serif; + font-size: 13px; + } + + #editbar .tab a { + cursor: pointer; + display: inline-block; + float: left; + height: 26px; + padding-left: 18px; + padding-right: 12px; + line-height: 26px; + text-decoration: none; + background-image: url(/images/twiddle-right.png); + background-position: 0 50%; + background-repeat: no-repeat; + color: blue; + } + + #editbar .tab a.open { + background-image: url(/images/twiddle-down.png); + color: #333; + } + + #editbar .tab a.open:hover { + text-decoration: none; + } + + #editbar .tab a:hover { + text-decoration: underline; + } \ No newline at end of file diff --git a/lib/gollum/frontend/public/images/buttons.png b/lib/gollum/frontend/public/images/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..6054499247764a82e61750e44c711db4702b7da7 GIT binary patch literal 16166 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 literal 0 HcmV?d00001 diff --git a/lib/gollum/frontend/public/images/twiddle-down.png b/lib/gollum/frontend/public/images/twiddle-down.png new file mode 100644 index 0000000000000000000000000000000000000000..bf2d4fb4b4900506f9b8c79b223ee2f75c15cc57 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGaEOCt}3C>R|DNig)WpGT%PfAtr z%uP&B4N6T+sVqF1Y6DcnAK(+>T3K0n_wL&XR;Ol+4VoOpP6e3Ts87Bew7D@Ay5s4yg1XlXc!a(7S2GGZvp WlhfIEUiT+Z8-u5-pUXO@geCwwyg1PS literal 0 HcmV?d00001 diff --git a/lib/gollum/frontend/public/images/twiddle-right.png b/lib/gollum/frontend/public/images/twiddle-right.png new file mode 100644 index 0000000000000000000000000000000000000000..c27c96364dd3bceeb5f93e3c5a1cc2f81af27720 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foo&cW^*SmM`R#sO2|NnpP+_?^XlNJEQnM;EFg8%<#xPFS) z5y&<6ba4!+xRsRP#LRPq%U}Vwf$;)PgF~(fOa+2F7<^b151jCEVBID8Vq3zF=0=wD cj4Toi%&QomIVzvj0%~XQboFyt=akR{0EllmY5)KL literal 0 HcmV?d00001 diff --git a/lib/gollum/frontend/public/javascript/gollum.js b/lib/gollum/frontend/public/javascript/gollum.js new file mode 100644 index 00000000..585270c6 --- /dev/null +++ b/lib/gollum/frontend/public/javascript/gollum.js @@ -0,0 +1,82 @@ +Gollum = { + encloseStrategy: function(prefix, content, suffix) { + return { + type: 'enclose', + content: content, + prefix: prefix, + suffix: suffix + } + }, + + enclose: function(el, format, kind) { + var cfg = Gollum.Formats[format][kind] + var sel = el.getSelectionRange() + if (sel.start == sel.end) { + el.insertText(cfg.prefix + cfg.content + cfg.suffix, sel.start, sel.start, false) + el.setSelectionRange(sel.start + cfg.prefix.length, sel.start + cfg.prefix.length + cfg.content.length) + } else { + el.insertText(cfg.prefix + el.getSelectedText() + cfg.suffix, sel.start, sel.end, false) + } + } +} + +Gollum.Formats = { + asciidoc: { + bold: Gollum.encloseStrategy('*', 'bold text', '*'), + italic: Gollum.encloseStrategy('_', 'italic text', '_') + }, + creole: { + bold: Gollum.encloseStrategy('**', 'bold text', '**'), + italic: Gollum.encloseStrategy('//', 'italic text', '//') + }, + markdown: { + bold: Gollum.encloseStrategy('**', 'bold text', '**'), + italic: Gollum.encloseStrategy('*', 'italic text', '*') + }, + org: { + bold: Gollum.encloseStrategy('*', 'bold text', '*'), + italic: Gollum.encloseStrategy('/', 'italic text', '/') + }, + pod: { + bold: Gollum.encloseStrategy('B<', 'bold text', '>'), + italic: Gollum.encloseStrategy('I<', 'italic text', '>') + }, + rest: { + bold: Gollum.encloseStrategy('**', 'bold text', '**'), + italic: Gollum.encloseStrategy('*', 'italic text', '*') + }, + rdoc: { + bold: Gollum.encloseStrategy('*', 'bold text', '*'), + italic: Gollum.encloseStrategy('_', 'italic text', '_') + }, + roff: { + bold: Gollum.encloseStrategy('\\fB', 'bold text', '\\fP'), + italic: Gollum.encloseStrategy('\\fI', 'italic text', '\\fP') + }, + textile: { + bold: Gollum.encloseStrategy('*', 'bold text', '*'), + italic: Gollum.encloseStrategy('_', 'italic text', '_') + } +} + +$(function(){ + /* Version selector */ + + $('#versions_select').change(function() { + location.href = this.value + }) + + /* EditBar */ + + $('#editbar .bold').click(function() { + var el = $('#guides .write textarea') + var format = $('#guides .write select[name=format] option:selected').attr('value') + Gollum.enclose(el, format, 'bold') + }) + + $('#editbar .italic').click(function() { + var el = $('#guides .write textarea') + var format = $('#guides .write select[name=format] option:selected').attr('value') + Gollum.enclose(el, format, 'italic') + }) +}) diff --git a/lib/gollum/frontend/public/javascript/jquery.text_selection-1.0.0.min.js b/lib/gollum/frontend/public/javascript/jquery.text_selection-1.0.0.min.js new file mode 100644 index 00000000..1d161033 --- /dev/null +++ b/lib/gollum/frontend/public/javascript/jquery.text_selection-1.0.0.min.js @@ -0,0 +1 @@ +(function(B){var A=(function(){var C=(typeof document.selection!=="undefined"&&typeof document.selection.createRange!=="undefined");return{getSelectionRange:function(F){var J,D,E,I,H,G;F.focus();if(typeof F.selectionStart!=="undefined"){J=F.selectionStart;D=F.selectionEnd;}else{if(C){E=document.selection.createRange();I=E.text.length;if(E.parentElement()!==F){throw ("Unable to get selection range.");}if(F.type==="textarea"){H=E.duplicate();H.moveToElementText(F);H.setEndPoint("EndToEnd",E);J=H.text.length-I;}else{G=F.createTextRange();G.setEndPoint("EndToStart",E);J=G.text.length;}D=J+I;}else{throw ("Unable to get selection range.");}}return{start:J,end:D};},getSelectionStart:function(D){return this.getSelectionRange(D).start;},getSelectionEnd:function(D){return this.getSelectionRange(D).end;},setSelectionRange:function(F,H,D){var G,E;F.focus();if(typeof D==="undefined"){D=H;}if(typeof F.selectionStart!=="undefined"){F.setSelectionRange(H,D);}else{if(C){G=F.value;E=F.createTextRange();D-=H+G.slice(H+1,D).split("\n").length-1;H-=G.slice(0,H).split("\n").length-1;E.move("character",H);E.moveEnd("character",D);E.select();}else{throw ("Unable to set selection range.");}}},getSelectedText:function(E){var D=this.getSelectionRange(E);return E.value.substring(D.start,D.end);},insertText:function(E,I,D,F,K){F=F||D;var L=I.length,J=D+L,G=E.value.substring(0,D),H=E.value.substr(F);E.value=G+I+H;if(K===true){this.setSelectionRange(E,D,J);}else{this.setSelectionRange(E,J);}},replaceSelectedText:function(E,G,F){var D=this.getSelectionRange(E);this.insertText(E,G,D.start,D.end,F);},wrapSelectedText:function(E,G,D,F){var H=G+this.getSelectedText(E)+D;this.replaceSelectedText(E,H,F);}};})();window.Selection=A;B.fn.extend({getSelectionRange:function(){return A.getSelectionRange(this[0]);},getSelectionStart:function(){return A.getSelectionStart(this[0]);},getSelectionEnd:function(){return A.getSelectionEnd(this[0]);},getSelectedText:function(){return A.getSelectedText(this[0]);},setSelectionRange:function(D,C){return this.each(function(){A.setSelectionRange(this,D,C);});},insertText:function(E,F,C,D){return this.each(function(){A.insertText(this,E,F,C,D);});},replaceSelectedText:function(D,C){return this.each(function(){A.replaceSelectedText(this,D,C);});},wrapSelectedText:function(E,C,D){return this.each(function(){A.wrapSelectedText(this,E,C,D);});}});})(jQuery); \ No newline at end of file diff --git a/lib/gollum/frontend/templates/edit.mustache b/lib/gollum/frontend/templates/edit.mustache index fb3a904b..a53591bf 100644 --- a/lib/gollum/frontend/templates/edit.mustache +++ b/lib/gollum/frontend/templates/edit.mustache @@ -12,7 +12,27 @@