Wiki toolbar improvements (mainly for Firefox).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1063 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
8b710cf9de
commit
4e1e5985a1
Binary file not shown.
After Width: | Height: | Size: 995 B |
Binary file not shown.
After Width: | Height: | Size: 994 B |
Binary file not shown.
After Width: | Height: | Size: 993 B |
Binary file not shown.
Before Width: | Height: | Size: 415 B |
Binary file not shown.
After Width: | Height: | Size: 566 B |
Binary file not shown.
After Width: | Height: | Size: 224 B |
|
@ -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* ");
|
||||
});
|
||||
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 };
|
||||
}
|
||||
}
|
||||
|
||||
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 = {
|
||||
type: 'button',
|
||||
title: 'Link',
|
||||
title: 'Wiki Page Link',
|
||||
fn: {
|
||||
wiki: function() { this.encloseSelection("[[", "]]") }
|
||||
}
|
||||
}
|
||||
// image
|
||||
jsToolBar.prototype.elements.img = {
|
||||
type: 'button',
|
||||
title: 'Inline image',
|
||||
fn: {
|
||||
wiki: function() { this.encloseSelection("!", "!") }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue