[Jifty-commit] r3191 - in jifty/trunk/plugins/WikiToolbar: . doc lib lib/Jifty lib/Jifty/Plugin lib/Jifty/Plugin/WikiToolbar lib/Jifty/Plugin/WikiToolbar/Model share share/po share/web share/web/static share/web/static/img share/web/static/img/wt share/web/static/js share/web/templates t

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Wed May 2 04:50:44 EDT 2007


Author: yves
Date: Wed May  2 04:50:44 2007
New Revision: 3191

Added:
   jifty/trunk/plugins/WikiToolbar/
   jifty/trunk/plugins/WikiToolbar/Makefile.PL
   jifty/trunk/plugins/WikiToolbar/doc/
   jifty/trunk/plugins/WikiToolbar/lib/
   jifty/trunk/plugins/WikiToolbar/lib/Jifty/
   jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/
   jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/
   jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar.pm
   jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Action/
   jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Dispatcher.pm
   jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Model/
   jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Textarea.pm
   jifty/trunk/plugins/WikiToolbar/share/
   jifty/trunk/plugins/WikiToolbar/share/po/
   jifty/trunk/plugins/WikiToolbar/share/web/
   jifty/trunk/plugins/WikiToolbar/share/web/static/
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/bold.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/box.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/center.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/code.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/code1.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/empty.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/h1.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/h2.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/h3.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/italic.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/link.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/linkextern.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/new.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/ol.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/red.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/strike.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/tab.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/ul.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/underline.png   (contents, props changed)
   jifty/trunk/plugins/WikiToolbar/share/web/static/js/
   jifty/trunk/plugins/WikiToolbar/share/web/static/js/wikitoolbar.js
   jifty/trunk/plugins/WikiToolbar/share/web/templates/
   jifty/trunk/plugins/WikiToolbar/t/

Log:
plugin to add a wiki toolbar to textarea


Added: jifty/trunk/plugins/WikiToolbar/Makefile.PL
==============================================================================
--- (empty file)
+++ jifty/trunk/plugins/WikiToolbar/Makefile.PL	Wed May  2 04:50:44 2007
@@ -0,0 +1,8 @@
+use inc::Module::Install;
+name('Jifty-Plugin-WikiToolbar');
+version('0.01');
+requires('Jifty' => '0.70416');
+
+install_share;
+
+WriteAll;

Added: jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar.pm
==============================================================================
--- (empty file)
+++ jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar.pm	Wed May  2 04:50:44 2007
@@ -0,0 +1,38 @@
+use strict;
+use warnings;
+
+package Jifty::Plugin::WikiToolbar;
+use base qw/Jifty::Plugin/;
+
+=head1 SYNOPSIS
+
+In etc/config.yml
+
+   Plugins:
+     - WikiToolbar: {}
+
+In your Model instead of 
+
+   render_as 'textarea';
+
+use
+
+  render_as 'Jifty::Plugin::WikiToolbar::Textarea';
+
+To custom the toolbar, copy wikitoolbar.js in your application, at the end of the file put your changes with addButton function.
+
+=head1 DESCRIPTION
+
+Add a toolbar to your textarea field. Default toolbar provide markdown markup syntax. http://daringfireball.net/projects/markdown/
+
+=cut
+
+sub init {
+    my $self = shift;
+    Jifty->web->javascript_libs([
+    @{ Jifty->web->javascript_libs },
+    "wikitoolbar.js",
+    ]);
+}
+
+1;

Added: jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Dispatcher.pm
==============================================================================
--- (empty file)
+++ jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Dispatcher.pm	Wed May  2 04:50:44 2007
@@ -0,0 +1,9 @@
+use strict;
+use warnings;
+
+package Jifty::Plugin::WikiToolbar::Dispatcher;
+use Jifty::Dispatcher -base;
+
+# Put any plugin-specific dispatcher rules here.
+
+1;

Added: jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Textarea.pm
==============================================================================
--- (empty file)
+++ jifty/trunk/plugins/WikiToolbar/lib/Jifty/Plugin/WikiToolbar/Textarea.pm	Wed May  2 04:50:44 2007
@@ -0,0 +1,24 @@
+package Jifty::Plugin::WikiToolbar::Textarea;
+use base qw(Jifty::Web::Form::Field::Textarea);
+
+sub rows { 30 };
+
+sub render_widget {
+    my $self  = shift;
+    my $field;
+    $field .= qq!<div id='toolbar'></div>!;
+    $field .= qq!<textarea!;
+    $field .= qq! name="@{[ $self->input_name ]}"!;
+    $field .= qq! id="@{[ $self->element_id ]}"!;
+    $field .= qq! rows="@{[$self->rows || 5 ]}"!;
+    $field .= qq! cols="@{[$self->cols || 60]}"!;
+    $field .= $self->_widget_class;
+    $field .= qq! >!;
+    $field .= Jifty->web->escape($self->current_value) if $self->current_value;
+	$field .= qq!</textarea>\n!;
+    Jifty->web->out($field);
+    '';
+}
+
+
+1;

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/bold.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/box.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/center.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/code.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/code1.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/empty.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/h1.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/h2.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/h3.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/italic.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/link.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/linkextern.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/new.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/ol.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/red.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/strike.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/tab.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/ul.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/img/wt/underline.png
==============================================================================
Binary file. No diff available.

Added: jifty/trunk/plugins/WikiToolbar/share/web/static/js/wikitoolbar.js
==============================================================================
--- (empty file)
+++ jifty/trunk/plugins/WikiToolbar/share/web/static/js/wikitoolbar.js	Wed May  2 04:50:44 2007
@@ -0,0 +1,137 @@
+// Wikipedia JavaScript toolbar functions
+
+mwEditButtons = [];
+
+// this function generates the actual toolbar buttons with localized text
+// we use it to avoid creating the toolbar where javascript is not enabled
+function addButton(imageFile, speedTip, tagOpen, tagClose, sampleText) {
+	mwEditButtons[mwEditButtons.length] =
+		{"imageFile": imageFile,
+		 "speedTip": speedTip,
+		 "tagOpen": tagOpen,
+		 "tagClose": tagClose,
+		 "sampleText": sampleText};
+}
+
+// this function generates the actual toolbar buttons with localized text
+// we use it to avoid creating the toolbar where javascript is not enabled
+function mwInsertEditButton(parent, item) {
+    if (typeof item.imageFile == 'undefined') {
+        return;}
+	var image = document.createElement("img");
+	image.width = 16;
+	image.height = 16;
+	image.src = item.imageFile;
+	image.border = 0;
+	image.alt = item.speedTip;
+	image.title = item.speedTip;
+	image.style.cursor = "pointer";
+	image.onclick = function() {
+		insertTags(item.tagOpen, item.tagClose, item.sampleText);
+		return false;
+	}
+	parent.appendChild(image);
+}
+
+// apply tagOpen/tagClose to selection in textarea,
+// use sampleText instead of selection if there is none
+// copied and adapted from phpBB
+function insertTags(tagOpen, tagClose, sampleText) {
+
+   // var txtarea = document.getElementsByTagName('TEXTAREA')[0];
+    // TODO: need a better way to manage multi textarea
+    var txtarea;
+    var txtareas = document.getElementsByTagName('TEXTAREA');
+    for (i = 0; i < txtareas.length; i++) {
+        var textbox = txtareas[i];
+        if( textbox.selectionStart ) {
+            txtarea = textbox;
+        };
+    }
+
+    if (typeof txtarea == 'undefined') {
+        txtarea = document.getElementsByTagName('TEXTAREA')[0];
+    }
+
+	// IE
+	if (document.selection && !is_gecko) {
+		var theSelection = document.selection.createRange().text;
+		if (!theSelection)
+			theSelection=sampleText;
+		txtarea.focus();
+		if (theSelection.charAt(theSelection.length - 1) == " ") { // exclude ending space char, if any
+			theSelection = theSelection.substring(0, theSelection.length - 1);
+			document.selection.createRange().text = tagOpen + theSelection + tagClose + " ";
+		} else {
+			document.selection.createRange().text = tagOpen + theSelection + tagClose;
+		}
+
+	// Mozilla
+	} else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
+		var replaced = false;
+		var startPos = txtarea.selectionStart;
+		var endPos = txtarea.selectionEnd;
+		if (endPos-startPos)
+			replaced = true;
+		var scrollTop = txtarea.scrollTop;
+		var myText = (txtarea.value).substring(startPos, endPos);
+		if (!myText)
+			myText=sampleText;
+		if (myText.charAt(myText.length - 1) == " ") { // exclude ending space char, if any
+			subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
+		} else {
+			subst = tagOpen + myText + tagClose;
+		}
+		txtarea.value = txtarea.value.substring(0, startPos) + subst +
+			txtarea.value.substring(endPos, txtarea.value.length);
+		txtarea.focus();
+		//set new selection
+		if (replaced) {
+			var cPos = startPos+(tagOpen.length+myText.length+tagClose.length);
+			txtarea.selectionStart = cPos;
+			txtarea.selectionEnd = cPos;
+		} else {
+			txtarea.selectionStart = startPos+tagOpen.length;
+			txtarea.selectionEnd = startPos+tagOpen.length+myText.length;
+		}
+		txtarea.scrollTop = scrollTop;
+
+	// All other browsers get no toolbar.
+	// There was previously support for a crippled "help"
+	// bar, but that caused more problems than it solved.
+	}
+	// reposition cursor if possible
+	if (txtarea.createTextRange)
+		txtarea.caretPos = document.selection.createRange().duplicate();
+}
+
+
+
+var myrules = {
+        '#toolbar' : function(e){
+			mwEditButtons = [];
+// CUSTOM your toolbar HERE
+// addButton : image, help text, first tag before selected text, last tag, default text if nothing is selected
+addButton('/static/img/wt/bold.png','Bold text','\*\*','\*\*','Bold text');
+addButton('/static/img/wt/italic.png','Italic text','\_','\_','Italic text');
+  addButton('/static/img/wt/empty.png','','','','');
+addButton('/static/img/wt/h1.png','Title','','\n=======\n','Title');
+addButton('/static/img/wt/h2.png','Sub title','','\n-------\n','Sub title');
+addButton('/static/img/wt/h3.png','Sub sub title','### ',' ###\n','Sub sub title');
+  addButton('/static/img/wt/empty.png','','','','');
+addButton('/static/img/wt/link.png','Link','[','](http://...... )','Text');
+addButton('/static/img/wt/linkextern.png','URL','<','>','http://.....');
+  addButton('/static/img/wt/empty.png','','','','');
+addButton('/static/img/wt/ul.png','List','\n- element 1\n- element 2\n- element 3\n\n ','','');
+addButton('/static/img/wt/ol.png','Ordered list','\n1. element 1\n1. element 2\n1. element 3\n\n ','','');
+// END
+
+	for(i=0;i<mwEditButtons.length;i++) {
+		mwInsertEditButton(e, mwEditButtons[i]);
+	}
+
+        }
+    };
+    
+Behaviour.register(myrules);
+


More information about the Jifty-commit mailing list