Project

General

Profile

Patch #20241 » jstoolbar-cleanup-replace_tabs_with_two_spaces-trunk_r14396.diff.patch

Mischa The Evil, 2015-07-05 11:38

View differences:

jstoolbar.js (working copy)
23 23
/* Modified by JP LANG for textile formatting */
24 24

  
25 25
function jsToolBar(textarea) {
26
	if (!document.createElement) { return; }
27
	
28
	if (!textarea) { return; }
29
	
30
	if ((typeof(document["selection"]) == "undefined")
31
	&& (typeof(textarea["setSelectionRange"]) == "undefined")) {
32
		return;
33
	}
34
	
35
	this.textarea = textarea;
36
	
37
	this.editor = document.createElement('div');
38
	this.editor.className = 'jstEditor';
39
	
40
	this.textarea.parentNode.insertBefore(this.editor,this.textarea);
41
	this.editor.appendChild(this.textarea);
42
	
43
	this.toolbar = document.createElement("div");
44
	this.toolbar.className = 'jstElements';
45
	this.editor.parentNode.insertBefore(this.toolbar,this.editor);
46
	
47
	// Dragable resizing
48
	if (this.editor.addEventListener && navigator.appVersion.match(/\bMSIE\b/))
49
	{
50
		this.handle = document.createElement('div');
51
		this.handle.className = 'jstHandle';
52
		var dragStart = this.resizeDragStart;
53
		var This = this;
54
		this.handle.addEventListener('mousedown',function(event) { dragStart.call(This,event); },false);
55
		// fix memory leak in Firefox (bug #241518)
56
		window.addEventListener('unload',function() { 
57
				var del = This.handle.parentNode.removeChild(This.handle);
58
				delete(This.handle);
59
		},false);
60
		
61
		this.editor.parentNode.insertBefore(this.handle,this.editor.nextSibling);
62
	}
63
	
64
	this.context = null;
65
	this.toolNodes = {}; // lorsque la toolbar est dessinée , cet objet est garni 
66
					// de raccourcis vers les éléments DOM correspondants aux outils.
26
  if (!document.createElement) { return; }
27

  
28
  if (!textarea) { return; }
29

  
30
  if ((typeof(document["selection"]) == "undefined")
31
  && (typeof(textarea["setSelectionRange"]) == "undefined")) {
32
    return;
33
    }
34

  
35
  this.textarea = textarea;
36

  
37
  this.editor = document.createElement('div');
38
  this.editor.className = 'jstEditor';
39

  
40
  this.textarea.parentNode.insertBefore(this.editor,this.textarea);
41
  this.editor.appendChild(this.textarea);
42

  
43
  this.toolbar = document.createElement("div");
44
  this.toolbar.className = 'jstElements';
45
  this.editor.parentNode.insertBefore(this.toolbar,this.editor);
46

  
47
  // Dragable resizing
48
  if (this.editor.addEventListener && navigator.appVersion.match(/\bMSIE\b/))
49
  {
50
    this.handle = document.createElement('div');
51
    this.handle.className = 'jstHandle';
52
    var dragStart = this.resizeDragStart;
53
    var This = this;
54
    this.handle.addEventListener('mousedown',function(event) { dragStart.call(This,event); },false);
55
    // fix memory leak in Firefox (bug #241518)
56
    window.addEventListener('unload',function() { 
57
      var del = This.handle.parentNode.removeChild(This.handle);
58
      delete(This.handle);
59
    },false);
60
    
61
    this.editor.parentNode.insertBefore(this.handle,this.editor.nextSibling);
62
  }
63
  
64
  this.context = null;
65
  this.toolNodes = {}; // lorsque la toolbar est dessinée , cet objet est garni 
66
                       // de raccourcis vers les éléments DOM correspondants aux outils.
67 67
}
68 68

  
69 69
function jsButton(title, fn, scope, className) {
70
    if(typeof jsToolBar.strings == 'undefined') {
71
      this.title = title || null;
72
    } else {
70
  if(typeof jsToolBar.strings == 'undefined') {
71
    this.title = title || null;
72
  } else {
73 73
      this.title = jsToolBar.strings[title] || title || null;
74
    }
75
	this.fn = fn || function(){};
76
	this.scope = scope || null;
77
	this.className = className || null;
74
  }
75
  this.fn = fn || function(){};
76
  this.scope = scope || null;
77
  this.className = className || null;
78 78
}
79 79
jsButton.prototype.draw = function() {
80
	if (!this.scope) return null;
81
	
82
	var button = document.createElement('button');
83
	button.setAttribute('type','button');
84
	button.tabIndex = 200;
85
	if (this.className) button.className = this.className;
86
	button.title = this.title;
87
	var span = document.createElement('span');
88
	span.appendChild(document.createTextNode(this.title));
89
	button.appendChild(span);
90
	
91
	if (this.icon != undefined) {
92
		button.style.backgroundImage = 'url('+this.icon+')';
93
	}
94
	if (typeof(this.fn) == 'function') {
95
		var This = this;
96
		button.onclick = function() { try { This.fn.apply(This.scope, arguments) } catch (e) {} return false; };
97
	}
98
	return button;
80
  if (!this.scope) return null;
81

  
82
  var button = document.createElement('button');
83
  button.setAttribute('type','button');
84
  button.tabIndex = 200;
85
  if (this.className) button.className = this.className;
86
  button.title = this.title;
87
  var span = document.createElement('span');
88
  span.appendChild(document.createTextNode(this.title));
89
  button.appendChild(span);
90

  
91
  if (this.icon != undefined) {
92
    button.style.backgroundImage = 'url('+this.icon+')';
93
  }
94
  if (typeof(this.fn) == 'function') {
95
    var This = this;
96
    button.onclick = function() { try { This.fn.apply(This.scope, arguments) } catch (e) {} return false; };
97
  }
98
  return button;
99 99
}
100 100

  
101 101
function jsSpace(id) {
102
	this.id = id || null;
103
	this.width = null;
102
  this.id = id || null;
103
  this.width = null;
104 104
}
105 105
jsSpace.prototype.draw = function() {
106
	var span = document.createElement('span');
107
	if (this.id) span.id = this.id;
108
	span.appendChild(document.createTextNode(String.fromCharCode(160)));
109
	span.className = 'jstSpacer';
110
	if (this.width) span.style.marginRight = this.width+'px';
111
	
112
	return span;
106
  var span = document.createElement('span');
107
  if (this.id) span.id = this.id;
108
  span.appendChild(document.createTextNode(String.fromCharCode(160)));
109
  span.className = 'jstSpacer';
110
  if (this.width) span.style.marginRight = this.width+'px';
111

  
112
  return span;
113 113
} 
114 114

  
115 115
function jsCombo(title, options, scope, fn, className) {
116
	this.title = title || null;
117
	this.options = options || null;
118
	this.scope = scope || null;
119
	this.fn = fn || function(){};
120
	this.className = className || null;
116
  this.title = title || null;
117
  this.options = options || null;
118
  this.scope = scope || null;
119
  this.fn = fn || function(){};
120
  this.className = className || null;
121 121
}
122 122
jsCombo.prototype.draw = function() {
123
	if (!this.scope || !this.options) return null;
123
  if (!this.scope || !this.options) return null;
124 124

  
125
	var select = document.createElement('select');
126
	if (this.className) select.className = className;
127
	select.title = this.title;
128
	
129
	for (var o in this.options) {
130
		//var opt = this.options[o];
131
		var option = document.createElement('option');
132
		option.value = o;
133
		option.appendChild(document.createTextNode(this.options[o]));
134
		select.appendChild(option);
135
	}
125
  var select = document.createElement('select');
126
  if (this.className) select.className = className;
127
  select.title = this.title;
136 128

  
137
	var This = this;
138
	select.onchange = function() {
139
		try { 
140
			This.fn.call(This.scope, this.value);
141
		} catch (e) { alert(e); }
129
  for (var o in this.options) {
130
    //var opt = this.options[o];
131
    var option = document.createElement('option');
132
    option.value = o;
133
    option.appendChild(document.createTextNode(this.options[o]));
134
    select.appendChild(option);
135
  }
142 136

  
143
		return false;
144
	}
137
  var This = this;
138
  select.onchange = function() {
139
    try { 
140
      This.fn.call(This.scope, this.value);
141
    } catch (e) { alert(e); }
145 142

  
146
	return select;
143
    return false;
144
  }
145

  
146
  return select;
147 147
}
148 148

  
149 149

  
150 150
jsToolBar.prototype = {
151
	base_url: '',
152
	mode: 'wiki',
153
	elements: {},
154
	help_link: '',
155
	
156
	getMode: function() {
157
		return this.mode;
158
	},
159
	
160
	setMode: function(mode) {
161
		this.mode = mode || 'wiki';
162
	},
163
	
164
	switchMode: function(mode) {
165
		mode = mode || 'wiki';
166
		this.draw(mode);
167
	},
168
	
169
	setHelpLink: function(link) {
170
		this.help_link = link;
171
	},
172
	
173
	button: function(toolName) {
174
		var tool = this.elements[toolName];
175
		if (typeof tool.fn[this.mode] != 'function') return null;
176
		var b = new jsButton(tool.title, tool.fn[this.mode], this, 'jstb_'+toolName);
177
		if (tool.icon != undefined) b.icon = tool.icon;
178
		return b;
179
	},
180
	space: function(toolName) {
181
		var tool = new jsSpace(toolName)
182
		if (this.elements[toolName].width !== undefined)
183
			tool.width = this.elements[toolName].width;
184
		return tool;
185
	},
186
	combo: function(toolName) {
187
		var tool = this.elements[toolName];
188
		var length = tool[this.mode].list.length;
151
  base_url: '',
152
  mode: 'wiki',
153
  elements: {},
154
  help_link: '',
155
  
156
  getMode: function() {
157
    return this.mode;
158
  },
189 159

  
190
		if (typeof tool[this.mode].fn != 'function' || length == 0) {
191
			return null;
192
		} else {
193
			var options = {};
194
			for (var i=0; i < length; i++) {
195
				var opt = tool[this.mode].list[i];
196
				options[opt] = tool.options[opt];
197
			}
198
			return new jsCombo(tool.title, options, this, tool[this.mode].fn);
199
		}
200
	},
201
	draw: function(mode) {
202
		this.setMode(mode);
203
		
204
		// Empty toolbar
205
		while (this.toolbar.hasChildNodes()) {
206
			this.toolbar.removeChild(this.toolbar.firstChild)
207
		}
208
		this.toolNodes = {}; // vide les raccourcis DOM/**/
160
  setMode: function(mode) {
161
    this.mode = mode || 'wiki';
162
  },
209 163

  
210
		// Draw toolbar elements
211
		var b, tool, newTool;
212
		
213
		for (var i in this.elements) {
214
			b = this.elements[i];
164
  switchMode: function(mode) {
165
    mode = mode || 'wiki';
166
    this.draw(mode);
167
  },
215 168

  
216
			var disabled =
217
			b.type == undefined || b.type == ''
218
			|| (b.disabled != undefined && b.disabled)
219
			|| (b.context != undefined && b.context != null && b.context != this.context);
220
			
221
			if (!disabled && typeof this[b.type] == 'function') {
222
				tool = this[b.type](i);
223
				if (tool) newTool = tool.draw();
224
				if (newTool) {
225
					this.toolNodes[i] = newTool; //mémorise l'accès DOM pour usage éventuel ultérieur
226
					this.toolbar.appendChild(newTool);
227
				}
228
			}
229
		}
230
	},
231
	
232
	singleTag: function(stag,etag) {
233
		stag = stag || null;
234
		etag = etag || stag;
235
		
236
		if (!stag || !etag) { return; }
237
		
238
		this.encloseSelection(stag,etag);
239
	},
240
	
241
	encloseLineSelection: function(prefix, suffix, fn) {
242
		this.textarea.focus();
243
		
244
		prefix = prefix || '';
245
		suffix = suffix || '';
246
		
247
		var start, end, sel, scrollPos, subst, res;
248
		
249
		if (typeof(document["selection"]) != "undefined") {
250
			sel = document.selection.createRange().text;
251
		} else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
252
			start = this.textarea.selectionStart;
253
			end = this.textarea.selectionEnd;
254
			scrollPos = this.textarea.scrollTop;
255
			// go to the start of the line
256
			start = this.textarea.value.substring(0, start).replace(/[^\r\n]*$/g,'').length;
257
			// go to the end of the line
258
            end = this.textarea.value.length - this.textarea.value.substring(end, this.textarea.value.length).replace(/^[^\r\n]*/, '').length;
259
			sel = this.textarea.value.substring(start, end);
260
		}
261
		
262
		if (sel.match(/ $/)) { // exclude ending space char, if any
263
			sel = sel.substring(0, sel.length - 1);
264
			suffix = suffix + " ";
265
		}
266
		
267
		if (typeof(fn) == 'function') {
268
			res = (sel) ? fn.call(this,sel) : fn('');
269
		} else {
270
			res = (sel) ? sel : '';
271
		}
272
		
273
		subst = prefix + res + suffix;
274
		
275
		if (typeof(document["selection"]) != "undefined") {
276
			document.selection.createRange().text = subst;
277
			var range = this.textarea.createTextRange();
278
			range.collapse(false);
279
			range.move('character', -suffix.length);
280
			range.select();
281
		} else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
282
			this.textarea.value = this.textarea.value.substring(0, start) + subst +
283
			this.textarea.value.substring(end);
284
			if (sel) {
285
				this.textarea.setSelectionRange(start + subst.length, start + subst.length);
286
			} else {
287
				this.textarea.setSelectionRange(start + prefix.length, start + prefix.length);
288
			}
289
			this.textarea.scrollTop = scrollPos;
290
		}
291
	},
292
	
293
	encloseSelection: function(prefix, suffix, fn) {
294
		this.textarea.focus();
295
		
296
		prefix = prefix || '';
297
		suffix = suffix || '';
298
		
299
		var start, end, sel, scrollPos, subst, res;
300
		
301
		if (typeof(document["selection"]) != "undefined") {
302
			sel = document.selection.createRange().text;
303
		} else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
304
			start = this.textarea.selectionStart;
305
			end = this.textarea.selectionEnd;
306
			scrollPos = this.textarea.scrollTop;
307
			sel = this.textarea.value.substring(start, end);
308
		}
309
		
310
		if (sel.match(/ $/)) { // exclude ending space char, if any
311
			sel = sel.substring(0, sel.length - 1);
312
			suffix = suffix + " ";
313
		}
314
		
315
		if (typeof(fn) == 'function') {
316
			res = (sel) ? fn.call(this,sel) : fn('');
317
		} else {
318
			res = (sel) ? sel : '';
319
		}
320
		
321
		subst = prefix + res + suffix;
322
		
323
		if (typeof(document["selection"]) != "undefined") {
324
			document.selection.createRange().text = subst;
325
			var range = this.textarea.createTextRange();
326
			range.collapse(false);
327
			range.move('character', -suffix.length);
328
			range.select();
329
//			this.textarea.caretPos -= suffix.length;
330
		} else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
331
			this.textarea.value = this.textarea.value.substring(0, start) + subst +
332
			this.textarea.value.substring(end);
333
			if (sel) {
334
				this.textarea.setSelectionRange(start + subst.length, start + subst.length);
335
			} else {
336
				this.textarea.setSelectionRange(start + prefix.length, start + prefix.length);
337
			}
338
			this.textarea.scrollTop = scrollPos;
339
		}
340
	},
341
	
342
	stripBaseURL: function(url) {
343
		if (this.base_url != '') {
344
			var pos = url.indexOf(this.base_url);
345
			if (pos == 0) {
346
				url = url.substr(this.base_url.length);
347
			}
348
		}
349
		
350
		return url;
351
	}
169
  setHelpLink: function(link) {
170
    this.help_link = link;
171
  },
172

  
173
  button: function(toolName) {
174
    var tool = this.elements[toolName];
175
    if (typeof tool.fn[this.mode] != 'function') return null;
176
    var b = new jsButton(tool.title, tool.fn[this.mode], this, 'jstb_'+toolName);
177
    if (tool.icon != undefined) b.icon = tool.icon;
178
    return b;
179
  },
180
  space: function(toolName) {
181
    var tool = new jsSpace(toolName)
182
    if (this.elements[toolName].width !== undefined)
183
      tool.width = this.elements[toolName].width;
184
    return tool;
185
  },
186
  combo: function(toolName) {
187
    var tool = this.elements[toolName];
188
    var length = tool[this.mode].list.length;
189

  
190
    if (typeof tool[this.mode].fn != 'function' || length == 0) {
191
      return null;
192
    } else {
193
      var options = {};
194
      for (var i=0; i < length; i++) {
195
        var opt = tool[this.mode].list[i];
196
        options[opt] = tool.options[opt];
197
      }
198
      return new jsCombo(tool.title, options, this, tool[this.mode].fn);
199
    }
200
  },
201
  draw: function(mode) {
202
    this.setMode(mode);
203

  
204
    // Empty toolbar
205
    while (this.toolbar.hasChildNodes()) {
206
      this.toolbar.removeChild(this.toolbar.firstChild)
207
    }
208
    this.toolNodes = {}; // vide les raccourcis DOM/**/
209

  
210
    // Draw toolbar elements
211
    var b, tool, newTool;
212

  
213
    for (var i in this.elements) {
214
      b = this.elements[i];
215

  
216
      var disabled =
217
      b.type == undefined || b.type == ''
218
      || (b.disabled != undefined && b.disabled)
219
      || (b.context != undefined && b.context != null && b.context != this.context);
220

  
221
      if (!disabled && typeof this[b.type] == 'function') {
222
        tool = this[b.type](i);
223
        if (tool) newTool = tool.draw();
224
        if (newTool) {
225
          this.toolNodes[i] = newTool; //mémorise l'accès DOM pour usage éventuel ultérieur
226
          this.toolbar.appendChild(newTool);
227
        }
228
      }
229
    }
230
  },
231

  
232
  singleTag: function(stag,etag) {
233
    stag = stag || null;
234
    etag = etag || stag;
235

  
236
    if (!stag || !etag) { return; }
237

  
238
    this.encloseSelection(stag,etag);
239
  },
240

  
241
  encloseLineSelection: function(prefix, suffix, fn) {
242
    this.textarea.focus();
243

  
244
    prefix = prefix || '';
245
    suffix = suffix || '';
246

  
247
    var start, end, sel, scrollPos, subst, res;
248

  
249
    if (typeof(document["selection"]) != "undefined") {
250
      sel = document.selection.createRange().text;
251
    } else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
252
      start = this.textarea.selectionStart;
253
      end = this.textarea.selectionEnd;
254
      scrollPos = this.textarea.scrollTop;
255
      // go to the start of the line
256
      start = this.textarea.value.substring(0, start).replace(/[^\r\n]*$/g,'').length;
257
      // go to the end of the line
258
      end = this.textarea.value.length - this.textarea.value.substring(end, this.textarea.value.length).replace(/^[^\r\n]*/, '').length;
259
      sel = this.textarea.value.substring(start, end);
260
    }
261

  
262
    if (sel.match(/ $/)) { // exclude ending space char, if any
263
      sel = sel.substring(0, sel.length - 1);
264
      suffix = suffix + " ";
265
    }
266

  
267
    if (typeof(fn) == 'function') {
268
      res = (sel) ? fn.call(this,sel) : fn('');
269
    } else {
270
      res = (sel) ? sel : '';
271
    }
272

  
273
    subst = prefix + res + suffix;
274

  
275
    if (typeof(document["selection"]) != "undefined") {
276
      document.selection.createRange().text = subst;
277
      var range = this.textarea.createTextRange();
278
      range.collapse(false);
279
      range.move('character', -suffix.length);
280
      range.select();
281
    } else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
282
      this.textarea.value = this.textarea.value.substring(0, start) + subst +
283
      this.textarea.value.substring(end);
284
      if (sel) {
285
        this.textarea.setSelectionRange(start + subst.length, start + subst.length);
286
      } else {
287
        this.textarea.setSelectionRange(start + prefix.length, start + prefix.length);
288
      }
289
      this.textarea.scrollTop = scrollPos;
290
    }
291
  },
292

  
293
  encloseSelection: function(prefix, suffix, fn) {
294
    this.textarea.focus();
295

  
296
    prefix = prefix || '';
297
    suffix = suffix || '';
298

  
299
    var start, end, sel, scrollPos, subst, res;
300

  
301
    if (typeof(document["selection"]) != "undefined") {
302
      sel = document.selection.createRange().text;
303
    } else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
304
      start = this.textarea.selectionStart;
305
      end = this.textarea.selectionEnd;
306
      scrollPos = this.textarea.scrollTop;
307
      sel = this.textarea.value.substring(start, end);
308
    }
309

  
310
    if (sel.match(/ $/)) { // exclude ending space char, if any
311
      sel = sel.substring(0, sel.length - 1);
312
      suffix = suffix + " ";
313
    }
314

  
315
    if (typeof(fn) == 'function') {
316
      res = (sel) ? fn.call(this,sel) : fn('');
317
    } else {
318
      res = (sel) ? sel : '';
319
    }
320

  
321
    subst = prefix + res + suffix;
322

  
323
    if (typeof(document["selection"]) != "undefined") {
324
      document.selection.createRange().text = subst;
325
      var range = this.textarea.createTextRange();
326
      range.collapse(false);
327
      range.move('character', -suffix.length);
328
      range.select();
329
//      this.textarea.caretPos -= suffix.length;
330
    } else if (typeof(this.textarea["setSelectionRange"]) != "undefined") {
331
      this.textarea.value = this.textarea.value.substring(0, start) + subst +
332
      this.textarea.value.substring(end);
333
      if (sel) {
334
        this.textarea.setSelectionRange(start + subst.length, start + subst.length);
335
      } else {
336
        this.textarea.setSelectionRange(start + prefix.length, start + prefix.length);
337
      }
338
      this.textarea.scrollTop = scrollPos;
339
    }
340
  },
341

  
342
  stripBaseURL: function(url) {
343
    if (this.base_url != '') {
344
      var pos = url.indexOf(this.base_url);
345
      if (pos == 0) {
346
        url = url.substr(this.base_url.length);
347
      }
348
    }
349

  
350
    return url;
351
  }
352 352
};
353 353

  
354 354
/** Resizer
355 355
-------------------------------------------------------- */
356 356
jsToolBar.prototype.resizeSetStartH = function() {
357
	this.dragStartH = this.textarea.offsetHeight + 0;
357
  this.dragStartH = this.textarea.offsetHeight + 0;
358 358
};
359 359
jsToolBar.prototype.resizeDragStart = function(event) {
360
	var This = this;
361
	this.dragStartY = event.clientY;
362
	this.resizeSetStartH();
363
	document.addEventListener('mousemove', this.dragMoveHdlr=function(event){This.resizeDragMove(event);}, false);
364
	document.addEventListener('mouseup', this.dragStopHdlr=function(event){This.resizeDragStop(event);}, false);
360
  var This = this;
361
  this.dragStartY = event.clientY;
362
  this.resizeSetStartH();
363
  document.addEventListener('mousemove', this.dragMoveHdlr=function(event){This.resizeDragMove(event);}, false);
364
  document.addEventListener('mouseup', this.dragStopHdlr=function(event){This.resizeDragStop(event);}, false);
365 365
};
366 366

  
367 367
jsToolBar.prototype.resizeDragMove = function(event) {
368
	this.textarea.style.height = (this.dragStartH+event.clientY-this.dragStartY)+'px';
368
  this.textarea.style.height = (this.dragStartH+event.clientY-this.dragStartY)+'px';
369 369
};
370 370

  
371 371
jsToolBar.prototype.resizeDragStop = function(event) {
372
	document.removeEventListener('mousemove', this.dragMoveHdlr, false);
373
	document.removeEventListener('mouseup', this.dragStopHdlr, false);
372
  document.removeEventListener('mousemove', this.dragMoveHdlr, false);
373
  document.removeEventListener('mouseup', this.dragStopHdlr, false);
374 374
};
markdown.js (working copy)
24 24

  
25 25
// strong
26 26
jsToolBar.prototype.elements.strong = {
27
	type: 'button',
28
	title: 'Strong',
29
	fn: {
30
		wiki: function() { this.singleTag('**') }
31
	}
27
  type: 'button',
28
  title: 'Strong',
29
  fn: {
30
    wiki: function() { this.singleTag('**') }
31
  }
32 32
}
33 33

  
34 34
// em
35 35
jsToolBar.prototype.elements.em = {
36
	type: 'button',
37
	title: 'Italic',
38
	fn: {
39
		wiki: function() { this.singleTag("*") }
40
	}
36
  type: 'button',
37
  title: 'Italic',
38
  fn: {
39
    wiki: function() { this.singleTag("*") }
40
  }
41 41
}
42 42

  
43 43
// del
44 44
jsToolBar.prototype.elements.del = {
45
	type: 'button',
46
	title: 'Deleted',
47
	fn: {
48
		wiki: function() { this.singleTag('~~') }
49
	}
45
  type: 'button',
46
  title: 'Deleted',
47
  fn: {
48
    wiki: function() { this.singleTag('~~') }
49
  }
50 50
}
51 51

  
52 52
// code
53 53
jsToolBar.prototype.elements.code = {
54
	type: 'button',
55
	title: 'Code',
56
	fn: {
57
		wiki: function() { this.singleTag('`') }
58
	}
54
  type: 'button',
55
  title: 'Code',
56
  fn: {
57
    wiki: function() { this.singleTag('`') }
58
  }
59 59
}
60 60

  
61 61
// spacer
......
63 63

  
64 64
// headings
65 65
jsToolBar.prototype.elements.h1 = {
66
	type: 'button',
67
	title: 'Heading 1',
68
	fn: {
69
		wiki: function() {
70
		  this.encloseLineSelection('# ', '',function(str) {
71
		    str = str.replace(/^#+\s+/, '')
72
		    return str;
73
		  });
74
		}
75
	}
66
  type: 'button',
67
  title: 'Heading 1',
68
  fn: {
69
    wiki: function() {
70
      this.encloseLineSelection('# ', '',function(str) {
71
        str = str.replace(/^#+\s+/, '')
72
        return str;
73
      });
74
    }
75
  }
76 76
}
77 77
jsToolBar.prototype.elements.h2 = {
78
	type: 'button',
79
	title: 'Heading 2',
80
	fn: {
81
		wiki: function() {
82
		  this.encloseLineSelection('## ', '',function(str) {
83
		    str = str.replace(/^#+\s+/, '')
84
		    return str;
85
		  });
86
		}
87
	}
78
  type: 'button',
79
  title: 'Heading 2',
80
  fn: {
81
    wiki: function() {
82
      this.encloseLineSelection('## ', '',function(str) {
83
        str = str.replace(/^#+\s+/, '')
84
        return str;
85
      });
86
    }
87
  }
88 88
}
89 89
jsToolBar.prototype.elements.h3 = {
90
	type: 'button',
91
	title: 'Heading 3',
92
	fn: {
93
		wiki: function() {
94
		  this.encloseLineSelection('### ', '',function(str) {
95
		    str = str.replace(/^#+\s+/, '')
96
		    return str;
97
		  });
98
		}
99
	}
90
  type: 'button',
91
  title: 'Heading 3',
92
  fn: {
93
    wiki: function() {
94
      this.encloseLineSelection('### ', '',function(str) {
95
        str = str.replace(/^#+\s+/, '')
96
        return str;
97
      });
98
    }
99
  }
100 100
}
101 101

  
102 102
// spacer
......
104 104

  
105 105
// ul
106 106
jsToolBar.prototype.elements.ul = {
107
	type: 'button',
108
	title: 'Unordered list',
109
	fn: {
110
		wiki: function() {
111
			this.encloseLineSelection('','',function(str) {
112
				str = str.replace(/\r/g,'');
113
				return str.replace(/(\n|^)[#-]?\s*/g,"$1* ");
114
			});
115
		}
116
	}
107
  type: 'button',
108
  title: 'Unordered list',
109
  fn: {
110
    wiki: function() {
111
      this.encloseLineSelection('','',function(str) {
112
        str = str.replace(/\r/g,'');
113
        return str.replace(/(\n|^)[#-]?\s*/g,"$1* ");
114
      });
115
    }
116
  }
117 117
}
118 118

  
119 119
// ol
120 120
jsToolBar.prototype.elements.ol = {
121
	type: 'button',
122
	title: 'Ordered list',
123
	fn: {
124
		wiki: function() {
125
			this.encloseLineSelection('','',function(str) {
126
				str = str.replace(/\r/g,'');
127
				return str.replace(/(\n|^)[*-]?\s*/g,"$11. ");
128
			});
129
		}
130
	}
121
  type: 'button',
122
  title: 'Ordered list',
123
  fn: {
124
    wiki: function() {
125
      this.encloseLineSelection('','',function(str) {
126
        str = str.replace(/\r/g,'');
127
        return str.replace(/(\n|^)[*-]?\s*/g,"$11. ");
128
      });
129
    }
130
  }
131 131
}
132 132

  
133 133
// spacer
......
135 135

  
136 136
// bq
137 137
jsToolBar.prototype.elements.bq = {
138
	type: 'button',
139
	title: 'Quote',
140
	fn: {
141
		wiki: function() {
142
			this.encloseLineSelection('','',function(str) {
143
				str = str.replace(/\r/g,'');
144
				return str.replace(/(\n|^) *([^\n]*)/g,"$1> $2");
145
			});
146
		}
147
	}
138
  type: 'button',
139
  title: 'Quote',
140
  fn: {
141
    wiki: function() {
142
      this.encloseLineSelection('','',function(str) {
143
        str = str.replace(/\r/g,'');
144
        return str.replace(/(\n|^) *([^\n]*)/g,"$1> $2");
145
      });
146
    }
147
  }
148 148
}
149 149

  
150 150
// unbq
151 151
jsToolBar.prototype.elements.unbq = {
152
	type: 'button',
153
	title: 'Unquote',
154
	fn: {
155
		wiki: function() {
156
			this.encloseLineSelection('','',function(str) {
157
				str = str.replace(/\r/g,'');
158
				return str.replace(/(\n|^) *[>]? *([^\n]*)/g,"$1$2");
159
			});
160
		}
161
	}
152
  type: 'button',
153
  title: 'Unquote',
154
  fn: {
155
    wiki: function() {
156
      this.encloseLineSelection('','',function(str) {
157
        str = str.replace(/\r/g,'');
158
        return str.replace(/(\n|^) *[>]? *([^\n]*)/g,"$1$2");
159
      });
160
    }
161
  }
162 162
}
163 163

  
164 164
// pre
165 165
jsToolBar.prototype.elements.pre = {
166
	type: 'button',
167
	title: 'Preformatted text',
168
	fn: {
169
		wiki: function() { this.encloseLineSelection('~~~\n', '\n~~~') }
170
	}
166
  type: 'button',
167
  title: 'Preformatted text',
168
  fn: {
169
    wiki: function() { this.encloseLineSelection('~~~\n', '\n~~~') }
170
  }
171 171
}
172 172

  
173 173
// spacer
......
175 175

  
176 176
// wiki page
177 177
jsToolBar.prototype.elements.link = {
178
	type: 'button',
179
	title: 'Wiki link',
180
	fn: {
181
		wiki: function() { this.encloseSelection("[[", "]]") }
182
	}
178
  type: 'button',
179
  title: 'Wiki link',
180
  fn: {
181
    wiki: function() { this.encloseSelection("[[", "]]") }
182
  }
183 183
}
184 184
// image
185 185
jsToolBar.prototype.elements.img = {
186
	type: 'button',
187
	title: 'Image',
188
	fn: {
189
		wiki: function() { this.encloseSelection("![](", ")") }
190
	}
186
  type: 'button',
187
  title: 'Image',
188
  fn: {
189
    wiki: function() { this.encloseSelection("![](", ")") }
190
  }
191 191
}
192 192

  
193 193
// spacer
194 194
jsToolBar.prototype.elements.space5 = {type: 'space'}
195 195
// help
196 196
jsToolBar.prototype.elements.help = {
197
	type: 'button',
198
	title: 'Help',
199
	fn: {
200
		wiki: function() { window.open(this.help_link, '', 'resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes') }
201
	}
197
  type: 'button',
198
  title: 'Help',
199
  fn: {
200
    wiki: function() { window.open(this.help_link, '', 'resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes') }
201
  }
202 202
}
textile.js (working copy)
24 24

  
25 25
// strong
26 26
jsToolBar.prototype.elements.strong = {
27
	type: 'button',
28
	title: 'Strong',
29
	fn: {
30
		wiki: function() { this.singleTag('*') }
31
	}
27
  type: 'button',
28
  title: 'Strong',
29
  fn: {
30
    wiki: function() { this.singleTag('*') }
31
  }
32 32
}
33 33

  
34 34
// em
35 35
jsToolBar.prototype.elements.em = {
36
	type: 'button',
37
	title: 'Italic',
38
	fn: {
39
		wiki: function() { this.singleTag("_") }
40
	}
36
  type: 'button',
37
  title: 'Italic',
38
  fn: {
39
    wiki: function() { this.singleTag("_") }
40
  }
41 41
}
42 42

  
43 43
// ins
44 44
jsToolBar.prototype.elements.ins = {
45
	type: 'button',
46
	title: 'Underline',
47
	fn: {
48
		wiki: function() { this.singleTag('+') }
49
	}
45
  type: 'button',
46
  title: 'Underline',
47
  fn: {
48
    wiki: function() { this.singleTag('+') }
49
  }
50 50
}
51 51

  
52 52
// del
53 53
jsToolBar.prototype.elements.del = {
54
	type: 'button',
55
	title: 'Deleted',
56
	fn: {
57
		wiki: function() { this.singleTag('-') }
58
	}
54
  type: 'button',
55
  title: 'Deleted',
56
  fn: {
57
    wiki: function() { this.singleTag('-') }
58
  }
59 59
}
60 60

  
61 61
// code
62 62
jsToolBar.prototype.elements.code = {
63
	type: 'button',
64
	title: 'Code',
65
	fn: {
66
		wiki: function() { this.singleTag('@') }
67
	}
63
  type: 'button',
64
  title: 'Code',
65
  fn: {
66
    wiki: function() { this.singleTag('@') }
67
  }
68 68
}
69 69

  
70 70
// spacer
......
72 72

  
73 73
// headings
74 74
jsToolBar.prototype.elements.h1 = {
75
	type: 'button',
76
	title: 'Heading 1',
77
	fn: {
78
		wiki: function() { 
79
		  this.encloseLineSelection('h1. ', '',function(str) {
80
		    str = str.replace(/^h\d+\.\s+/, '')
81
		    return str;
82
		  });
83
		}
84
	}
75
  type: 'button',
76
  title: 'Heading 1',
77
  fn: {
78
    wiki: function() { 
79
      this.encloseLineSelection('h1. ', '',function(str) {
80
        str = str.replace(/^h\d+\.\s+/, '')
81
        return str;
82
      });
83
    }
84
  }
85 85
}
86 86
jsToolBar.prototype.elements.h2 = {
87
	type: 'button',
88
	title: 'Heading 2',
89
	fn: {
90
		wiki: function() { 
91
		  this.encloseLineSelection('h2. ', '',function(str) {
92
		    str = str.replace(/^h\d+\.\s+/, '')
93
		    return str;
94
		  });
95
		}
96
	}
87
  type: 'button',
88
  title: 'Heading 2',
89
  fn: {
90
    wiki: function() { 
91
      this.encloseLineSelection('h2. ', '',function(str) {
92
        str = str.replace(/^h\d+\.\s+/, '')
93
        return str;
94
      });
95
    }
96
  }
97 97
}
98 98
jsToolBar.prototype.elements.h3 = {
99
	type: 'button',
100
	title: 'Heading 3',
101
	fn: {
102
		wiki: function() { 
103
		  this.encloseLineSelection('h3. ', '',function(str) {
104
		    str = str.replace(/^h\d+\.\s+/, '')
105
		    return str;
106
		  });
107
		}
108
	}
99
  type: 'button',
100
  title: 'Heading 3',
101
  fn: {
102
    wiki: function() { 
103
      this.encloseLineSelection('h3. ', '',function(str) {
104
        str = str.replace(/^h\d+\.\s+/, '')
105
        return str;
106
      });
107
    }
108
  }
109 109
}
110 110

  
111 111
// spacer
......
113 113

  
114 114
// ul
115 115
jsToolBar.prototype.elements.ul = {
116
	type: 'button',
117
	title: 'Unordered list',
118
	fn: {
119
		wiki: function() {
120
			this.encloseLineSelection('','',function(str) {
121
				str = str.replace(/\r/g,'');
122
				return str.replace(/(\n|^)[#-]?\s*/g,"$1* ");
123
			});
124
		}
125
	}
116
  type: 'button',
117
  title: 'Unordered list',
118
  fn: {
119
    wiki: function() {
120
      this.encloseLineSelection('','',function(str) {
121
        str = str.replace(/\r/g,'');
122
        return str.replace(/(\n|^)[#-]?\s*/g,"$1* ");
123
      });
124
    }
125
  }
126 126
}
127 127

  
128 128
// ol
129 129
jsToolBar.prototype.elements.ol = {
130
	type: 'button',
131
	title: 'Ordered list',
132
	fn: {
133
		wiki: function() {
134
			this.encloseLineSelection('','',function(str) {
135
				str = str.replace(/\r/g,'');
136
				return str.replace(/(\n|^)[*-]?\s*/g,"$1# ");
137
			});
138
		}
139
	}
130
  type: 'button',
131
  title: 'Ordered list',
132
  fn: {
133
    wiki: function() {
134
      this.encloseLineSelection('','',function(str) {
135
        str = str.replace(/\r/g,'');
136
        return str.replace(/(\n|^)[*-]?\s*/g,"$1# ");
137
      });
138
    }
139
  }
140 140
}
141 141

  
142 142
// spacer
......
144 144

  
145 145
// bq
146 146
jsToolBar.prototype.elements.bq = {
147
	type: 'button',
148
	title: 'Quote',
149
	fn: {
150
		wiki: function() {
151
			this.encloseLineSelection('','',function(str) {
152
				str = str.replace(/\r/g,'');
153
				return str.replace(/(\n|^) *([^\n]*)/g,"$1> $2");
154
			});
155
		}
156
	}
147
  type: 'button',
148
  title: 'Quote',
149
  fn: {
150
    wiki: function() {
151
      this.encloseLineSelection('','',function(str) {
152
        str = str.replace(/\r/g,'');
153
        return str.replace(/(\n|^) *([^\n]*)/g,"$1> $2");
154
      });
155
    }
156
  }
157 157
}
158 158

  
159 159
// unbq
160 160
jsToolBar.prototype.elements.unbq = {
161
	type: 'button',
162
	title: 'Unquote',
163
	fn: {
164
		wiki: function() {
165
			this.encloseLineSelection('','',function(str) {
166
				str = str.replace(/\r/g,'');
167
				return str.replace(/(\n|^) *[>]? *([^\n]*)/g,"$1$2");
168
			});
169
		}
170
	}
161
  type: 'button',
162
  title: 'Unquote',
163
  fn: {
164
    wiki: function() {
165
      this.encloseLineSelection('','',function(str) {
166
        str = str.replace(/\r/g,'');
167
        return str.replace(/(\n|^) *[>]? *([^\n]*)/g,"$1$2");
168
      });
169
    }
170
  }
171 171
}
172 172

  
173 173
// pre
174 174
jsToolBar.prototype.elements.pre = {
175
	type: 'button',
176
	title: 'Preformatted text',
177
	fn: {
178
		wiki: function() { this.encloseLineSelection('<pre>\n', '\n</pre>') }
179
	}
175
  type: 'button',
176
  title: 'Preformatted text',
177
  fn: {
178
    wiki: function() { this.encloseLineSelection('<pre>\n', '\n</pre>') }
179
  }
180 180
}
181 181

  
182 182
// spacer
......
184 184

  
185 185
// wiki page
186 186
jsToolBar.prototype.elements.link = {
187
	type: 'button',
188
	title: 'Wiki link',
189
	fn: {
190
		wiki: function() { this.encloseSelection("[[", "]]") }
191
	}
187
  type: 'button',
188
  title: 'Wiki link',
189
  fn: {
190
    wiki: function() { this.encloseSelection("[[", "]]") }
191
  }
192 192
}
193 193
// image
194 194
jsToolBar.prototype.elements.img = {
195
	type: 'button',
196
	title: 'Image',
197
	fn: {
198
		wiki: function() { this.encloseSelection("!", "!") }
199
	}
195
  type: 'button',
196
  title: 'Image',
197
  fn: {
198
    wiki: function() { this.encloseSelection("!", "!") }
199
  }
200 200
}
201 201

  
202 202
// spacer
203 203
jsToolBar.prototype.elements.space5 = {type: 'space'}
204 204
// help
205 205
jsToolBar.prototype.elements.help = {
206
	type: 'button',
207
	title: 'Help',
208
	fn: {
209
		wiki: function() { window.open(this.help_link, '', 'resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes') }
210
	}
206
  type: 'button',
207
  title: 'Help',
208
  fn: {
209
    wiki: function() { window.open(this.help_link, '', 'resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes') }
210
  }
211 211
}
    (1-1/1)