Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

first commit

  • Loading branch information...
commit 9a4e130c1764132dc227a374355f63c0d603f3ea 0 parents
Alex authored June 28, 2011

Showing 41 changed files with 882 additions and 0 deletions. Show diff stats Hide diff stats

  1. BIN  .DS_Store
  2. 4  .gitignore
  3. 4  Gemfile
  4. 1  Rakefile
  5. BIN  lib/.DS_Store
  6. BIN  lib/generators/.DS_Store
  7. BIN  lib/generators/rails_markitup/.DS_Store
  8. 25  lib/generators/rails_markitup/install_generator.rb
  9. BIN  lib/generators/rails_markitup/media/.DS_Store
  10. BIN  lib/generators/rails_markitup/media/images/.DS_Store
  11. BIN  lib/generators/rails_markitup/media/images/bg-container.png
  12. BIN  lib/generators/rails_markitup/media/images/bg-editor-bbcode.png
  13. BIN  lib/generators/rails_markitup/media/images/bg-editor-dotclear.png
  14. BIN  lib/generators/rails_markitup/media/images/bg-editor-html.png
  15. BIN  lib/generators/rails_markitup/media/images/bg-editor-json.png
  16. BIN  lib/generators/rails_markitup/media/images/bg-editor-markdown.png
  17. BIN  lib/generators/rails_markitup/media/images/bg-editor-textile.png
  18. BIN  lib/generators/rails_markitup/media/images/bg-editor-wiki.png
  19. BIN  lib/generators/rails_markitup/media/images/bg-editor-xml.png
  20. BIN  lib/generators/rails_markitup/media/images/bg-editor.png
  21. BIN  lib/generators/rails_markitup/media/images/bold.png
  22. BIN  lib/generators/rails_markitup/media/images/clean.png
  23. BIN  lib/generators/rails_markitup/media/images/handle.png
  24. BIN  lib/generators/rails_markitup/media/images/image.png
  25. BIN  lib/generators/rails_markitup/media/images/italic.png
  26. BIN  lib/generators/rails_markitup/media/images/link.png
  27. BIN  lib/generators/rails_markitup/media/images/menu.png
  28. BIN  lib/generators/rails_markitup/media/images/picture.png
  29. BIN  lib/generators/rails_markitup/media/images/preview.png
  30. BIN  lib/generators/rails_markitup/media/images/stroke.png
  31. BIN  lib/generators/rails_markitup/media/images/submenu.png
  32. BIN  lib/generators/rails_markitup/media/javascripts/.DS_Store
  33. 574  lib/generators/rails_markitup/media/javascripts/jquery.markitup.js
  34. 47  lib/generators/rails_markitup/media/javascripts/sets/markdown/set.js
  35. 27  lib/generators/rails_markitup/media/stylesheets/sets/markdown/style.css
  36. 147  lib/generators/rails_markitup/media/stylesheets/skins/markitup/style.css
  37. 7  lib/rails_markitup.rb
  38. BIN  lib/rails_markitup/.DS_Store
  39. 16  lib/rails_markitup/engine.rb
  40. 3  lib/rails_markitup/version.rb
  41. 27  rails_markitup.gemspec
BIN  .DS_Store
Binary file not shown
4  .gitignore
... ...
@@ -0,0 +1,4 @@
  1
+*.gem
  2
+.bundle
  3
+Gemfile.lock
  4
+pkg/*
4  Gemfile
... ...
@@ -0,0 +1,4 @@
  1
+source "http://rubygems.org"
  2
+
  3
+# Specify your gem's dependencies in rails_markitup.gemspec
  4
+gemspec
1  Rakefile
... ...
@@ -0,0 +1 @@
  1
+require 'bundler/gem_tasks'
BIN  lib/.DS_Store
Binary file not shown
BIN  lib/generators/.DS_Store
Binary file not shown
BIN  lib/generators/rails_markitup/.DS_Store
Binary file not shown
25  lib/generators/rails_markitup/install_generator.rb
... ...
@@ -0,0 +1,25 @@
  1
+require 'rails/generators'
  2
+
  3
+# =================================
  4
+# = rails g rails_markitup:install =
  5
+# =================================
  6
+
  7
+module RailsMarkitup
  8
+  module Generators
  9
+
  10
+    class InstallGenerator < Rails::Generators::Base
  11
+      
  12
+      source_root File.expand_path('../media', __FILE__)
  13
+      desc "Copies media files to main project"
  14
+      def copy_media_files
  15
+        copy_file "../media/images/*.png",                         "public/stylesheets/markitup/image/"
  16
+        copy_file "../media/javascripts/jquery.markitup.js",       "public/javascripts/markitup/jquery.markitup.js"
  17
+        copy_file "../media/javascripts/sets/markdown/set.js",     "public/javascripts/markitup/sets/markdown/set.js"
  18
+        copy_file "../media/stylesheets/sets/markdown/style.css",  "public/stylesheets/markitup/sets/markdown/style.css"
  19
+        copy_file "../media/stylesheets/skins/markitup/style.css", "public/stylesheets/markitup/skins/markdown/style.css"
  20
+
  21
+      end
  22
+    end
  23
+
  24
+  end
  25
+end
BIN  lib/generators/rails_markitup/media/.DS_Store
Binary file not shown
BIN  lib/generators/rails_markitup/media/images/.DS_Store
Binary file not shown
BIN  lib/generators/rails_markitup/media/images/bg-container.png
BIN  lib/generators/rails_markitup/media/images/bg-editor-bbcode.png
BIN  lib/generators/rails_markitup/media/images/bg-editor-dotclear.png
BIN  lib/generators/rails_markitup/media/images/bg-editor-html.png
BIN  lib/generators/rails_markitup/media/images/bg-editor-json.png
BIN  lib/generators/rails_markitup/media/images/bg-editor-markdown.png
BIN  lib/generators/rails_markitup/media/images/bg-editor-textile.png
BIN  lib/generators/rails_markitup/media/images/bg-editor-wiki.png
BIN  lib/generators/rails_markitup/media/images/bg-editor-xml.png
BIN  lib/generators/rails_markitup/media/images/bg-editor.png
BIN  lib/generators/rails_markitup/media/images/bold.png
BIN  lib/generators/rails_markitup/media/images/clean.png
BIN  lib/generators/rails_markitup/media/images/handle.png
BIN  lib/generators/rails_markitup/media/images/image.png
BIN  lib/generators/rails_markitup/media/images/italic.png
BIN  lib/generators/rails_markitup/media/images/link.png
BIN  lib/generators/rails_markitup/media/images/menu.png
BIN  lib/generators/rails_markitup/media/images/picture.png
BIN  lib/generators/rails_markitup/media/images/preview.png
BIN  lib/generators/rails_markitup/media/images/stroke.png
BIN  lib/generators/rails_markitup/media/images/submenu.png
BIN  lib/generators/rails_markitup/media/javascripts/.DS_Store
Binary file not shown
574  lib/generators/rails_markitup/media/javascripts/jquery.markitup.js
... ...
@@ -0,0 +1,574 @@
  1
+// ----------------------------------------------------------------------------
  2
+// markItUp! Universal MarkUp Engine, JQuery plugin
  3
+// v 1.1.x
  4
+// Dual licensed under the MIT and GPL licenses.
  5
+// ----------------------------------------------------------------------------
  6
+// Copyright (C) 2007-2010 Jay Salvat
  7
+// http://markitup.jaysalvat.com/
  8
+// ----------------------------------------------------------------------------
  9
+// Permission is hereby granted, free of charge, to any person obtaining a copy
  10
+// of this software and associated documentation files (the "Software"), to deal
  11
+// in the Software without restriction, including without limitation the rights
  12
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13
+// copies of the Software, and to permit persons to whom the Software is
  14
+// furnished to do so, subject to the following conditions:
  15
+// 
  16
+// The above copyright notice and this permission notice shall be included in
  17
+// all copies or substantial portions of the Software.
  18
+// 
  19
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  25
+// THE SOFTWARE.
  26
+// ----------------------------------------------------------------------------
  27
+(function($) {
  28
+	$.fn.markItUp = function(settings, extraSettings) {
  29
+		var options, ctrlKey, shiftKey, altKey;
  30
+		ctrlKey = shiftKey = altKey = false;
  31
+	
  32
+		options = {	id:						'',
  33
+					nameSpace:				'',
  34
+					root:					'',
  35
+					previewInWindow:		'', // 'width=800, height=600, resizable=yes, scrollbars=yes'
  36
+					previewAutoRefresh:		true,
  37
+					previewPosition:		'after',
  38
+					previewTemplatePath:	'~/templates/preview.html',
  39
+					previewParserPath:		'',
  40
+					previewParserVar:		'data',
  41
+					resizeHandle:			true,
  42
+					beforeInsert:			'',
  43
+					afterInsert:			'',
  44
+					onEnter:				{},
  45
+					onShiftEnter:			{},
  46
+					onCtrlEnter:			{},
  47
+					onTab:					{},
  48
+					markupSet:			[	{ /* set */ } ]
  49
+				};
  50
+		$.extend(options, settings, extraSettings);
  51
+
  52
+		// compute markItUp! path
  53
+		if (!options.root) {
  54
+			$('script').each(function(a, tag) {
  55
+				miuScript = $(tag).get(0).src.match(/(.*)jquery\.markitup(\.pack)?\.js$/);
  56
+				if (miuScript !== null) {
  57
+					options.root = miuScript[1];
  58
+				}
  59
+			});
  60
+		}
  61
+
  62
+		return this.each(function() {
  63
+			var $$, textarea, levels, scrollPosition, caretPosition, caretOffset,
  64
+				clicked, hash, header, footer, previewWindow, template, iFrame, abort;
  65
+			$$ = $(this);
  66
+			textarea = this;
  67
+			levels = [];
  68
+			abort = false;
  69
+			scrollPosition = caretPosition = 0;
  70
+			caretOffset = -1;
  71
+
  72
+			options.previewParserPath = localize(options.previewParserPath);
  73
+			options.previewTemplatePath = localize(options.previewTemplatePath);
  74
+
  75
+			// apply the computed path to ~/
  76
+			function localize(data, inText) {
  77
+				if (inText) {
  78
+					return 	data.replace(/("|')~\//g, "$1"+options.root);
  79
+				}
  80
+				return 	data.replace(/^~\//, options.root);
  81
+			}
  82
+
  83
+			// init and build editor
  84
+			function init() {
  85
+				id = ''; nameSpace = '';
  86
+				if (options.id) {
  87
+					id = 'id="'+options.id+'"';
  88
+				} else if ($$.attr("id")) {
  89
+					id = 'id="markItUp'+($$.attr("id").substr(0, 1).toUpperCase())+($$.attr("id").substr(1))+'"';
  90
+
  91
+				}
  92
+				if (options.nameSpace) {
  93
+					nameSpace = 'class="'+options.nameSpace+'"';
  94
+				}
  95
+				$$.wrap('<div '+nameSpace+'></div>');
  96
+				$$.wrap('<div '+id+' class="markItUp"></div>');
  97
+				$$.wrap('<div class="markItUpContainer"></div>');
  98
+				$$.addClass("markItUpEditor");
  99
+
  100
+				// add the header before the textarea
  101
+				header = $('<div class="markItUpHeader"></div>').insertBefore($$);
  102
+				$(dropMenus(options.markupSet)).appendTo(header);
  103
+
  104
+				// add the footer after the textarea
  105
+				footer = $('<div class="markItUpFooter"></div>').insertAfter($$);
  106
+
  107
+				// add the resize handle after textarea
  108
+				if (options.resizeHandle === true && $.browser.safari !== true) {
  109
+					resizeHandle = $('<div class="markItUpResizeHandle"></div>')
  110
+						.insertAfter($$)
  111
+						.bind("mousedown", function(e) {
  112
+							var h = $$.height(), y = e.clientY, mouseMove, mouseUp;
  113
+							mouseMove = function(e) {
  114
+								$$.css("height", Math.max(20, e.clientY+h-y)+"px");
  115
+								return false;
  116
+							};
  117
+							mouseUp = function(e) {
  118
+								$("html").unbind("mousemove", mouseMove).unbind("mouseup", mouseUp);
  119
+								return false;
  120
+							};
  121
+							$("html").bind("mousemove", mouseMove).bind("mouseup", mouseUp);
  122
+					});
  123
+					footer.append(resizeHandle);
  124
+				}
  125
+
  126
+				// listen key events
  127
+				$$.keydown(keyPressed).keyup(keyPressed);
  128
+				
  129
+				// bind an event to catch external calls
  130
+				$$.bind("insertion", function(e, settings) {
  131
+					if (settings.target !== false) {
  132
+						get();
  133
+					}
  134
+					if (textarea === $.markItUp.focused) {
  135
+						markup(settings);
  136
+					}
  137
+				});
  138
+
  139
+				// remember the last focus
  140
+				$$.focus(function() {
  141
+					$.markItUp.focused = this;
  142
+				});
  143
+			}
  144
+
  145
+			// recursively build header with dropMenus from markupset
  146
+			function dropMenus(markupSet) {
  147
+				var ul = $('<ul></ul>'), i = 0;
  148
+				$('li:hover > ul', ul).css('display', 'block');
  149
+				$.each(markupSet, function() {
  150
+					var button = this, t = '', title, li, j;
  151
+					title = (button.key) ? (button.name||'')+' [Ctrl+'+button.key+']' : (button.name||'');
  152
+					key   = (button.key) ? 'accesskey="'+button.key+'"' : '';
  153
+					if (button.separator) {
  154
+						li = $('<li class="markItUpSeparator">'+(button.separator||'')+'</li>').appendTo(ul);
  155
+					} else {
  156
+						i++;
  157
+						for (j = levels.length -1; j >= 0; j--) {
  158
+							t += levels[j]+"-";
  159
+						}
  160
+						li = $('<li class="markItUpButton markItUpButton'+t+(i)+' '+(button.className||'')+'"><a href="" '+key+' title="'+title+'">'+(button.name||'')+'</a></li>')
  161
+						.bind("contextmenu", function() { // prevent contextmenu on mac and allow ctrl+click
  162
+							return false;
  163
+						}).click(function() {
  164
+							return false;
  165
+						}).bind("focusin", function(){
  166
+                            $$.focus();
  167
+						}).mousedown(function() {
  168
+							if (button.call) {
  169
+								eval(button.call)();
  170
+							}
  171
+							setTimeout(function() { markup(button) },1);
  172
+							return false;
  173
+						}).hover(function() {
  174
+								$('> ul', this).show();
  175
+								$(document).one('click', function() { // close dropmenu if click outside
  176
+										$('ul ul', header).hide();
  177
+									}
  178
+								);
  179
+							}, function() {
  180
+								$('> ul', this).hide();
  181
+							}
  182
+						).appendTo(ul);
  183
+						if (button.dropMenu) {
  184
+							levels.push(i);
  185
+							$(li).addClass('markItUpDropMenu').append(dropMenus(button.dropMenu));
  186
+						}
  187
+					}
  188
+				}); 
  189
+				levels.pop();
  190
+				return ul;
  191
+			}
  192
+
  193
+			// markItUp! markups
  194
+			function magicMarkups(string) {
  195
+				if (string) {
  196
+					string = string.toString();
  197
+					string = string.replace(/\(\!\(([\s\S]*?)\)\!\)/g,
  198
+						function(x, a) {
  199
+							var b = a.split('|!|');
  200
+							if (altKey === true) {
  201
+								return (b[1] !== undefined) ? b[1] : b[0];
  202
+							} else {
  203
+								return (b[1] === undefined) ? "" : b[0];
  204
+							}
  205
+						}
  206
+					);
  207
+					// [![prompt]!], [![prompt:!:value]!]
  208
+					string = string.replace(/\[\!\[([\s\S]*?)\]\!\]/g,
  209
+						function(x, a) {
  210
+							var b = a.split(':!:');
  211
+							if (abort === true) {
  212
+								return false;
  213
+							}
  214
+							value = prompt(b[0], (b[1]) ? b[1] : '');
  215
+							if (value === null) {
  216
+								abort = true;
  217
+							}
  218
+							return value;
  219
+						}
  220
+					);
  221
+					return string;
  222
+				}
  223
+				return "";
  224
+			}
  225
+
  226
+			// prepare action
  227
+			function prepare(action) {
  228
+				if ($.isFunction(action)) {
  229
+					action = action(hash);
  230
+				}
  231
+				return magicMarkups(action);
  232
+			}
  233
+
  234
+			// build block to insert
  235
+			function build(string) {
  236
+				var openWith 	= prepare(clicked.openWith);
  237
+				var placeHolder = prepare(clicked.placeHolder);
  238
+				var replaceWith = prepare(clicked.replaceWith);
  239
+				var closeWith 	= prepare(clicked.closeWith);
  240
+				if (replaceWith !== "") {
  241
+					block = openWith + replaceWith + closeWith;
  242
+				} else if (selection === '' && placeHolder !== '') {
  243
+					block = openWith + placeHolder + closeWith;
  244
+				} else {
  245
+					string = string || selection;						
  246
+					if (string.match(/ $/)) {
  247
+						block = openWith + string.replace(/ $/, '') + closeWith + ' ';
  248
+					} else {
  249
+						block = openWith + string + closeWith;
  250
+					}
  251
+				}
  252
+				return {	block:block, 
  253
+							openWith:openWith, 
  254
+							replaceWith:replaceWith, 
  255
+							placeHolder:placeHolder,
  256
+							closeWith:closeWith
  257
+					};
  258
+			}
  259
+
  260
+			// define markup to insert
  261
+			function markup(button) {
  262
+				var len, j, n, i;
  263
+				hash = clicked = button;
  264
+				get();
  265
+
  266
+				$.extend(hash, {	line:"", 
  267
+						 			root:options.root,
  268
+									textarea:textarea, 
  269
+									selection:(selection||''), 
  270
+									caretPosition:caretPosition,
  271
+									ctrlKey:ctrlKey, 
  272
+									shiftKey:shiftKey, 
  273
+									altKey:altKey
  274
+								}
  275
+							);
  276
+				// callbacks before insertion
  277
+				prepare(options.beforeInsert);
  278
+				prepare(clicked.beforeInsert);
  279
+				if (ctrlKey === true && shiftKey === true) {
  280
+					prepare(clicked.beforeMultiInsert);
  281
+				}			
  282
+				$.extend(hash, { line:1 });
  283
+				
  284
+				if (ctrlKey === true && shiftKey === true) {
  285
+					lines = selection.split(/\r?\n/);
  286
+					for (j = 0, n = lines.length, i = 0; i < n; i++) {
  287
+						if ($.trim(lines[i]) !== '') {
  288
+							$.extend(hash, { line:++j, selection:lines[i] } );
  289
+							lines[i] = build(lines[i]).block;
  290
+						} else {
  291
+							lines[i] = "";
  292
+						}
  293
+					}
  294
+					string = { block:lines.join('\n')};
  295
+					start = caretPosition;
  296
+					len = string.block.length + (($.browser.opera) ? n-1 : 0);
  297
+				} else if (ctrlKey === true) {
  298
+					string = build(selection);
  299
+					start = caretPosition + string.openWith.length;
  300
+					len = string.block.length - string.openWith.length - string.closeWith.length;
  301
+					len = len - (string.block.match(/ $/) ? 1 : 0);
  302
+					len -= fixIeBug(string.block);
  303
+				} else if (shiftKey === true) {
  304
+					string = build(selection);
  305
+					start = caretPosition;
  306
+					len = string.block.length;
  307
+					len -= fixIeBug(string.block);
  308
+				} else {
  309
+					string = build(selection);
  310
+					start = caretPosition + string.block.length ;
  311
+					len = 0;
  312
+					start -= fixIeBug(string.block);
  313
+				}
  314
+				if ((selection === '' && string.replaceWith === '')) {
  315
+					caretOffset += fixOperaBug(string.block);
  316
+					
  317
+					start = caretPosition + string.openWith.length;
  318
+					len = string.block.length - string.openWith.length - string.closeWith.length;
  319
+
  320
+					caretOffset = $$.val().substring(caretPosition,  $$.val().length).length;
  321
+					caretOffset -= fixOperaBug($$.val().substring(0, caretPosition));
  322
+				}
  323
+				$.extend(hash, { caretPosition:caretPosition, scrollPosition:scrollPosition } );
  324
+
  325
+				if (string.block !== selection && abort === false) {
  326
+					insert(string.block);
  327
+					set(start, len);
  328
+				} else {
  329
+					caretOffset = -1;
  330
+				}
  331
+				get();
  332
+
  333
+				$.extend(hash, { line:'', selection:selection });
  334
+
  335
+				// callbacks after insertion
  336
+				if (ctrlKey === true && shiftKey === true) {
  337
+					prepare(clicked.afterMultiInsert);
  338
+				}
  339
+				prepare(clicked.afterInsert);
  340
+				prepare(options.afterInsert);
  341
+
  342
+				// refresh preview if opened
  343
+				if (previewWindow && options.previewAutoRefresh) {
  344
+					refreshPreview(); 
  345
+				}
  346
+																									
  347
+				// reinit keyevent
  348
+				shiftKey = altKey = ctrlKey = abort = false;
  349
+			}
  350
+
  351
+			// Substract linefeed in Opera
  352
+			function fixOperaBug(string) {
  353
+				if ($.browser.opera) {
  354
+					return string.length - string.replace(/\n*/g, '').length;
  355
+				}
  356
+				return 0;
  357
+			}
  358
+			// Substract linefeed in IE
  359
+			function fixIeBug(string) {
  360
+				if ($.browser.msie) {
  361
+					return string.length - string.replace(/\r/g, '').length;
  362
+				}
  363
+				return 0;
  364
+			}
  365
+				
  366
+			// add markup
  367
+			function insert(block) {	
  368
+				if (document.selection) {
  369
+					var newSelection = document.selection.createRange();
  370
+					newSelection.text = block;
  371
+				} else {
  372
+					textarea.value =  textarea.value.substring(0, caretPosition)  + block + textarea.value.substring(caretPosition + selection.length, textarea.value.length);
  373
+				}
  374
+			}
  375
+
  376
+			// set a selection
  377
+			function set(start, len) {
  378
+				if (textarea.createTextRange){
  379
+					// quick fix to make it work on Opera 9.5
  380
+					if ($.browser.opera && $.browser.version >= 9.5 && len == 0) {
  381
+						return false;
  382
+					}
  383
+					range = textarea.createTextRange();
  384
+					range.collapse(true);
  385
+					range.moveStart('character', start); 
  386
+					range.moveEnd('character', len); 
  387
+					range.select();
  388
+				} else if (textarea.setSelectionRange ){
  389
+					textarea.setSelectionRange(start, start + len);
  390
+				}
  391
+				textarea.scrollTop = scrollPosition;
  392
+				textarea.focus();
  393
+			}
  394
+
  395
+			// get the selection
  396
+			function get() {
  397
+				textarea.focus();
  398
+
  399
+				scrollPosition = textarea.scrollTop;
  400
+				if (document.selection) {
  401
+					selection = document.selection;	
  402
+					if ($.browser.msie) { // ie	
  403
+						var range = selection.createRange();
  404
+						var stored_range = range.duplicate();
  405
+						stored_range.moveToElementText(textarea);
  406
+						stored_range.setEndPoint('EndToEnd', range);
  407
+						var s = stored_range.text.length - range.text.length;
  408
+	
  409
+						caretPosition = s - (textarea.value.substr(0, s).length - textarea.value.substr(0, s).replace(/\r/g, '').length);
  410
+						selection = range.text;
  411
+					} else { // opera
  412
+						caretPosition = textarea.selectionStart;
  413
+					}
  414
+				} else { // gecko & webkit
  415
+					caretPosition = textarea.selectionStart;
  416
+					selection = textarea.value.substring(caretPosition, textarea.selectionEnd);
  417
+				} 
  418
+				return selection;
  419
+			}
  420
+
  421
+			// open preview window
  422
+			function preview() {
  423
+				if (!previewWindow || previewWindow.closed) {
  424
+					if (options.previewInWindow) {
  425
+						previewWindow = window.open('', 'preview', options.previewInWindow);
  426
+						$(window).unload(function() {
  427
+							previewWindow.close();
  428
+						});
  429
+					} else {
  430
+						iFrame = $('<iframe class="markItUpPreviewFrame"></iframe>');
  431
+						if (options.previewPosition == 'after') {
  432
+							iFrame.insertAfter(footer);
  433
+						} else {
  434
+							iFrame.insertBefore(header);
  435
+						}	
  436
+						previewWindow = iFrame[iFrame.length - 1].contentWindow || frame[iFrame.length - 1];
  437
+					}
  438
+				} else if (altKey === true) {
  439
+					if (iFrame) {
  440
+						iFrame.remove();
  441
+					} else {
  442
+						previewWindow.close();
  443
+					}
  444
+					previewWindow = iFrame = false;
  445
+				}
  446
+				if (!options.previewAutoRefresh) {
  447
+					refreshPreview(); 
  448
+				}
  449
+				if (options.previewInWindow) {
  450
+					previewWindow.focus();
  451
+				}
  452
+			}
  453
+
  454
+			// refresh Preview window
  455
+			function refreshPreview() {
  456
+ 				renderPreview();
  457
+			}
  458
+
  459
+			function renderPreview() {		
  460
+				var phtml;
  461
+				if (options.previewParserPath !== '') {
  462
+					$.ajax({
  463
+						type: 'POST',
  464
+						dataType: 'text',
  465
+						global: false,
  466
+						url: options.previewParserPath,
  467
+						data: options.previewParserVar+'='+encodeURIComponent($$.val()),
  468
+						success: function(data) {
  469
+							writeInPreview( localize(data, 1) ); 
  470
+						}
  471
+					});
  472
+				} else {
  473
+					if (!template) {
  474
+						$.ajax({
  475
+							url: options.previewTemplatePath,
  476
+							dataType: 'text',
  477
+							global: false,
  478
+							success: function(data) {
  479
+								writeInPreview( localize(data, 1).replace(/<!-- content -->/g, $$.val()) );
  480
+							}
  481
+						});
  482
+					}
  483
+				}
  484
+				return false;
  485
+			}
  486
+			
  487
+			function writeInPreview(data) {
  488
+				if (previewWindow.document) {			
  489
+					try {
  490
+						sp = previewWindow.document.documentElement.scrollTop
  491
+					} catch(e) {
  492
+						sp = 0;
  493
+					}	
  494
+					previewWindow.document.open();
  495
+					previewWindow.document.write(data);
  496
+					previewWindow.document.close();
  497
+					previewWindow.document.documentElement.scrollTop = sp;
  498
+				}
  499
+			}
  500
+			
  501
+			// set keys pressed
  502
+			function keyPressed(e) { 
  503
+				shiftKey = e.shiftKey;
  504
+				altKey = e.altKey;
  505
+				ctrlKey = (!(e.altKey && e.ctrlKey)) ? e.ctrlKey : false;
  506
+
  507
+				if (e.type === 'keydown') {
  508
+					if (ctrlKey === true) {
  509
+						li = $("a[accesskey="+String.fromCharCode(e.keyCode)+"]", header).parent('li');
  510
+						if (li.length !== 0) {
  511
+							ctrlKey = false;
  512
+							setTimeout(function() {
  513
+								li.triggerHandler('mousedown');
  514
+							},1);
  515
+							return false;
  516
+						}
  517
+					}
  518
+					if (e.keyCode === 13 || e.keyCode === 10) { // Enter key
  519
+						if (ctrlKey === true) {  // Enter + Ctrl
  520
+							ctrlKey = false;
  521
+							markup(options.onCtrlEnter);
  522
+							return options.onCtrlEnter.keepDefault;
  523
+						} else if (shiftKey === true) { // Enter + Shift
  524
+							shiftKey = false;
  525
+							markup(options.onShiftEnter);
  526
+							return options.onShiftEnter.keepDefault;
  527
+						} else { // only Enter
  528
+							markup(options.onEnter);
  529
+							return options.onEnter.keepDefault;
  530
+						}
  531
+					}
  532
+					if (e.keyCode === 9) { // Tab key
  533
+						if (shiftKey == true || ctrlKey == true || altKey == true) {
  534
+							return false; 
  535
+						}
  536
+						if (caretOffset !== -1) {
  537
+							get();
  538
+							caretOffset = $$.val().length - caretOffset;
  539
+							set(caretOffset, 0);
  540
+							caretOffset = -1;
  541
+							return false;
  542
+						} else {
  543
+							markup(options.onTab);
  544
+							return options.onTab.keepDefault;
  545
+						}
  546
+					}
  547
+				}
  548
+			}
  549
+
  550
+			init();
  551
+		});
  552
+	};
  553
+
  554
+	$.fn.markItUpRemove = function() {
  555
+		return this.each(function() {
  556
+				var $$ = $(this).unbind().removeClass('markItUpEditor');
  557
+				$$.parent('div').parent('div.markItUp').parent('div').replaceWith($$);
  558
+			}
  559
+		);
  560
+	};
  561
+
  562
+	$.markItUp = function(settings) {
  563
+		var options = { target:false };
  564
+		$.extend(options, settings);
  565
+		if (options.target) {
  566
+			return $(options.target).each(function() {
  567
+				$(this).focus();
  568
+				$(this).trigger('insertion', [options]);
  569
+			});
  570
+		} else {
  571
+			$('textarea').trigger('insertion', [options]);
  572
+		}
  573
+	};
  574
+})(jQuery);
47  lib/generators/rails_markitup/media/javascripts/sets/markdown/set.js
... ...
@@ -0,0 +1,47 @@
  1
+// ----------------------------------------------------------------------------
  2
+// markItUp!
  3
+// ----------------------------------------------------------------------------
  4
+// Copyright (C) 2008 Jay Salvat
  5
+// http://markitup.jaysalvat.com/
  6
+// ----------------------------------------------------------------------------
  7
+myMarkdownSettings = {
  8
+    nameSpace:          'markdown', // Useful to prevent multi-instances CSS conflict
  9
+    previewParserPath:  '~/sets/markdown/preview.php',
  10
+    onShiftEnter:       {keepDefault:false, openWith:'\n\n'},
  11
+    markupSet: [
  12
+        {name:'First Level Heading', key:"1", placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } },
  13
+        {name:'Second Level Heading', key:"2", placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } },
  14
+        {name:'Heading 3', key:"3", openWith:'### ', placeHolder:'Your title here...' },
  15
+        {name:'Heading 4', key:"4", openWith:'#### ', placeHolder:'Your title here...' },
  16
+        {name:'Heading 5', key:"5", openWith:'##### ', placeHolder:'Your title here...' },
  17
+        {name:'Heading 6', key:"6", openWith:'###### ', placeHolder:'Your title here...' },
  18
+        {separator:'---------------' },        
  19
+        {name:'Bold', key:"B", openWith:'**', closeWith:'**'},
  20
+        {name:'Italic', key:"I", openWith:'_', closeWith:'_'},
  21
+        {separator:'---------------' },
  22
+        {name:'Bulleted List', openWith:'- ' },
  23
+        {name:'Numeric List', openWith:function(markItUp) {
  24
+            return markItUp.line+'. ';
  25
+        }},
  26
+        {separator:'---------------' },
  27
+        {name:'Picture', key:"P", replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!] "[![Title]!]")'},
  28
+        {name:'Link', key:"L", openWith:'[', closeWith:']([![Url:!:http://]!] "[![Title]!]")', placeHolder:'Your text to link here...' },
  29
+        {separator:'---------------'},    
  30
+        {name:'Quotes', openWith:'> '},
  31
+        {name:'Code Block / Code', openWith:'(!(\t|!|`)!)', closeWith:'(!(`)!)'},
  32
+        {separator:'---------------'},
  33
+        {name:'Preview', call:'preview', className:"preview"}
  34
+    ]
  35
+}
  36
+
  37
+// mIu nameSpace to avoid conflict.
  38
+miu = {
  39
+    markdownTitle: function(markItUp, char) {
  40
+        heading = '';
  41
+        n = $.trim(markItUp.selection||markItUp.placeHolder).length;
  42
+        for(i = 0; i < n; i++) {
  43
+            heading += char;
  44
+        }
  45
+        return '\n'+heading+'\n';
  46
+    }
  47
+}
27  lib/generators/rails_markitup/media/stylesheets/sets/markdown/style.css
... ...
@@ -0,0 +1,27 @@
  1
+/* -------------------------------------------------------------------
  2
+// markItUp!
  3
+// By Jay Salvat - http://markitup.jaysalvat.com/
  4
+// ------------------------------------------------------------------*/
  5
+.markItUp .markItUpButton1 a {
  6
+	background-image:url(images/bold.png);
  7
+}
  8
+.markItUp .markItUpButton2 a {
  9
+	background-image:url(images/italic.png);
  10
+}
  11
+.markItUp .markItUpButton3 a {
  12
+	background-image:url(images/stroke.png);
  13
+}
  14
+
  15
+.markItUp .markItUpButton4 a {
  16
+	background-image:url(images/picture.png); 
  17
+}
  18
+.markItUp .markItUpButton5 a {
  19
+	background-image:url(images/link.png);
  20
+}
  21
+
  22
+.markItUp .markItUpButton6 a {
  23
+	background-image:url(images/clean.png);
  24
+}
  25
+.markItUp .preview a {
  26
+	background-image:url(images/preview.png);
  27
+}
147  lib/generators/rails_markitup/media/stylesheets/skins/markitup/style.css
... ...
@@ -0,0 +1,147 @@
  1
+/* -------------------------------------------------------------------
  2
+// markItUp! Universal MarkUp Engine, JQuery plugin
  3
+// By Jay Salvat - http://markitup.jaysalvat.com/
  4
+// ------------------------------------------------------------------*/
  5
+.markItUp * {
  6
+	margin:0px; padding:0px;
  7
+	outline:none;
  8
+}
  9
+.markItUp a:link,
  10
+.markItUp a:visited {
  11
+	color:#000;
  12
+	text-decoration:none;
  13
+}
  14
+.markItUp  {
  15
+	width:700px;
  16
+	margin:5px 0 5px 0;
  17
+	border:5px solid #F5F5F5;	
  18
+}
  19
+.markItUpContainer  {
  20
+	border:1px solid #3C769D;	
  21
+	background:#FFF url(images/bg-container.png) repeat-x top left;
  22
+	padding:5px 5px 2px 5px;
  23
+	font:11px Verdana, Arial, Helvetica, sans-serif;
  24
+}
  25
+.markItUpEditor {
  26
+	font:12px 'Courier New', Courier, monospace;
  27
+	padding:5px 5px 5px 35px;
  28
+	border:3px solid #3C769D;
  29
+	width:643px;
  30
+	height:320px;
  31
+	background:#FFF url(images/bg-editor.png) no-repeat;
  32
+	clear:both;
  33
+	line-height:18px;
  34
+	overflow:auto;
  35
+}
  36
+.markItUpPreviewFrame	{
  37
+	overflow:auto;
  38
+	background-color:#FFFFFF;
  39
+	border:1px solid #3C769D;
  40
+	width:99.9%;
  41
+	height:300px;
  42
+	margin:5px 0;
  43
+}
  44
+.markItUpFooter {
  45
+	width:100%;
  46
+	cursor:n-resize;
  47
+}
  48
+.markItUpResizeHandle {
  49
+	overflow:hidden;
  50
+	width:22px; height:5px;
  51
+	margin-left:auto;
  52
+	margin-right:auto;
  53
+	background-image:url(images/handle.png);
  54
+	cursor:n-resize;
  55
+}
  56
+/***************************************************************************************/
  57
+/* first row of buttons */
  58
+.markItUpHeader ul li	{
  59
+	list-style:none;
  60
+	float:left;
  61
+	position:relative;
  62
+}
  63
+.markItUpHeader ul li ul{
  64
+	display:none;
  65
+}
  66
+.markItUpHeader ul li:hover > ul{
  67
+	display:block;
  68
+}
  69
+.markItUpHeader ul .markItUpDropMenu {
  70
+	background:transparent url(images/menu.png) no-repeat 115% 50%;
  71
+	margin-right:5px;
  72
+}
  73
+.markItUpHeader ul .markItUpDropMenu li {
  74
+	margin-right:0px;
  75
+}
  76
+.markItUpHeader ul .markItUpSeparator {
  77
+	margin:0 10px;
  78
+	width:1px;
  79
+	height:16px;
  80
+	overflow:hidden;
  81
+	background-color:#CCC;
  82
+}
  83
+.markItUpHeader ul ul .markItUpSeparator {
  84
+	width:auto; height:1px;
  85
+	margin:0px;
  86
+}
  87
+/* next rows of buttons */
  88
+.markItUpHeader ul ul {
  89
+	display:none;
  90
+	position:absolute;
  91
+	top:18px; left:0px;	
  92
+	background:#F5F5F5;
  93
+	border:1px solid #3C769D;
  94
+	height:inherit;
  95
+}
  96
+.markItUpHeader ul ul li {
  97
+	float:none;
  98
+	border-bottom:1px solid #3C769D;
  99
+}
  100
+.markItUpHeader ul ul .markItUpDropMenu {
  101
+	background:#F5F5F5 url(images/submenu.png) no-repeat 100% 50%;
  102
+}
  103
+/* next rows of buttons */
  104
+.markItUpHeader ul ul ul {
  105
+	position:absolute;
  106
+	top:-1px; left:150px;
  107
+}
  108
+.markItUpHeader ul ul ul li {
  109
+	float:none;
  110
+}
  111
+.markItUpHeader ul a {
  112
+	display:block;
  113
+	width:16px; height:16px;
  114
+	text-indent:-10000px;
  115
+	background-repeat:no-repeat;
  116
+	padding:3px;
  117
+	margin:0px;
  118
+}
  119
+.markItUpHeader ul ul a {
  120
+	display:block;
  121
+	padding-left:0px;
  122
+	text-indent:0;
  123
+	width:120px; 
  124
+	padding:5px 5px 5px 25px;
  125
+	background-position:2px 50%;
  126
+}
  127
+.markItUpHeader ul ul a:hover  {
  128
+	color:#FFF;
  129
+	background-color:#3C769D;
  130
+}
  131
+/***************************************************************************************/
  132
+.html .markItUpEditor {
  133
+	background-image:url(images/bg-editor-html.png);
  134
+}
  135
+.markdown .markItUpEditor {
  136
+	background-image:url(images/bg-editor-markdown.png);
  137
+}
  138
+.textile .markItUpEditor {
  139
+	background-image:url(images/bg-editor-textile.png);
  140
+}
  141
+.bbcode .markItUpEditor {
  142
+	background-image:url(images/bg-editor-bbcode.png);
  143
+}
  144
+.wiki .markItUpEditor,
  145
+.dotclear .markItUpEditor {
  146
+	background-image:url(images/bg-editor-wiki.png);
  147
+}
7  lib/rails_markitup.rb
... ...
@@ -0,0 +1,7 @@
  1
+require 'rails'
  2
+require "rails_markitup/version"
  3
+require "rails_markitup/engine"
  4
+
  5
+module RailsMarkitup
  6
+  # Your code goes here...
  7
+end
BIN  lib/rails_markitup/.DS_Store
Binary file not shown
16  lib/rails_markitup/engine.rb
... ...
@@ -0,0 +1,16 @@
  1
+require 'rails'
  2
+
  3
+module RailsMarkitup
  4
+  class Engine < Rails::Engine
  5
+    
  6
+    # =====================================
  7
+    # = = javascript_include_tag :markitup =
  8
+    # = = stylesheet_link_tag    :markitup =
  9
+    # =====================================
  10
+    config.before_initialize do
  11
+      config.action_view.javascript_expansions[:markitup] = %w()
  12
+      config.action_view.stylesheet_expansions[:markitup] = %w()
  13
+    end
  14
+    
  15
+  end
  16
+end
3  lib/rails_markitup/version.rb
... ...
@@ -0,0 +1,3 @@
  1
+module RailsMarkitup
  2
+  VERSION = "0.0.1"
  3
+end
27  rails_markitup.gemspec
... ...
@@ -0,0 +1,27 @@
  1
+# -*- encoding: utf-8 -*-
  2
+$:.push File.expand_path("../lib", __FILE__)
  3
+require "rails_markitup/version"
  4
+require "rails_markitup/engine"
  5
+require "rake"
  6
+
  7
+Gem::Specification.new do |s|
  8
+  s.name        = "rails_markitup"
  9
+  s.version     = RailsMarkitup::VERSION
  10
+  s.authors     = ["AlexZhang"]
  11
+  s.email       = ["blackanger.z@gmail.com"]
  12
+  s.homepage    = ""
  13
+  s.summary     = %q{A MarkDown TextEditor}
  14
+  s.description = %q{A MarkDown TextEditor with jQuery and Markitup! and redcarpet}
  15
+  s.files       =  FileList["[A-Z]*", "{app,config,lib}/**/*"]
  16
+  s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
  17
+  s.extra_rdoc_files = FileList["[A-Z]*"] - %w(Gemfile Rakefile)
  18
+  s.rubyforge_project = "rails_markitup"
  19
+
  20
+  
  21
+  s.require_paths = ["lib"]
  22
+  s.add_dependency "rails", "3.0.8"
  23
+  s.add_dependency "redcarpet"
  24
+  
  25
+  s.add_development_dependency 'rspec', ['>= 0']
  26
+  s.add_development_dependency 'rspec-rails', ['>= 0']
  27
+end

0 notes on commit 9a4e130

Please sign in to comment.
Something went wrong with that request. Please try again.