diff --git a/public/images/jstoolbar/bt_h1.png b/public/images/jstoolbar/bt_h1.png new file mode 100644 index 0000000000..01f3eec0da 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 index 0000000000..36b15048e6 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 index 0000000000..029d648e54 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 index a143f23a7a..0000000000 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 index 0000000000..91c9a8a87c 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 index 0000000000..df3f917d0e Binary files /dev/null and b/public/images/jstoolbar/bt_pre.png differ diff --git a/public/javascripts/jstoolbar.js b/public/javascripts/jstoolbar.js index fd4611e2dd..b94a4ed80b 100644 --- a/public/javascripts/jstoolbar.js +++ b/public/javascripts/jstoolbar.js @@ -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('
\n', '\n') } + } +} + // 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("!", "!") } } } diff --git a/public/stylesheets/jstoolbar.css b/public/stylesheets/jstoolbar.css index 62976e537f..df5d2a6330 100644 --- a/public/stylesheets/jstoolbar.css +++ b/public/stylesheets/jstoolbar.css @@ -67,8 +67,14 @@ .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); @@ -76,6 +82,12 @@ .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); +}