]> source.dussan.org Git - redmine.git/commitdiff
Wiki toolbar improvements (mainly for Firefox).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 13 Jan 2008 18:39:37 +0000 (18:39 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 13 Jan 2008 18:39:37 +0000 (18:39 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1063 e93f8b46-1217-0410-a6f0-8f06a7374b81

public/images/jstoolbar/bt_h1.png [new file with mode: 0644]
public/images/jstoolbar/bt_h2.png [new file with mode: 0644]
public/images/jstoolbar/bt_h3.png [new file with mode: 0644]
public/images/jstoolbar/bt_heading.png [deleted file]
public/images/jstoolbar/bt_img.png [new file with mode: 0644]
public/images/jstoolbar/bt_pre.png [new file with mode: 0644]
public/javascripts/jstoolbar.js
public/stylesheets/jstoolbar.css

diff --git a/public/images/jstoolbar/bt_h1.png b/public/images/jstoolbar/bt_h1.png
new file mode 100644 (file)
index 0000000..01f3eec
Binary files /dev/null and b/public/images/jstoolbar/bt_h1.png differ
diff --git a/public/images/jstoolbar/bt_h2.png b/public/images/jstoolbar/bt_h2.png
new file mode 100644 (file)
index 0000000..36b1504
Binary files /dev/null and b/public/images/jstoolbar/bt_h2.png differ
diff --git a/public/images/jstoolbar/bt_h3.png b/public/images/jstoolbar/bt_h3.png
new file mode 100644 (file)
index 0000000..029d648
Binary files /dev/null and b/public/images/jstoolbar/bt_h3.png differ
diff --git a/public/images/jstoolbar/bt_heading.png b/public/images/jstoolbar/bt_heading.png
deleted file mode 100644 (file)
index a143f23..0000000
Binary files a/public/images/jstoolbar/bt_heading.png and /dev/null differ
diff --git a/public/images/jstoolbar/bt_img.png b/public/images/jstoolbar/bt_img.png
new file mode 100644 (file)
index 0000000..91c9a8a
Binary files /dev/null and b/public/images/jstoolbar/bt_img.png differ
diff --git a/public/images/jstoolbar/bt_pre.png b/public/images/jstoolbar/bt_pre.png
new file mode 100644 (file)
index 0000000..df3f917
Binary files /dev/null and b/public/images/jstoolbar/bt_pre.png differ
index fd4611e2dd04888a90dbcc08318f6136d0c53dbd..b94a4ed80b7e0a16bbf73469a0be143de6e217fb 100644 (file)
@@ -228,6 +228,58 @@ jsToolBar.prototype = {
                this.encloseSelection(stag,etag);
        },
        
+       encloseLineSelection: function(prefix, suffix, fn) {
+               this.textarea.focus();
+               
+               prefix = prefix || '';
+               suffix = suffix || '';
+               
+               var start, end, sel, scrollPos, subst, res;
+               
+               if (typeof(document["selection"]) != "undefined") {
+                       sel = document.selection.createRange().text;
+               } else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
+                       start = this.textarea.selectionStart;
+                       end = this.textarea.selectionEnd;
+                       scrollPos = this.textarea.scrollTop;
+                       // go to the start of the line
+                       start = this.textarea.value.substring(0, start).replace(/[^\r\n]*$/g,'').length;
+                       // go to the end of the line
+            end = this.textarea.value.length - this.textarea.value.substring(end, this.textarea.value.length).replace(/^[^\r\n]*/, '').length;
+                       sel = this.textarea.value.substring(start, end);
+               }
+               
+               if (sel.match(/ $/)) { // exclude ending space char, if any
+                       sel = sel.substring(0, sel.length - 1);
+                       suffix = suffix + " ";
+               }
+               
+               if (typeof(fn) == 'function') {
+                       res = (sel) ? fn.call(this,sel) : fn('');
+               } else {
+                       res = (sel) ? sel : '';
+               }
+               
+               subst = prefix + res + suffix;
+               
+               if (typeof(document["selection"]) != "undefined") {
+                       document.selection.createRange().text = subst;
+                       var range = this.textarea.createTextRange();
+                       range.collapse(false);
+                       range.move('character', -suffix.length);
+                       range.select();
+               } else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
+                       this.textarea.value = this.textarea.value.substring(0, start) + subst +
+                       this.textarea.value.substring(end);
+                       if (sel) {
+                               this.textarea.setSelectionRange(start + subst.length, start + subst.length);
+                       } else {
+                               this.textarea.setSelectionRange(start + prefix.length, start + prefix.length);
+                       }
+                       this.textarea.scrollTop = scrollPos;
+               }
+       },
+       
        encloseSelection: function(prefix, suffix, fn) {
                this.textarea.focus();
                
@@ -370,28 +422,43 @@ jsToolBar.prototype.elements.code = {
 // spacer
 jsToolBar.prototype.elements.space1 = {type: 'space'}
 
-// heading
-jsToolBar.prototype.elements.heading = {
+// headings
+jsToolBar.prototype.elements.h1 = {
        type: 'button',
-       title: 'Heading',
+       title: 'Heading 1',
        fn: {
-               wiki: function() {
-                       this.encloseSelection('','',function(str) {
-                               str = str.replace(/\r/g,'');
-                               return 'h2. '+str.replace(/\n/g,"\n* ");
-                       });
+               wiki: function() { 
+                 this.encloseLineSelection('h1. ', '',function(str) {
+                   str = str.replace(/^h\d+\.\s+/, '')
+                   return str;
+                 });
+               }
+       }
+}
+jsToolBar.prototype.elements.h2 = {
+       type: 'button',
+       title: 'Heading 2',
+       fn: {
+               wiki: function() { 
+                 this.encloseLineSelection('h2. ', '',function(str) {
+                   str = str.replace(/^h\d+\.\s+/, '')
+                   return str;
+                 });
+               }
+       }
+}
+jsToolBar.prototype.elements.h3 = {
+       type: 'button',
+       title: 'Heading 3',
+       fn: {
+               wiki: function() { 
+                 this.encloseLineSelection('h3. ', '',function(str) {
+                   str = str.replace(/^h\d+\.\s+/, '')
+                   return str;
+                 });
                }
        }
 }
-
-// br
-//jsToolBar.prototype.elements.br = {
-//     type: 'button',
-//     title: 'Line break',
-//     fn: {
-//             wiki: function() { this.encloseSelection("%%%\n",'') }
-//     }
-//}
 
 // spacer
 jsToolBar.prototype.elements.space2 = {type: 'space'}
@@ -402,9 +469,9 @@ jsToolBar.prototype.elements.ul = {
        title: 'Unordered list',
        fn: {
                wiki: function() {
-                       this.encloseSelection('','',function(str) {
+                       this.encloseLineSelection('','',function(str) {
                                str = str.replace(/\r/g,'');
-                               return '* '+str.replace(/\n/g,"\n* ");
+                               return str.replace(/(\n|^)[#-]?\s*/g,"$1* ");
                        });
                }
        }
@@ -416,53 +483,39 @@ jsToolBar.prototype.elements.ol = {
        title: 'Ordered list',
        fn: {
                wiki: function() {
-                       this.encloseSelection('','',function(str) {
+                       this.encloseLineSelection('','',function(str) {
                                str = str.replace(/\r/g,'');
-                               return '# '+str.replace(/\n/g,"\n# ");
+                               return str.replace(/(\n|^)[*-]?\s*/g,"$1# ");
                        });
                }
        }
 }
 
+// pre
+jsToolBar.prototype.elements.pre = {
+       type: 'button',
+       title: 'Preformatted text',
+       fn: {
+               wiki: function() { this.encloseLineSelection('<pre>\n', '\n</pre>') }
+       }
+}
+
 // spacer
 jsToolBar.prototype.elements.space3 = {type: 'space'}
 
-// link
-/*
+// wiki page
 jsToolBar.prototype.elements.link = {
        type: 'button',
-       title: 'Link',
-       fn: {},
-       href_prompt: 'Please give page URL:',
-       hreflang_prompt: 'Language of this page:',
-       default_hreflang: '',
-       prompt: function(href,hreflang) {
-               href = href || '';
-               hreflang = hreflang || this.elements.link.default_hreflang;
-               
-               href = window.prompt(this.elements.link.href_prompt,href);
-               if (!href) { return false; }
-               
-               hreflang = ""
-               
-               return { href: this.stripBaseURL(href), hreflang: hreflang };
+       title: 'Wiki Page Link',
+       fn: {
+               wiki: function() { this.encloseSelection("[[", "]]") }
        }
 }
-
-jsToolBar.prototype.elements.link.fn.wiki = function() {
-       var link = this.elements.link.prompt.call(this);
-       if (link) {
-               var stag = '"';
-               var etag = '":'+link.href;
-               this.encloseSelection(stag,etag);
-       }
-};
-*/
-// link or wiki page
-jsToolBar.prototype.elements.link = {
+// image
+jsToolBar.prototype.elements.img = {
        type: 'button',
-       title: 'Link',
+       title: 'Inline image',
        fn: {
-               wiki: function() { this.encloseSelection("[[", "]]") }
+               wiki: function() { this.encloseSelection("!", "!") }
        }
 }
index 62976e537fff22928b7966080e4ea8f92aa38892..df5d2a63308bfb80ace307869f4b3dac57d73326 100644 (file)
 .jstb_br {
        background-image: url(../images/jstoolbar/bt_br.png);
 }
-.jstb_heading {
-       background-image: url(../images/jstoolbar/bt_heading.png);
+.jstb_h1 {
+       background-image: url(../images/jstoolbar/bt_h1.png);
+}
+.jstb_h2 {
+       background-image: url(../images/jstoolbar/bt_h2.png);
+}
+.jstb_h3 {
+       background-image: url(../images/jstoolbar/bt_h3.png);
 }
 .jstb_ul {
        background-image: url(../images/jstoolbar/bt_ul.png);
 .jstb_ol {
        background-image: url(../images/jstoolbar/bt_ol.png);
 }
+.jstb_pre {
+       background-image: url(../images/jstoolbar/bt_pre.png);
+}
 .jstb_link {
        background-image: url(../images/jstoolbar/bt_link.png);
 }
+.jstb_img {
+       background-image: url(../images/jstoolbar/bt_img.png);
+}