simple_forum 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. data/README.rdoc +2 -5
  2. data/Rakefile +19 -14
  3. data/app/assets/images/simple_forum/forumNewPosts.gif +0 -0
  4. data/app/assets/images/simple_forum/forumNoNewPosts.gif +0 -0
  5. data/app/assets/javascripts/simple_forum/application.js +15 -0
  6. data/app/assets/javascripts/simple_forum/markitup.js +51 -0
  7. data/app/assets/javascripts/simple_forum/markitup/jquery.markitup.js +574 -0
  8. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/bold.png +0 -0
  9. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/clean.png +0 -0
  10. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/code.png +0 -0
  11. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/fonts.png +0 -0
  12. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/italic.png +0 -0
  13. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/link.png +0 -0
  14. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/list-bullet.png +0 -0
  15. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/list-item.png +0 -0
  16. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/list-numeric.png +0 -0
  17. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/picture.png +0 -0
  18. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/preview.png +0 -0
  19. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/quotes.png +0 -0
  20. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/stroke.png +0 -0
  21. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/images/underline.png +0 -0
  22. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/readme.txt +11 -0
  23. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/set.js +39 -0
  24. data/app/assets/javascripts/simple_forum/markitup/sets/bbcode/style.css.scss +47 -0
  25. data/app/assets/javascripts/simple_forum/markitup/sets/default/images/bold.png +0 -0
  26. data/app/assets/javascripts/simple_forum/markitup/sets/default/images/clean.png +0 -0
  27. data/app/assets/javascripts/simple_forum/markitup/sets/default/images/image.png +0 -0
  28. data/app/assets/javascripts/simple_forum/markitup/sets/default/images/italic.png +0 -0
  29. data/app/assets/javascripts/simple_forum/markitup/sets/default/images/link.png +0 -0
  30. data/app/assets/javascripts/simple_forum/markitup/sets/default/images/picture.png +0 -0
  31. data/app/assets/javascripts/simple_forum/markitup/sets/default/images/preview.png +0 -0
  32. data/app/assets/javascripts/simple_forum/markitup/sets/default/images/stroke.png +0 -0
  33. data/app/assets/javascripts/simple_forum/markitup/sets/default/set.js +27 -0
  34. data/app/assets/javascripts/simple_forum/markitup/sets/default/style.css +27 -0
  35. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-container.png +0 -0
  36. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor-bbcode.png +0 -0
  37. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor-dotclear.png +0 -0
  38. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor-html.png +0 -0
  39. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor-json.png +0 -0
  40. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor-markdown.png +0 -0
  41. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor-textile.png +0 -0
  42. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor-wiki.png +0 -0
  43. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor-xml.png +0 -0
  44. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/bg-editor.png +0 -0
  45. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/handle.png +0 -0
  46. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/menu.png +0 -0
  47. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/images/submenu.png +0 -0
  48. data/app/assets/javascripts/simple_forum/markitup/skins/markitup/style.css.scss +147 -0
  49. data/app/assets/javascripts/simple_forum/markitup/skins/simple/images/handle.png +0 -0
  50. data/app/assets/javascripts/simple_forum/markitup/skins/simple/images/menu.png +0 -0
  51. data/app/assets/javascripts/simple_forum/markitup/skins/simple/images/submenu.png +0 -0
  52. data/app/assets/javascripts/simple_forum/markitup/skins/simple/style.css +118 -0
  53. data/app/assets/javascripts/simple_forum/markitup/templates/preview.css +5 -0
  54. data/app/assets/javascripts/simple_forum/markitup/templates/preview.html +11 -0
  55. data/app/assets/stylesheets/simple_forum/application.css +13 -0
  56. data/app/assets/stylesheets/simple_forum/base.css +124 -0
  57. data/app/assets/stylesheets/simple_forum/markitup.css +5 -0
  58. data/app/controllers/simple_forum/application_controller.rb +1 -0
  59. data/app/controllers/simple_forum/forums_controller.rb +0 -1
  60. data/app/controllers/simple_forum/posts_controller.rb +5 -5
  61. data/app/controllers/simple_forum/topics_controller.rb +2 -2
  62. data/app/models/simple_forum.rb +0 -1
  63. data/app/models/simple_forum/category.rb +0 -3
  64. data/app/models/simple_forum/forum.rb +0 -3
  65. data/app/models/simple_forum/moderatorship.rb +0 -3
  66. data/app/models/simple_forum/post.rb +0 -3
  67. data/app/models/simple_forum/topic.rb +1 -4
  68. data/app/views/layouts/simple_forum.html.erb +4 -5
  69. data/app/views/simple_forum/forums/index.html.erb +4 -4
  70. data/app/views/simple_forum/forums/show.html.erb +5 -5
  71. data/app/views/simple_forum/posts/edit.html.erb +5 -5
  72. data/app/views/simple_forum/topics/_post.html.erb +2 -2
  73. data/app/views/simple_forum/topics/new.html.erb +3 -3
  74. data/app/views/simple_forum/topics/show.html.erb +9 -16
  75. data/config/routes.rb +11 -36
  76. data/db/migrate/20110330123456_create_simple_forum_forums.rb +35 -0
  77. data/db/migrate/20110330123457_create_simple_forum_topics.rb +30 -0
  78. data/db/migrate/20110330123458_create_simple_forum_posts.rb +31 -0
  79. data/db/migrate/20110330123459_create_simple_forum_categories.rb +19 -0
  80. data/db/migrate/20110330123460_create_simple_forum_moderatorships.rb +17 -0
  81. data/lib/simple_forum.rb +6 -4
  82. data/lib/simple_forum/engine.rb +5 -11
  83. data/lib/simple_forum/version.rb +2 -3
  84. metadata +190 -20
  85. data/Gemfile +0 -18
  86. data/lib/simple_forum/tasks/railties.rake +0 -66
@@ -17,15 +17,12 @@ Install the initializer
17
17
 
18
18
  Edit the initializer located in `config/initializers/simple_forum.rb` to satisfy your needs.
19
19
 
20
- Copy assets & migrations
20
+ Copy migrations
21
21
  rake simple_forum_engine:install
22
-
23
- or rake simple_forum:install if rake simple_forum_engine:install doesn't work(rails version < 3.1)
24
-
22
+
25
23
  Run migrations
26
24
  rake db:migrate
27
25
 
28
-
29
26
  moderator can:
30
27
  - close/open topics
31
28
  - edit posts
data/Rakefile CHANGED
@@ -1,27 +1,32 @@
1
- # encoding: UTF-8
2
- require 'rubygems'
1
+ #!/usr/bin/env rake
3
2
  begin
4
3
  require 'bundler/setup'
5
4
  rescue LoadError
6
5
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
6
  end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
8
14
 
9
- require 'rake'
10
- require 'rake/rdoctask'
11
-
12
- require 'rspec/core'
13
- require 'rspec/core/rake_task'
14
-
15
- RSpec::Core::RakeTask.new(:spec)
16
-
17
- task :default => :spec
18
-
19
- Rake::RDocTask.new(:rdoc) do |rdoc|
15
+ RDoc::Task.new(:rdoc) do |rdoc|
20
16
  rdoc.rdoc_dir = 'rdoc'
21
17
  rdoc.title = 'SimpleForum'
22
- rdoc.options << '--line-numbers' << '--inline-source'
18
+ rdoc.options << '--line-numbers'
23
19
  rdoc.rdoc_files.include('README.rdoc')
24
20
  rdoc.rdoc_files.include('lib/**/*.rb')
25
21
  end
26
22
 
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
27
26
  Bundler::GemHelper.install_tasks
27
+
28
+ require 'rspec/core/rake_task'
29
+ RSpec::Core::RakeTask.new(:spec)
30
+
31
+ # RSpec and Cucumber by default
32
+ task :default => [:spec]
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //=
@@ -0,0 +1,51 @@
1
+ //= require simple_forum/markitup/jquery.markitup.js
2
+ //= require simple_forum/markitup/sets/bbcode/set.js
3
+ //= require_self
4
+
5
+ var post_preview = function() {
6
+ $.ajax({
7
+ type : "GET",
8
+ url : post_preview_path,
9
+ data : $('#new_post_form').serializeArray(),
10
+ success: function(data) {
11
+ $('table.topic-table tr.preview').remove();
12
+ $('table.topic-table').append(data);
13
+ }
14
+ });
15
+ return false;
16
+ };
17
+
18
+ markItUpPostBodySettings = {
19
+ // previewParserPath: '', // path to your BBCode parser
20
+ markupSet: [
21
+ {name:'Bold', key:'B', openWith:'[b]', closeWith:'[/b]'},
22
+ {name:'Italic', key:'I', openWith:'[i]', closeWith:'[/i]'},
23
+ {name:'Underline', key:'U', openWith:'[u]', closeWith:'[/u]'},
24
+ {separator:'---------------' },
25
+ {name:'Picture', key:'P', replaceWith:'[img][![Url]!][/img]'},
26
+ {name:'Link', key:'L', openWith:'[url=[![Url]!]]', closeWith:'[/url]', placeHolder:'Your text to link here...'},
27
+ {separator:'---------------' },
28
+ {name:'Size', key:'S', openWith:'[size=[![Text size]!]]', closeWith:'[/size]',
29
+ dropMenu :[
30
+ {name:'Big', openWith:'[size=50]', closeWith:'[/size]' },
31
+ {name:'Normal', openWith:'[size=25]', closeWith:'[/size]' },
32
+ {name:'Small', openWith:'[size=10]', closeWith:'[/size]' }
33
+ ]},
34
+ {separator:'---------------' },
35
+ {name:'Bulleted list', openWith:'[list]\n', closeWith:'\n[/list]'},
36
+ // {name:'Numeric list', openWith:'[list=[![Starting number]!]]\n', closeWith:'\n[/list]'},
37
+ {name:'List item', openWith:'[*] '},
38
+ {separator:'---------------' },
39
+ {name:'Quotes', openWith:'[quote]', closeWith:'[/quote]'},
40
+ {name:'Code', openWith:'[code]', closeWith:'[/code]'},
41
+ {separator:'---------------' },
42
+ {name:'Clean', className:"clean", replaceWith:function(markitup) {
43
+ return markitup.selection.replace(/\[(.*?)\]/g, "")
44
+ } },
45
+ {name:'Preview', className:"preview", call:'post_preview' }
46
+ ]
47
+ };
48
+
49
+ $(function() {
50
+ $('textarea.markitup.post-body').markItUp(markItUpPostBodySettings);
51
+ });
@@ -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);