refinerycms-wymeditor 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. data/.gitignore +88 -0
  2. data/app/assets/images/wymeditor/skins/refinery/arrow_redo.png +0 -0
  3. data/app/assets/images/wymeditor/skins/refinery/arrow_undo.png +0 -0
  4. data/app/assets/images/wymeditor/skins/refinery/eye.png +0 -0
  5. data/app/assets/images/wymeditor/skins/refinery/html5/article.png +0 -0
  6. data/app/assets/images/wymeditor/skins/refinery/html5/aside.png +0 -0
  7. data/app/assets/images/wymeditor/skins/refinery/html5/blockquote.png +0 -0
  8. data/app/assets/images/wymeditor/skins/refinery/html5/command.png +0 -0
  9. data/app/assets/images/wymeditor/skins/refinery/html5/details.png +0 -0
  10. data/app/assets/images/wymeditor/skins/refinery/html5/figcaption.png +0 -0
  11. data/app/assets/images/wymeditor/skins/refinery/html5/figure.png +0 -0
  12. data/app/assets/images/wymeditor/skins/refinery/html5/footer.png +0 -0
  13. data/app/assets/images/wymeditor/skins/refinery/html5/h1.png +0 -0
  14. data/app/assets/images/wymeditor/skins/refinery/html5/h2.png +0 -0
  15. data/app/assets/images/wymeditor/skins/refinery/html5/h3.png +0 -0
  16. data/app/assets/images/wymeditor/skins/refinery/html5/h4.png +0 -0
  17. data/app/assets/images/wymeditor/skins/refinery/html5/h5.png +0 -0
  18. data/app/assets/images/wymeditor/skins/refinery/html5/h6.png +0 -0
  19. data/app/assets/images/wymeditor/skins/refinery/html5/header.png +0 -0
  20. data/app/assets/images/wymeditor/skins/refinery/html5/hgroup.png +0 -0
  21. data/app/assets/images/wymeditor/skins/refinery/html5/mark.png +0 -0
  22. data/app/assets/images/wymeditor/skins/refinery/html5/meter.png +0 -0
  23. data/app/assets/images/wymeditor/skins/refinery/html5/nav.png +0 -0
  24. data/app/assets/images/wymeditor/skins/refinery/html5/p.png +0 -0
  25. data/app/assets/images/wymeditor/skins/refinery/html5/pre.png +0 -0
  26. data/app/assets/images/wymeditor/skins/refinery/html5/progress.png +0 -0
  27. data/app/assets/images/wymeditor/skins/refinery/html5/readme.md +1 -0
  28. data/app/assets/images/wymeditor/skins/refinery/html5/rp.png +0 -0
  29. data/app/assets/images/wymeditor/skins/refinery/html5/rt.png +0 -0
  30. data/app/assets/images/wymeditor/skins/refinery/html5/ruby.png +0 -0
  31. data/app/assets/images/wymeditor/skins/refinery/html5/section.png +0 -0
  32. data/app/assets/images/wymeditor/skins/refinery/html5/summary.png +0 -0
  33. data/app/assets/images/wymeditor/skins/refinery/html5/time.png +0 -0
  34. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-blockquote.png +0 -0
  35. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-h1.png +0 -0
  36. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-h2.png +0 -0
  37. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-h3.png +0 -0
  38. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-h4.png +0 -0
  39. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-h5.png +0 -0
  40. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-h6.png +0 -0
  41. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-p.png +0 -0
  42. data/app/assets/images/wymeditor/skins/refinery/iframe/lbl-pre.png +0 -0
  43. data/app/assets/images/wymeditor/skins/refinery/link_add.png +0 -0
  44. data/app/assets/images/wymeditor/skins/refinery/link_break.png +0 -0
  45. data/app/assets/images/wymeditor/skins/refinery/page_code.png +0 -0
  46. data/app/assets/images/wymeditor/skins/refinery/page_paste.png +0 -0
  47. data/app/assets/images/wymeditor/skins/refinery/photo_add.png +0 -0
  48. data/app/assets/images/wymeditor/skins/refinery/right.png +0 -0
  49. data/app/assets/images/wymeditor/skins/refinery/style.png +0 -0
  50. data/app/assets/images/wymeditor/skins/refinery/table_add.png +0 -0
  51. data/app/assets/images/wymeditor/skins/refinery/text_align_center.png +0 -0
  52. data/app/assets/images/wymeditor/skins/refinery/text_align_justify.png +0 -0
  53. data/app/assets/images/wymeditor/skins/refinery/text_align_left.png +0 -0
  54. data/app/assets/images/wymeditor/skins/refinery/text_align_right.png +0 -0
  55. data/app/assets/images/wymeditor/skins/refinery/text_bold.png +0 -0
  56. data/app/assets/images/wymeditor/skins/refinery/text_heading_1.png +0 -0
  57. data/app/assets/images/wymeditor/skins/refinery/text_heading_2.png +0 -0
  58. data/app/assets/images/wymeditor/skins/refinery/text_heading_3.png +0 -0
  59. data/app/assets/images/wymeditor/skins/refinery/text_heading_4.png +0 -0
  60. data/app/assets/images/wymeditor/skins/refinery/text_heading_5.png +0 -0
  61. data/app/assets/images/wymeditor/skins/refinery/text_heading_6.png +0 -0
  62. data/app/assets/images/wymeditor/skins/refinery/text_indent.png +0 -0
  63. data/app/assets/images/wymeditor/skins/refinery/text_indent_remove.png +0 -0
  64. data/app/assets/images/wymeditor/skins/refinery/text_italic.png +0 -0
  65. data/app/assets/images/wymeditor/skins/refinery/text_list_bullets.png +0 -0
  66. data/app/assets/images/wymeditor/skins/refinery/text_list_numbers.png +0 -0
  67. data/app/assets/images/wymeditor/skins/refinery/text_paragraph.png +0 -0
  68. data/app/assets/images/wymeditor/skins/refinery/text_strikethrough.png +0 -0
  69. data/app/assets/images/wymeditor/skins/refinery/text_subscript.png +0 -0
  70. data/app/assets/images/wymeditor/skins/refinery/text_superscript.png +0 -0
  71. data/app/assets/images/wymeditor/skins/refinery/text_underline.png +0 -0
  72. data/app/assets/images/wymeditor/skins/wymeditor_icon.png +0 -0
  73. data/app/assets/javascripts/refinery/boot_wym.js.erb +289 -0
  74. data/app/assets/javascripts/refinery/wymeditor.js +37 -0
  75. data/app/assets/javascripts/wymeditor/browsers/ie.js.erb +224 -0
  76. data/app/assets/javascripts/wymeditor/browsers/mozilla.js.erb +293 -0
  77. data/app/assets/javascripts/wymeditor/browsers/opera.js.erb +123 -0
  78. data/app/assets/javascripts/wymeditor/browsers/webkit.js.erb +284 -0
  79. data/app/assets/javascripts/wymeditor/classes.js.erb +1577 -0
  80. data/app/assets/javascripts/wymeditor/functions.js.erb +218 -0
  81. data/app/assets/javascripts/wymeditor/lang/bg.js +57 -0
  82. data/app/assets/javascripts/wymeditor/lang/ca.js +45 -0
  83. data/app/assets/javascripts/wymeditor/lang/cs.js +58 -0
  84. data/app/assets/javascripts/wymeditor/lang/da.js +48 -0
  85. data/app/assets/javascripts/wymeditor/lang/de.js +45 -0
  86. data/app/assets/javascripts/wymeditor/lang/en.js +57 -0
  87. data/app/assets/javascripts/wymeditor/lang/es.js +58 -0
  88. data/app/assets/javascripts/wymeditor/lang/fa.js +46 -0
  89. data/app/assets/javascripts/wymeditor/lang/fi.js +57 -0
  90. data/app/assets/javascripts/wymeditor/lang/fr.js +57 -0
  91. data/app/assets/javascripts/wymeditor/lang/he.js +45 -0
  92. data/app/assets/javascripts/wymeditor/lang/hu.js +45 -0
  93. data/app/assets/javascripts/wymeditor/lang/it.js +48 -0
  94. data/app/assets/javascripts/wymeditor/lang/ja.js +47 -0
  95. data/app/assets/javascripts/wymeditor/lang/lv.js +47 -0
  96. data/app/assets/javascripts/wymeditor/lang/nb.js +48 -0
  97. data/app/assets/javascripts/wymeditor/lang/nl.js +47 -0
  98. data/app/assets/javascripts/wymeditor/lang/nn.js +45 -0
  99. data/app/assets/javascripts/wymeditor/lang/pl.js +45 -0
  100. data/app/assets/javascripts/wymeditor/lang/pt-BR.js +58 -0
  101. data/app/assets/javascripts/wymeditor/lang/pt.js +45 -0
  102. data/app/assets/javascripts/wymeditor/lang/rs.js +47 -0
  103. data/app/assets/javascripts/wymeditor/lang/ru.js +56 -0
  104. data/app/assets/javascripts/wymeditor/lang/sk.js +56 -0
  105. data/app/assets/javascripts/wymeditor/lang/sl.js +47 -0
  106. data/app/assets/javascripts/wymeditor/lang/sv.js +45 -0
  107. data/app/assets/javascripts/wymeditor/lang/tr.js +45 -0
  108. data/app/assets/javascripts/wymeditor/lang/vi.js +47 -0
  109. data/app/assets/javascripts/wymeditor/lang/zh_cn.js +47 -0
  110. data/app/assets/javascripts/wymeditor/prototypes.js.erb +1106 -0
  111. data/app/assets/javascripts/wymeditor/setup.js.erb +622 -0
  112. data/app/assets/javascripts/wymeditor/skins/refinery/skin.js +48 -0
  113. data/app/assets/javascripts/wymeditor/validators.js.erb +776 -0
  114. data/app/assets/stylesheets/theme.css.scss +36 -0
  115. data/app/assets/stylesheets/wymeditor/skins/refinery/skin.css.scss +530 -0
  116. data/app/assets/stylesheets/wymeditor/skins/refinery/wymiframe.css.scss +156 -0
  117. data/app/assets/stylesheets/wymeditor.css.scss +0 -0
  118. data/app/controllers/refinery/wymeditor_controller.rb +9 -0
  119. data/app/views/refinery/wymiframe.html.erb +14 -0
  120. data/config/initializers/refinery/wymeditor.rb.erb +4 -0
  121. data/lib/refinery/wymeditor/configuration.rb +10 -0
  122. data/lib/refinery/wymeditor/engine.rb +30 -0
  123. data/lib/refinery/wymeditor.rb +12 -0
  124. data/public/wymeditor/GPL-license.txt +278 -0
  125. data/public/wymeditor/MIT-license.txt +20 -0
  126. data/public/wymeditor/README +35 -0
  127. data/readme.md +96 -0
  128. data/refinerycms-wymeditor.gemspec +17 -0
  129. metadata +173 -0
@@ -0,0 +1,224 @@
1
+ /*
2
+ * WYMeditor : what you see is What You Mean web-based editor
3
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
4
+ * Dual licensed under the MIT (MIT-license.txt)
5
+ * and GPL (GPL-license.txt) licenses.
6
+ *
7
+ * For further information visit:
8
+ * http://www.wymeditor.org/
9
+ *
10
+ * File Name:
11
+ * jquery.wymeditor.explorer.js
12
+ * MSIE specific class and functions.
13
+ * See the documentation for more info.
14
+ *
15
+ * File Authors:
16
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
17
+ * Bermi Ferrer (wymeditor a-t bermi dotorg)
18
+ * Frédéric Palluel-Lafleur (fpalluel a-t gmail dotcom)
19
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
20
+ */WYMeditor.WymClassExplorer = function(wym) {
21
+ this._wym = wym;
22
+ this._class = "className";
23
+ this._newLine = "\r\n";
24
+ };
25
+
26
+ WYMeditor.WymClassExplorer.prototype.format_block = function(selected) {
27
+
28
+ //'this' should be the wymeditor instance.
29
+ var wym = this;
30
+ var container = selected || wym.selected() || $(wym._iframe).contents().find('body').get(0);
31
+ var name = container.tagName.toLowerCase();
32
+
33
+ //fix forbidden main containers
34
+ if($.inArray(name, ['strong', 'b', 'em', 'i', 'sub', 'sup', 'a']) > -1) {
35
+ name = container.parentNode.tagName.toLowerCase();
36
+ }
37
+
38
+ if(name == WYMeditor.BODY) {
39
+ wym._selected_image = null;
40
+ $(wym._iframe).contents().find('.selected_by_wym').removeClass('selected_by_wym');
41
+ wym._exec(WYMeditor.FORMAT_BLOCK, "<" + WYMeditor.P + ">");
42
+ }
43
+ };
44
+
45
+ WYMeditor.WymClassExplorer.prototype.initIframe = function(iframe) {
46
+
47
+ //This function is executed twice, though it is called once!
48
+ //But MSIE needs that, otherwise designMode won't work.
49
+ //Weird.
50
+
51
+ this._iframe = iframe;
52
+ this._doc = iframe.contentWindow.document;
53
+
54
+ //add css rules from options
55
+ var styles = this._doc.styleSheets[0];
56
+ var aCss = eval(this._options.editorStyles);
57
+
58
+ this.addCssRules(this._doc, aCss);
59
+
60
+ this._doc.title = this._wym._index;
61
+
62
+ //set the text direction
63
+ $('html', this._doc).attr('dir', this._options.direction);
64
+
65
+ // Add class to say this is Internet Explorer
66
+ $('html', this._doc).addClass('ie');
67
+
68
+ //init html value
69
+ $(this._doc.body).html(this._wym._html);
70
+
71
+ //handle events
72
+ var wym = this;
73
+
74
+ this._doc.body.onfocus = function()
75
+ {wym._doc.designMode = "on"; wym._doc = iframe.contentWindow.document;};
76
+ this._doc.onbeforedeactivate = function() {wym.saveCaret();};
77
+ this._doc.onkeyup = function() {
78
+ wym.saveCaret();
79
+ wym.keyup();
80
+ };
81
+ this._doc.onclick = function() {wym.saveCaret();};
82
+
83
+ this._doc.body.onbeforepaste = function() {
84
+ wym._iframe.contentWindow.event.returnValue = false;
85
+ };
86
+
87
+ this._doc.body.onpaste = function() {
88
+ wym._iframe.contentWindow.event.returnValue = false;
89
+ // Trident doesn't need to intercept the paste as it can access the clipboard easily.
90
+ wym.paste(window.clipboardData.getData("Text"));
91
+ };
92
+
93
+ //callback can't be executed twice, so we check
94
+ if(this._initialized) {
95
+
96
+ //pre-bind functions
97
+ if($.isFunction(this._options.preBind)) this._options.preBind(this);
98
+
99
+ //bind external events
100
+ this._wym.bindEvents();
101
+
102
+ //post-init functions
103
+ if($.isFunction(this._options.postInit)) this._options.postInit(this);
104
+
105
+ //add event listeners to doc elements, e.g. images
106
+ this.listen();
107
+ }
108
+
109
+ this._initialized = true;
110
+
111
+ //init designMode
112
+ this._doc.designMode="on";
113
+ try{
114
+ // (bermi's note) noticed when running unit tests on IE6
115
+ // Is this really needed, it trigger an unexisting property on IE6
116
+ this._doc = iframe.contentWindow.document;
117
+ }catch(e){}
118
+ };
119
+
120
+ WYMeditor.WymClassExplorer.prototype._exec = function(cmd,param) {
121
+
122
+ var wym = this;
123
+
124
+ switch(cmd) {
125
+ case WYMeditor.INDENT: case WYMeditor.OUTDENT:
126
+ var container = wym.findUp(wym.container(), WYMeditor.LI);
127
+ if(container) {
128
+ var ancestor = container.parentNode.parentNode;
129
+ if(container.parentNode.childNodes.length > 1 || $.inArray(ancestor.tagName.toLowerCase(), [WYMeditor.OL, WYMeditor.UL]) > -1) {
130
+ wym._doc.execCommand(cmd);
131
+ }
132
+ }
133
+ break;
134
+ default:
135
+ if(param) {
136
+ wym._doc.execCommand(cmd,false,param);
137
+ }
138
+ else {
139
+ wym._doc.execCommand(cmd);
140
+ }
141
+ break;
142
+ }
143
+
144
+ };
145
+
146
+ WYMeditor.WymClassExplorer.prototype.selected = function() {
147
+ var caretPos = this._iframe.contentWindow.document.caretPos;
148
+ if(caretPos != null && caretPos.parentElement != undefined) {
149
+ return(caretPos.parentElement());
150
+ }
151
+ };
152
+
153
+ WYMeditor.WymClassExplorer.prototype.saveCaret = function() {
154
+ this._doc.caretPos = this._doc.selection.createRange();
155
+ };
156
+
157
+ WYMeditor.WymClassExplorer.prototype.addCssRule = function(styles, oCss) {
158
+ styles.addRule(oCss.name, oCss.css);
159
+ };
160
+
161
+ WYMeditor.WymClassExplorer.prototype.insert = function(html) {
162
+ // Get the current selection
163
+ var range = this._doc.selection.createRange();
164
+
165
+ // Check if the current selection is inside the editor
166
+ if ( $(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
167
+ try {
168
+ // Overwrite selection with provided html
169
+ range.pasteHTML(html);
170
+ } catch (e) { }
171
+ } else {
172
+ // Fall back to the internal paste function if there's no selection
173
+ this.paste(html);
174
+ }
175
+ };
176
+
177
+ WYMeditor.WymClassExplorer.prototype.wrap = function(left, right) {
178
+
179
+ // Get the current selection
180
+ var range = this._doc.selection.createRange();
181
+
182
+ // Check if the current selection is inside the editor
183
+ if ( $(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
184
+ try {
185
+ // Overwrite selection with provided html
186
+ range.pasteHTML(left + range.text + right);
187
+ } catch (e) { }
188
+ }
189
+ };
190
+
191
+ WYMeditor.WymClassExplorer.prototype.unwrap = function() {
192
+
193
+ // Get the current selection
194
+ var range = this._doc.selection.createRange();
195
+
196
+ // Check if the current selection is inside the editor
197
+ if ( $(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
198
+ try {
199
+ // Unwrap selection
200
+ var text = range.text;
201
+ this._exec( 'Cut' );
202
+ range.pasteHTML( text );
203
+ } catch (e) { }
204
+ }
205
+ };
206
+
207
+ //keyup handler
208
+ WYMeditor.WymClassExplorer.prototype.keyup = function(e) {
209
+
210
+ (wym = this)._selected_image = null;
211
+ $(wym._iframe).contents().find('.selected_by_wym').removeClass('selected_by_wym');
212
+ wym.format_block();
213
+ };
214
+
215
+ WYMeditor.WymClassExplorer.prototype.setFocusToNode = function(node, toStart) {
216
+ (wym = this)._iframe.contentWindow.focus();
217
+ var range = wym._doc.selection.createRange();
218
+ toStart = toStart ? true : false;
219
+
220
+ range.moveToElementText(node);
221
+ range.collapse(toStart);
222
+ range.select();
223
+ node.focus();
224
+ };
@@ -0,0 +1,293 @@
1
+ /*
2
+ * WYMeditor : what you see is What You Mean web-based editor
3
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
4
+ * Dual licensed under the MIT (MIT-license.txt)
5
+ * and GPL (GPL-license.txt) licenses.
6
+ *
7
+ * For further information visit:
8
+ * http://www.wymeditor.org/
9
+ *
10
+ * File Name:
11
+ * jquery.wymeditor.mozilla.js
12
+ * Gecko specific class and functions.
13
+ * See the documentation for more info.
14
+ *
15
+ * File Authors:
16
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
17
+ * Volker Mische (vmx a-t gmx dotde)
18
+ * Bermi Ferrer (wymeditor a-t bermi dotorg)
19
+ * Frédéric Palluel-Lafleur (fpalluel a-t gmail dotcom)
20
+ */
21
+
22
+ WYMeditor.WymClassMozilla = function(wym) {
23
+
24
+ this._wym = wym;
25
+ this._class = "class";
26
+ this._newLine = "\n";
27
+ };
28
+
29
+ WYMeditor.WymClassMozilla.prototype.initIframe = function(iframe) {
30
+
31
+ var wym = this;
32
+
33
+ this._iframe = iframe;
34
+ this._doc = iframe.contentDocument;
35
+
36
+ //add css rules from options
37
+
38
+ var styles = this._doc.styleSheets[0];
39
+ var aCss = eval(this._options.editorStyles);
40
+
41
+ this.addCssRules(this._doc, aCss);
42
+
43
+ this._doc.title = this._wym._index;
44
+
45
+ //set the text direction
46
+ $('html', this._doc).attr('dir', this._options.direction);
47
+
48
+ //add error class to body if the containing iframe has an error class
49
+ $('.fieldWithErrors iframe').contents().find('body').addClass('fieldWithErrors');
50
+
51
+ //init html value
52
+ this.html(this._wym._html);
53
+
54
+ //init designMode
55
+ this.enableDesignMode();
56
+
57
+ //pre-bind functions
58
+ if($.isFunction(this._options.preBind)) this._options.preBind(this);
59
+
60
+ //bind external events
61
+ this._wym.bindEvents();
62
+
63
+ //bind editor keydown events
64
+ $(this._doc).bind("keydown", this.keydown);
65
+
66
+ //bind editor keyup events
67
+ $(this._doc).bind("keyup", this.keyup);
68
+
69
+ //bind editor paste events
70
+ $(this._doc).bind("paste", this.intercept_paste);
71
+
72
+ //bind editor focus events (used to reset designmode - Gecko bug)
73
+ $(this._doc).bind("focus", function (){
74
+ // Fix scope
75
+ wym.enableDesignMode.call(wym);
76
+ });
77
+
78
+ //post-init functions
79
+ if($.isFunction(this._options.postInit)) this._options.postInit(this);
80
+
81
+ //add event listeners to doc elements, e.g. images
82
+ this.listen();
83
+ };
84
+
85
+ /* @name html
86
+ * @description Get/Set the html value
87
+ */
88
+ WYMeditor.WymClassMozilla.prototype.html = function(html) {
89
+
90
+ if(typeof html === 'string') {
91
+
92
+ //disable designMode
93
+ try { this._doc.designMode = "off"; } catch(e) { };
94
+
95
+ //replace em by i and strong by bold
96
+ //(designMode issue)
97
+ html = html.replace(/<em(\b[^>]*)>/gi, "<i$1>")
98
+ .replace(/<\/em>/gi, "</i>")
99
+ .replace(/<strong(\b[^>]*)>/gi, "<b$1>")
100
+ .replace(/<\/strong>/gi, "</b>");
101
+
102
+ //update the html body
103
+ $(this._doc.body).html(html);
104
+
105
+ //re-init designMode
106
+ this.enableDesignMode();
107
+ }
108
+ else {
109
+ return($(this._doc.body).html());
110
+ }
111
+ };
112
+
113
+ WYMeditor.WymClassMozilla.prototype._exec = function(cmd,param) {
114
+
115
+ if(!this.selected()) return(false);
116
+
117
+ switch(cmd) {
118
+
119
+ case WYMeditor.INDENT: case WYMeditor.OUTDENT:
120
+ var focusNode = this.selected();
121
+ var sel = this._iframe.contentWindow.getSelection();
122
+ var anchorNode = sel.anchorNode;
123
+ if(anchorNode.nodeName == "#text") {
124
+ anchorNode = anchorNode.parentNode;
125
+ }
126
+
127
+ focusNode = this.findUp(focusNode, WYMeditor.BLOCKS);
128
+ anchorNode = this.findUp(anchorNode, WYMeditor.BLOCKS);
129
+
130
+ if(focusNode && focusNode == anchorNode && focusNode.tagName.toLowerCase() == WYMeditor.LI) {
131
+ var ancestor = focusNode.parentNode.parentNode;
132
+
133
+ if(focusNode.parentNode.childNodes.length > 1 || $.inArray(ancestor.tagName.toLowerCase(), [WYMeditor.OL, WYMeditor.UL]) > -1) {
134
+ this._doc.execCommand(cmd,'',null);
135
+ }
136
+ }
137
+ break;
138
+
139
+ default:
140
+ if(param) this._doc.execCommand(cmd,'',param);
141
+ else this._doc.execCommand(cmd,'',null);
142
+ }
143
+
144
+ //set to P if parent = BODY
145
+ var container = this.selected();
146
+ if(container.tagName.toLowerCase() == WYMeditor.BODY) {
147
+ this._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
148
+ }
149
+ };
150
+
151
+
152
+
153
+ /* @name selected
154
+ * @description Returns the selected container
155
+ */
156
+ WYMeditor.WymClassMozilla.prototype.selected = function(upgrade_text_nodes) {
157
+
158
+ if (upgrade_text_nodes == null || upgrade_text_nodes.toString() != "true") { upgrade_text_nodes = false; }
159
+ var sel = this._iframe.contentWindow.getSelection();
160
+ var node = sel.focusNode;
161
+ if(node) {
162
+ if(node.nodeName == "#text"){
163
+ if (upgrade_text_nodes && sel.toString().length > 0) {
164
+ actual_node = null;
165
+ parent_node = sel.focusNode.parentNode;
166
+ if (parent_node != null) {
167
+ for (i=0;i<parent_node.childNodes.length;i++){
168
+ child_node = parent_node.childNodes[i];
169
+ if (child_node.nodeName != "#text" && child_node.innerHTML == sel.toString()){
170
+ actual_node = child_node;
171
+ }
172
+ }
173
+ }
174
+
175
+ if (actual_node == null) {
176
+ return this.switchTo(sel, 'span');
177
+ } else {
178
+ return actual_node;
179
+ }
180
+ }
181
+ else {
182
+ return node.parentNode;
183
+ }
184
+ }
185
+ else {
186
+ return(node);
187
+ }
188
+ }
189
+ else {
190
+ return(null);
191
+ }
192
+ };
193
+
194
+ WYMeditor.WymClassMozilla.prototype.addCssRule = function(styles, oCss) {
195
+ styles.insertRule(oCss.name + " {" + oCss.css + "}", styles.cssRules.length);
196
+ };
197
+
198
+
199
+ //keydown handler, mainly used for keyboard shortcuts
200
+ WYMeditor.WymClassMozilla.prototype.keydown = function(e) {
201
+
202
+ //'this' is the doc
203
+ var wym = WYMeditor.INSTANCES[this.title];
204
+
205
+ if(e.ctrlKey){
206
+ if(e.keyCode == 66){
207
+ //CTRL+b => STRONG
208
+ wym._exec(WYMeditor.BOLD);
209
+ return false;
210
+ }
211
+ if(e.keyCode == 73){
212
+ //CTRL+i => EMPHASIS
213
+ wym._exec(WYMeditor.ITALIC);
214
+ return false;
215
+ }
216
+ }
217
+ else if(e.keyCode == 13) {
218
+ if(!e.shiftKey){
219
+ //fix PRE bug #73
220
+ container = wym.selected();
221
+ if(container && container.tagName.toLowerCase() == WYMeditor.PRE) {
222
+ e.preventDefault();
223
+ wym.insert('<p></p>');
224
+ }
225
+ }
226
+ }
227
+ };
228
+
229
+ //keyup handler, mainly used for cleanups
230
+ WYMeditor.WymClassMozilla.prototype.keyup = function(e) {
231
+
232
+ //'this' is the doc
233
+ if ((wym = WYMeditor.INSTANCES[this.title]) != null)
234
+ {
235
+ wym._selected_image = null;
236
+ $(wym._iframe).contents().find('.selected_by_wym').removeClass('selected_by_wym');
237
+ var container = null;
238
+
239
+ if(e.keyCode == 13 && !e.shiftKey) {
240
+ //RETURN key - cleanup <br><br> between paragraphs
241
+ $(wym._doc.body).children(WYMeditor.BR).remove();
242
+
243
+ //fix PRE bug #73
244
+ if((container = wym.selected()) && container.tagName.toLowerCase() == WYMeditor.PRE) {
245
+ wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); //create P after PRE
246
+ }
247
+ }
248
+ else if(($.inArray(e.keyCode, [8, 17, 46, 224]) == -1) && !e.metaKey && !e.ctrlKey) {
249
+ //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND
250
+ //text nodes replaced by P
251
+ wym.format_block();
252
+ }
253
+ }
254
+ };
255
+
256
+ WYMeditor.WymClassMozilla.prototype.enableDesignMode = function() {
257
+ if(this._doc.designMode == "off") {
258
+ try {
259
+ this._doc.designMode = "on";
260
+ this._doc.execCommand("styleWithCSS", '', false);
261
+ }
262
+ catch(e) { }
263
+ }
264
+ };
265
+
266
+ WYMeditor.WymClassMozilla.prototype.openBlockTag = function(tag, attributes)
267
+ {
268
+ var attributes = this.validator.getValidTagAttributes(tag, attributes);
269
+
270
+ // Handle Mozilla styled spans
271
+ if(tag == 'span' && attributes.style) {
272
+ var new_tag = this.getTagForStyle(attributes.style);
273
+ if(new_tag){
274
+ this._tag_stack.pop();
275
+ var tag = new_tag;
276
+ this._tag_stack.push(new_tag);
277
+ attributes.style = '';
278
+ } else {
279
+ return;
280
+ }
281
+ }
282
+
283
+ this.output += this.helper.tag(tag, attributes, true);
284
+ };
285
+
286
+ WYMeditor.WymClassMozilla.prototype.getTagForStyle = function(style) {
287
+
288
+ if(/bold/.test(style)) return 'strong';
289
+ if(/italic/.test(style)) return 'em';
290
+ if(/sub/.test(style)) return 'sub';
291
+ if(/super/.test(style)) return 'super';
292
+ return false;
293
+ };
@@ -0,0 +1,123 @@
1
+ /*
2
+ * WYMeditor : what you see is What You Mean web-based editor
3
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
4
+ * Dual licensed under the MIT (MIT-license.txt)
5
+ * and GPL (GPL-license.txt) licenses.
6
+ *
7
+ * For further information visit:
8
+ * http://www.wymeditor.org/
9
+ *
10
+ * File Name:
11
+ * jquery.wymeditor.opera.js
12
+ * Opera specific class and functions.
13
+ * See the documentation for more info.
14
+ *
15
+ * File Authors:
16
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
17
+ */
18
+
19
+ WYMeditor.WymClassOpera = function(wym) {
20
+
21
+ this._wym = wym;
22
+ this._class = "class";
23
+ this._newLine = "\r\n";
24
+ };
25
+
26
+ WYMeditor.WymClassOpera.prototype.initIframe = function(iframe) {
27
+
28
+ this._iframe = iframe;
29
+ this._doc = iframe.contentWindow.document;
30
+
31
+ //add css rules from options
32
+ var styles = this._doc.styleSheets[0];
33
+ var aCss = eval(this._options.editorStyles);
34
+
35
+ this.addCssRules(this._doc, aCss);
36
+
37
+ this._doc.title = this._wym._index;
38
+
39
+ //set the text direction
40
+ $('html', this._doc).attr('dir', this._options.direction);
41
+
42
+ //init designMode
43
+ this._doc.designMode = "on";
44
+
45
+ //init html value
46
+ this.html(this._wym._html);
47
+
48
+ //pre-bind functions
49
+ if($.isFunction(this._options.preBind)) this._options.preBind(this);
50
+
51
+ //bind external events
52
+ this._wym.bindEvents();
53
+
54
+ //bind editor keydown events
55
+ $(this._doc).bind("keydown", this.keydown);
56
+
57
+ //bind editor events
58
+ $(this._doc).bind("keyup", this.keyup);
59
+
60
+ // bind paste events for when this is supported.
61
+ $(this._doc).bind("paste", this.intercept_paste);
62
+
63
+ //post-init functions
64
+ if($.isFunction(this._options.postInit)) this._options.postInit(this);
65
+
66
+ //add event listeners to doc elements, e.g. images
67
+ this.listen();
68
+ };
69
+
70
+ WYMeditor.WymClassOpera.prototype._exec = function(cmd,param) {
71
+ if(param) this._doc.execCommand(cmd,false,param);
72
+ else this._doc.execCommand(cmd);
73
+ };
74
+
75
+ WYMeditor.WymClassOpera.prototype.selected = function() {
76
+ var sel=this._iframe.contentWindow.getSelection();
77
+ var node=sel.focusNode;
78
+ if(node) {
79
+ if(node.nodeName=="#text") {
80
+ return(node.parentNode);
81
+ }
82
+ else {
83
+ return(node);
84
+ }
85
+ } else {
86
+ return(null);
87
+ }
88
+ };
89
+
90
+ WYMeditor.WymClassOpera.prototype.addCssRule = function(styles, oCss) {
91
+ styles.insertRule(oCss.name + " {" + oCss.css + "}", styles.cssRules.length);
92
+ };
93
+
94
+ //keydown handler
95
+ WYMeditor.WymClassOpera.prototype.keydown = function(e) {
96
+
97
+ //'this' is the doc
98
+ var wym = WYMeditor.INSTANCES[this.title];
99
+ var sel = wym._iframe.contentWindow.getSelection();
100
+ startNode = sel.getRangeAt(0).startContainer;
101
+
102
+ //Get a P instead of no container
103
+ if(!$(startNode).parentsOrSelf(WYMeditor.MAIN_CONTAINERS.join(","))[0]
104
+ && !$(startNode).parentsOrSelf('li')
105
+ && e.keyCode != WYMeditor.KEY.ENTER
106
+ && e.keyCode != WYMeditor.KEY.LEFT
107
+ && e.keyCode != WYMeditor.KEY.UP
108
+ && e.keyCode != WYMeditor.KEY.RIGHT
109
+ && e.keyCode != WYMeditor.KEY.DOWN
110
+ && e.keyCode != WYMeditor.KEY.BACKSPACE
111
+ && e.keyCode != WYMeditor.KEY.DELETE)
112
+ wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
113
+
114
+ };
115
+
116
+ //keyup handler
117
+ WYMeditor.WymClassOpera.prototype.keyup = function(e) {
118
+
119
+ //'this' is the doc
120
+ var wym = WYMeditor.INSTANCES[this.title];
121
+ wym._selected_image = null;
122
+ $(wym._iframe).contents().find('.selected_by_wym').removeClass('selected_by_wym');
123
+ };