1
|
1 |
/** |
|
2 |
* WordPress plugin. |
|
3 |
*/ |
|
4 |
|
|
5 |
(function() { |
|
6 |
var DOM = tinymce.DOM; |
|
7 |
|
|
8 |
tinymce.create('tinymce.plugins.WordPress', { |
|
9 |
mceTout : 0, |
|
10 |
|
|
11 |
init : function(ed, url) { |
|
12 |
var t = this, tbId = ed.getParam('wordpress_adv_toolbar', 'toolbar2'), last = 0, moreHTML, nextpageHTML; |
|
13 |
moreHTML = '<img src="' + url + '/img/trans.gif" class="mceWPmore mceItemNoResize" title="'+ed.getLang('wordpress.wp_more_alt')+'" />'; |
|
14 |
nextpageHTML = '<img src="' + url + '/img/trans.gif" class="mceWPnextpage mceItemNoResize" title="'+ed.getLang('wordpress.wp_page_alt')+'" />'; |
|
15 |
|
|
16 |
if ( getUserSetting('hidetb', '0') == '1' ) |
|
17 |
ed.settings.wordpress_adv_hidden = 0; |
|
18 |
|
|
19 |
// Hides the specified toolbar and resizes the iframe |
|
20 |
ed.onPostRender.add(function() { |
|
21 |
var adv_toolbar = ed.controlManager.get(tbId); |
|
22 |
if ( ed.getParam('wordpress_adv_hidden', 1) && adv_toolbar ) { |
|
23 |
DOM.hide(adv_toolbar.id); |
|
24 |
t._resizeIframe(ed, tbId, 28); |
|
25 |
} |
|
26 |
}); |
|
27 |
|
|
28 |
// Register commands |
|
29 |
ed.addCommand('WP_More', function() { |
|
30 |
ed.execCommand('mceInsertContent', 0, moreHTML); |
|
31 |
}); |
|
32 |
|
|
33 |
ed.addCommand('WP_Page', function() { |
|
34 |
ed.execCommand('mceInsertContent', 0, nextpageHTML); |
|
35 |
}); |
|
36 |
|
|
37 |
ed.addCommand('WP_Help', function() { |
|
38 |
ed.windowManager.open({ |
|
39 |
url : tinymce.baseURL + '/wp-mce-help.php', |
|
40 |
width : 450, |
|
41 |
height : 420, |
|
42 |
inline : 1 |
|
43 |
}); |
|
44 |
}); |
|
45 |
|
|
46 |
ed.addCommand('WP_Adv', function() { |
|
47 |
var cm = ed.controlManager, id = cm.get(tbId).id; |
|
48 |
|
|
49 |
if ( 'undefined' == id ) |
|
50 |
return; |
|
51 |
|
|
52 |
if ( DOM.isHidden(id) ) { |
|
53 |
cm.setActive('wp_adv', 1); |
|
54 |
DOM.show(id); |
|
55 |
t._resizeIframe(ed, tbId, -28); |
|
56 |
ed.settings.wordpress_adv_hidden = 0; |
|
57 |
setUserSetting('hidetb', '1'); |
|
58 |
} else { |
|
59 |
cm.setActive('wp_adv', 0); |
|
60 |
DOM.hide(id); |
|
61 |
t._resizeIframe(ed, tbId, 28); |
|
62 |
ed.settings.wordpress_adv_hidden = 1; |
|
63 |
setUserSetting('hidetb', '0'); |
|
64 |
} |
|
65 |
}); |
|
66 |
|
|
67 |
// Register buttons |
|
68 |
ed.addButton('wp_more', { |
|
69 |
title : 'wordpress.wp_more_desc', |
|
70 |
image : url + '/img/more.gif', |
|
71 |
cmd : 'WP_More' |
|
72 |
}); |
|
73 |
|
|
74 |
ed.addButton('wp_page', { |
|
75 |
title : 'wordpress.wp_page_desc', |
|
76 |
image : url + '/img/page.gif', |
|
77 |
cmd : 'WP_Page' |
|
78 |
}); |
|
79 |
|
|
80 |
ed.addButton('wp_help', { |
|
81 |
title : 'wordpress.wp_help_desc', |
|
82 |
image : url + '/img/help.gif', |
|
83 |
cmd : 'WP_Help' |
|
84 |
}); |
|
85 |
|
|
86 |
ed.addButton('wp_adv', { |
|
87 |
title : 'wordpress.wp_adv_desc', |
|
88 |
image : url + '/img/toolbars.gif', |
|
89 |
cmd : 'WP_Adv' |
|
90 |
}); |
|
91 |
|
|
92 |
// Add Media buttons |
|
93 |
ed.addButton('add_media', { |
|
94 |
title : 'wordpress.add_media', |
|
95 |
image : url + '/img/media.gif', |
|
96 |
onclick : function() { |
|
97 |
tb_show('', tinymce.DOM.get('add_media').href); |
|
98 |
tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); |
|
99 |
} |
|
100 |
}); |
|
101 |
|
|
102 |
ed.addButton('add_image', { |
|
103 |
title : 'wordpress.add_image', |
|
104 |
image : url + '/img/image.gif', |
|
105 |
onclick : function() { |
|
106 |
tb_show('', tinymce.DOM.get('add_image').href); |
|
107 |
tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); |
|
108 |
} |
|
109 |
}); |
|
110 |
|
|
111 |
ed.addButton('add_video', { |
|
112 |
title : 'wordpress.add_video', |
|
113 |
image : url + '/img/video.gif', |
|
114 |
onclick : function() { |
|
115 |
tb_show('', tinymce.DOM.get('add_video').href); |
|
116 |
tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); |
|
117 |
} |
|
118 |
}); |
|
119 |
|
|
120 |
ed.addButton('add_audio', { |
|
121 |
title : 'wordpress.add_audio', |
|
122 |
image : url + '/img/audio.gif', |
|
123 |
onclick : function() { |
|
124 |
tb_show('', tinymce.DOM.get('add_audio').href); |
|
125 |
tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); |
|
126 |
} |
|
127 |
}); |
|
128 |
|
|
129 |
// Add Media buttons to fullscreen |
|
130 |
ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { |
|
131 |
var DOM = tinymce.DOM; |
|
132 |
if ( 'mceFullScreen' != cmd ) return; |
|
133 |
if ( 'mce_fullscreen' != ed.id && DOM.get('add_audio') && DOM.get('add_video') && DOM.get('add_image') && DOM.get('add_media') ) |
|
134 |
ed.settings.theme_advanced_buttons1 += ',|,add_image,add_video,add_audio,add_media'; |
|
135 |
}); |
|
136 |
|
|
137 |
// Add class "alignleft", "alignright" and "aligncenter" when selecting align for images. |
|
138 |
ed.addCommand('JustifyLeft', function() { |
|
139 |
var n = ed.selection.getNode(); |
|
140 |
|
|
141 |
if ( n.nodeName != 'IMG' ) |
|
142 |
ed.editorCommands.mceJustify('JustifyLeft', 'left'); |
|
143 |
else ed.plugins.wordpress.do_align(n, 'alignleft'); |
|
144 |
}); |
|
145 |
|
|
146 |
ed.addCommand('JustifyRight', function() { |
|
147 |
var n = ed.selection.getNode(); |
|
148 |
|
|
149 |
if ( n.nodeName != 'IMG' ) |
|
150 |
ed.editorCommands.mceJustify('JustifyRight', 'right'); |
|
151 |
else ed.plugins.wordpress.do_align(n, 'alignright'); |
|
152 |
}); |
|
153 |
|
|
154 |
ed.addCommand('JustifyCenter', function() { |
|
155 |
var n = ed.selection.getNode(), P = ed.dom.getParent(n, 'p'), DL = ed.dom.getParent(n, 'dl'); |
|
156 |
|
|
157 |
if ( n.nodeName == 'IMG' && ( P || DL ) ) |
|
158 |
ed.plugins.wordpress.do_align(n, 'aligncenter'); |
|
159 |
else ed.editorCommands.mceJustify('JustifyCenter', 'center'); |
|
160 |
}); |
|
161 |
|
|
162 |
// Word count if script is loaded |
|
163 |
if ( 'undefined' != typeof wpWordCount ) { |
|
164 |
ed.onKeyUp.add(function(ed, e) { |
|
165 |
if ( e.keyCode == last ) return; |
|
166 |
if ( 13 == e.keyCode || 8 == last || 46 == last ) wpWordCount.wc( ed.getContent({format : 'raw'}) ); |
|
167 |
last = e.keyCode; |
|
168 |
}); |
|
169 |
}; |
|
170 |
|
|
171 |
ed.onSaveContent.add(function(ed, o) { |
|
172 |
if ( typeof(switchEditors) == 'object' ) { |
|
173 |
if ( ed.isHidden() ) |
|
174 |
o.content = o.element.value; |
|
175 |
else |
|
176 |
o.content = switchEditors.pre_wpautop(o.content); |
|
177 |
} |
|
178 |
}); |
|
179 |
|
|
180 |
/* disable for now |
|
181 |
ed.onBeforeSetContent.add(function(ed, o) { |
|
182 |
o.content = t._setEmbed(o.content); |
|
183 |
}); |
|
184 |
|
|
185 |
ed.onPostProcess.add(function(ed, o) { |
|
186 |
if ( o.get ) |
|
187 |
o.content = t._getEmbed(o.content); |
|
188 |
}); |
|
189 |
*/ |
|
190 |
|
|
191 |
// Add listeners to handle more break |
|
192 |
t._handleMoreBreak(ed, url); |
|
193 |
|
|
194 |
// Add custom shortcuts |
|
195 |
ed.addShortcut('alt+shift+c', ed.getLang('justifycenter_desc'), 'JustifyCenter'); |
|
196 |
ed.addShortcut('alt+shift+r', ed.getLang('justifyright_desc'), 'JustifyRight'); |
|
197 |
ed.addShortcut('alt+shift+l', ed.getLang('justifyleft_desc'), 'JustifyLeft'); |
|
198 |
ed.addShortcut('alt+shift+j', ed.getLang('justifyfull_desc'), 'JustifyFull'); |
|
199 |
ed.addShortcut('alt+shift+q', ed.getLang('blockquote_desc'), 'mceBlockQuote'); |
|
200 |
ed.addShortcut('alt+shift+u', ed.getLang('bullist_desc'), 'InsertUnorderedList'); |
|
201 |
ed.addShortcut('alt+shift+o', ed.getLang('numlist_desc'), 'InsertOrderedList'); |
|
202 |
ed.addShortcut('alt+shift+d', ed.getLang('striketrough_desc'), 'Strikethrough'); |
|
203 |
ed.addShortcut('alt+shift+n', ed.getLang('spellchecker.desc'), 'mceSpellCheck'); |
|
204 |
ed.addShortcut('alt+shift+a', ed.getLang('link_desc'), 'mceLink'); |
|
205 |
ed.addShortcut('alt+shift+s', ed.getLang('unlink_desc'), 'unlink'); |
|
206 |
ed.addShortcut('alt+shift+m', ed.getLang('image_desc'), 'mceImage'); |
|
207 |
ed.addShortcut('alt+shift+g', ed.getLang('fullscreen.desc'), 'mceFullScreen'); |
|
208 |
ed.addShortcut('alt+shift+z', ed.getLang('wp_adv_desc'), 'WP_Adv'); |
|
209 |
ed.addShortcut('alt+shift+h', ed.getLang('help_desc'), 'WP_Help'); |
|
210 |
ed.addShortcut('alt+shift+t', ed.getLang('wp_more_desc'), 'WP_More'); |
|
211 |
ed.addShortcut('alt+shift+p', ed.getLang('wp_page_desc'), 'WP_Page'); |
|
212 |
ed.addShortcut('ctrl+s', ed.getLang('save_desc'), function(){if('function'==typeof autosave)autosave();}); |
|
213 |
|
|
214 |
if ( tinymce.isWebKit ) { |
|
215 |
ed.addShortcut('alt+shift+b', ed.getLang('bold_desc'), 'Bold'); |
|
216 |
ed.addShortcut('alt+shift+i', ed.getLang('italic_desc'), 'Italic'); |
|
217 |
} |
|
218 |
|
|
219 |
ed.onInit.add(function(ed) { |
|
220 |
tinymce.dom.Event.add(ed.getWin(), 'scroll', function(e) { |
|
221 |
ed.plugins.wordpress._hideButtons(); |
|
222 |
}); |
|
223 |
tinymce.dom.Event.add(ed.getBody(), 'dragstart', function(e) { |
|
224 |
ed.plugins.wordpress._hideButtons(); |
|
225 |
}); |
|
226 |
}); |
|
227 |
|
|
228 |
ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { |
|
229 |
ed.plugins.wordpress._hideButtons(); |
|
230 |
}); |
|
231 |
|
|
232 |
ed.onSaveContent.add(function(ed, o) { |
|
233 |
ed.plugins.wordpress._hideButtons(); |
|
234 |
}); |
|
235 |
|
|
236 |
ed.onMouseDown.add(function(ed, e) { |
|
237 |
if ( e.target.nodeName != 'IMG' ) |
|
238 |
ed.plugins.wordpress._hideButtons(); |
|
239 |
}); |
|
240 |
}, |
|
241 |
|
|
242 |
getInfo : function() { |
|
243 |
return { |
|
244 |
longname : 'WordPress Plugin', |
|
245 |
author : 'WordPress', // add Moxiecode? |
|
246 |
authorurl : 'http://wordpress.org', |
|
247 |
infourl : 'http://wordpress.org', |
|
248 |
version : '3.0' |
|
249 |
}; |
|
250 |
}, |
|
251 |
|
|
252 |
// Internal functions |
|
253 |
_setEmbed : function(c) { |
|
254 |
return c.replace(/\[embed\]([\s\S]+?)\[\/embed\][\s\u00a0]*/g, function(a,b){ |
|
255 |
return '<img width="300" height="200" src="' + tinymce.baseURL + '/plugins/wordpress/img/trans.gif" class="wp-oembed mceItemNoResize" alt="'+b+'" title="'+b+'" />'; |
|
256 |
}); |
|
257 |
}, |
|
258 |
|
|
259 |
_getEmbed : function(c) { |
|
260 |
return c.replace(/<img[^>]+>/g, function(a) { |
|
261 |
if ( a.indexOf('class="wp-oembed') != -1 ) { |
|
262 |
var u = a.match(/alt="([^\"]+)"/); |
|
263 |
if ( u[1] ) |
|
264 |
a = '[embed]' + u[1] + '[/embed]'; |
|
265 |
} |
|
266 |
return a; |
|
267 |
}); |
|
268 |
}, |
|
269 |
|
|
270 |
_showButtons : function(n, id) { |
|
271 |
var ed = tinyMCE.activeEditor, p1, p2, vp, DOM = tinymce.DOM, X, Y; |
|
272 |
|
|
273 |
vp = ed.dom.getViewPort(ed.getWin()); |
|
274 |
p1 = DOM.getPos(ed.getContentAreaContainer()); |
|
275 |
p2 = ed.dom.getPos(n); |
|
276 |
|
|
277 |
X = Math.max(p2.x - vp.x, 0) + p1.x; |
|
278 |
Y = Math.max(p2.y - vp.y, 0) + p1.y; |
|
279 |
|
|
280 |
DOM.setStyles(id, { |
|
281 |
'top' : Y+5+'px', |
|
282 |
'left' : X+5+'px', |
|
283 |
'display' : 'block' |
|
284 |
}); |
|
285 |
|
|
286 |
if ( this.mceTout ) |
|
287 |
clearTimeout(this.mceTout); |
|
288 |
|
|
289 |
this.mceTout = setTimeout( function(){ed.plugins.wordpress._hideButtons();}, 5000 ); |
|
290 |
}, |
|
291 |
|
|
292 |
_hideButtons : function() { |
|
293 |
if ( !this.mceTout ) |
|
294 |
return; |
|
295 |
|
|
296 |
if ( document.getElementById('wp_editbtns') ) |
|
297 |
tinymce.DOM.hide('wp_editbtns'); |
|
298 |
|
|
299 |
if ( document.getElementById('wp_gallerybtns') ) |
|
300 |
tinymce.DOM.hide('wp_gallerybtns'); |
|
301 |
|
|
302 |
clearTimeout(this.mceTout); |
|
303 |
this.mceTout = 0; |
|
304 |
}, |
|
305 |
|
|
306 |
do_align : function(n, a) { |
|
307 |
var P, DL, DIV, cls, c, ed = tinyMCE.activeEditor; |
|
308 |
|
|
309 |
if ( /^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className) ) |
|
310 |
return; |
|
311 |
|
|
312 |
P = ed.dom.getParent(n, 'p'); |
|
313 |
DL = ed.dom.getParent(n, 'dl'); |
|
314 |
DIV = ed.dom.getParent(n, 'div'); |
|
315 |
|
|
316 |
if ( DL && DIV ) { |
|
317 |
cls = ed.dom.hasClass(DL, a) ? 'alignnone' : a; |
|
318 |
DL.className = DL.className.replace(/align[^ '"]+\s?/g, ''); |
|
319 |
ed.dom.addClass(DL, cls); |
|
320 |
c = (cls == 'aligncenter') ? ed.dom.addClass(DIV, 'mceIEcenter') : ed.dom.removeClass(DIV, 'mceIEcenter'); |
|
321 |
} else if ( P ) { |
|
322 |
cls = ed.dom.hasClass(n, a) ? 'alignnone' : a; |
|
323 |
n.className = n.className.replace(/align[^ '"]+\s?/g, ''); |
|
324 |
ed.dom.addClass(n, cls); |
|
325 |
if ( cls == 'aligncenter' ) |
|
326 |
ed.dom.setStyle(P, 'textAlign', 'center'); |
|
327 |
else if (P.style && P.style.textAlign == 'center') |
|
328 |
ed.dom.setStyle(P, 'textAlign', ''); |
|
329 |
} |
|
330 |
|
|
331 |
ed.execCommand('mceRepaint'); |
|
332 |
}, |
|
333 |
|
|
334 |
// Resizes the iframe by a relative height value |
|
335 |
_resizeIframe : function(ed, tb_id, dy) { |
|
336 |
var ifr = ed.getContentAreaContainer().firstChild; |
|
337 |
|
|
338 |
DOM.setStyle(ifr, 'height', ifr.clientHeight + dy); // Resize iframe |
|
339 |
ed.theme.deltaHeight += dy; // For resize cookie |
|
340 |
}, |
|
341 |
|
|
342 |
_handleMoreBreak : function(ed, url) { |
|
343 |
var moreHTML, nextpageHTML; |
|
344 |
|
|
345 |
moreHTML = '<img src="' + url + '/img/trans.gif" alt="$1" class="mceWPmore mceItemNoResize" title="'+ed.getLang('wordpress.wp_more_alt')+'" />'; |
|
346 |
nextpageHTML = '<img src="' + url + '/img/trans.gif" class="mceWPnextpage mceItemNoResize" title="'+ed.getLang('wordpress.wp_page_alt')+'" />'; |
|
347 |
|
|
348 |
// Load plugin specific CSS into editor |
|
349 |
ed.onInit.add(function() { |
|
350 |
ed.dom.loadCSS(url + '/css/content.css'); |
|
351 |
}); |
|
352 |
|
|
353 |
// Display morebreak instead if img in element path |
|
354 |
ed.onPostRender.add(function() { |
|
355 |
if (ed.theme.onResolveName) { |
|
356 |
ed.theme.onResolveName.add(function(th, o) { |
|
357 |
if (o.node.nodeName == 'IMG') { |
|
358 |
if ( ed.dom.hasClass(o.node, 'mceWPmore') ) |
|
359 |
o.name = 'wpmore'; |
|
360 |
if ( ed.dom.hasClass(o.node, 'mceWPnextpage') ) |
|
361 |
o.name = 'wppage'; |
|
362 |
} |
|
363 |
|
|
364 |
}); |
|
365 |
} |
|
366 |
}); |
|
367 |
|
|
368 |
// Replace morebreak with images |
|
369 |
ed.onBeforeSetContent.add(function(ed, o) { |
|
370 |
o.content = o.content.replace(/<!--more(.*?)-->/g, moreHTML); |
|
371 |
o.content = o.content.replace(/<!--nextpage-->/g, nextpageHTML); |
|
372 |
}); |
|
373 |
|
|
374 |
// Replace images with morebreak |
|
375 |
ed.onPostProcess.add(function(ed, o) { |
|
376 |
if (o.get) |
|
377 |
o.content = o.content.replace(/<img[^>]+>/g, function(im) { |
|
378 |
if (im.indexOf('class="mceWPmore') !== -1) { |
|
379 |
var m, moretext = (m = im.match(/alt="(.*?)"/)) ? m[1] : ''; |
|
380 |
im = '<!--more'+moretext+'-->'; |
|
381 |
} |
|
382 |
if (im.indexOf('class="mceWPnextpage') !== -1) |
|
383 |
im = '<!--nextpage-->'; |
|
384 |
|
|
385 |
return im; |
|
386 |
}); |
|
387 |
}); |
|
388 |
|
|
389 |
// Set active buttons if user selected pagebreak or more break |
|
390 |
ed.onNodeChange.add(function(ed, cm, n) { |
|
391 |
cm.setActive('wp_page', n.nodeName === 'IMG' && ed.dom.hasClass(n, 'mceWPnextpage')); |
|
392 |
cm.setActive('wp_more', n.nodeName === 'IMG' && ed.dom.hasClass(n, 'mceWPmore')); |
|
393 |
}); |
|
394 |
} |
|
395 |
}); |
|
396 |
|
|
397 |
// Register plugin |
|
398 |
tinymce.PluginManager.add('wordpress', tinymce.plugins.WordPress); |
|
399 |
})(); |