/[webpac2]/Webpacus/root/editor/quicktags.js
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /Webpacus/root/editor/quicktags.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 175 - (hide annotations)
Sun Nov 27 04:45:56 2005 UTC (18 years, 5 months ago) by dpavlin
File MIME type: application/javascript
File size: 7655 byte(s)
 r11186@llin:  dpavlin | 2005-11-27 05:48:19 +0100
 first try at implementing decent text-only editor, based on quicktags
 added tab support and dynamic creation of toolbars

1 dpavlin 175 /*
2     original version from WordPress
3     by Alex King http://www.alexking.org/
4    
5     tax fix and conversion to Prototype by Dobrica Pavlinusic <dpavlin@rot13.org>
6     */
7    
8    
9     var edButtons = new Array();
10     var edLinks = new Array();
11     var edOpenTags = new Array();
12     var edCanvas = null;
13    
14     function edButton(id, display, tagStart, tagEnd, access, open) {
15     Logger.debug('edButton '+id+': '+display);
16     this.id = id; // used to name the toolbar button
17     this.display = display; // label on button
18     this.tagStart = tagStart; // open tag
19     this.tagEnd = tagEnd; // close tag
20     this.access = access; // access key
21     this.open = open; // set to -1 if tag does not need to be closed
22     }
23    
24     edButtons[edButtons.length] =
25     new edButton('ed_div'
26     ,'div'
27     ,'<div>\n'
28     ,'\n</div>\n'
29     ,'d'
30     );
31    
32     edButtons[edButtons.length] =
33     new edButton('ed_span'
34     ,'span'
35     ,'<span>'
36     ,'</span>'
37     ,'s'
38     );
39    
40     edButtons[edButtons.length] =
41     new edButton('ed_strong'
42     ,'str'
43     ,'<strong>'
44     ,'</strong>'
45     ,'b'
46     );
47    
48     edButtons[edButtons.length] =
49     new edButton('ed_em'
50     ,'em'
51     ,'<em>'
52     ,'</em>'
53     ,'i'
54     );
55    
56     /*
57     edButtons[edButtons.length] =
58     new edButton('ed_pre'
59     ,'code'
60     ,'<code>'
61     ,'</code>'
62     ,'c'
63     );
64    
65     edButtons[edButtons.length] =
66     new edButton('ed_block'
67     ,'b-quote'
68     ,'<blockquote>'
69     ,'</blockquote>'
70     ,'q'
71     );
72     */
73    
74     edButtons[edButtons.length] =
75     new edButton('ed_link'
76     ,'link'
77     ,''
78     ,'</a>'
79     ,'a'
80     ); // special case
81    
82     function edLink() {
83     this.display = '';
84     this.URL = '';
85     this.newWin = 0;
86     }
87    
88     edButtons[edButtons.length] =
89     new edButton('ed_table'
90     ,'table'
91     ,'\n<table>\n'
92     ,'\n</table>\n'
93     ,'t'
94     );
95    
96     edButtons[edButtons.length] =
97     new edButton('ed_tr'
98     ,'tr'
99     ,'<tr>'
100     ,'</tr>'
101     ,'r'
102     );
103    
104     edButtons[edButtons.length] =
105     new edButton('ed_td'
106     ,'td'
107     ,'<td>'
108     ,'</td>'
109     ,'e'
110     );
111    
112     function edShowButton(button, i) {
113     if (button.id == 'ed_img') {
114     return('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage(edCanvas);" value="' + button.display + '" />');
115     }
116     else if (button.id == 'ed_link') {
117     return('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(edCanvas, ' + i + ');" value="' + button.display + '" />');
118     }
119     else {
120     return('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(edCanvas, ' + i + ');" value="' + button.display + '" />');
121     }
122     }
123    
124     function edAddTag(button) {
125     if (edButtons[button].tagEnd != '') {
126     edOpenTags[edOpenTags.length] = button;
127     $( edButtons[button].id ).value = '/' + $( edButtons[button].id ).value;
128     }
129     }
130    
131     function edRemoveTag(button) {
132     for (i = 0; i < edOpenTags.length; i++) {
133     if (edOpenTags[i] == button) {
134     edOpenTags.splice(i, 1);
135     $( edButtons[button].id ).value = $( edButtons[button].id ).value.replace('/', '');
136     }
137     }
138     }
139    
140     function edCheckOpenTags(button) {
141     var tag = 0;
142     for (i = 0; i < edOpenTags.length; i++) {
143     if (edOpenTags[i] == button) {
144     tag++;
145     }
146     }
147     if (tag > 0) {
148     return true; // tag found
149     }
150     else {
151     return false; // tag not found
152     }
153     }
154    
155     function edCloseAllTags() {
156     var count = edOpenTags.length;
157     for (o = 0; o < count; o++) {
158     edInsertTag(edCanvas, edOpenTags[edOpenTags.length - 1]);
159     }
160     }
161    
162     var edActiveToolbar = {};
163    
164     function edToolbar( name ) {
165    
166     if (edActiveToolbar.name) return false;
167    
168     var toolbar_div = name + '_toolbar';
169    
170     Logger.info('edToolbar of '+name+' is '+toolbar_div);
171    
172     var div = $( toolbar_div );
173     if (! div) {
174     Logger.error('div not found');
175     return false;
176     }
177    
178     var toolbar = '';
179    
180     for (i = 0; i < edButtons.length; i++) {
181     toolbar += edShowButton(edButtons[i], i);
182     }
183     toolbar += '&nbsp;&nbsp';
184     toolbar += '<input type="button" id="ed_close" class="ed_button" onclick="edCloseAllTags();" title="Close all open tags" value="Close Tags" />';
185    
186     div.innerHTML = toolbar;
187     Logger.debug('before: '+edActiveToolbar.name);
188     edActiveToolbar.name = 1;
189     Logger.debug('after: '+edActiveToolbar.name);
190     }
191    
192     // insertion code
193    
194     function edInsertTag(myField, i) {
195    
196     //IE support
197     if (document.selection) {
198     myField.focus();
199     sel = document.selection.createRange();
200     if (sel.text.length > 0) {
201     sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd;
202     }
203     else {
204     if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
205     sel.text = edButtons[i].tagStart;
206     edAddTag(i);
207     }
208     else {
209     sel.text = edButtons[i].tagEnd;
210     edRemoveTag(i);
211     }
212     }
213     myField.focus();
214     }
215     //MOZILLA/NETSCAPE support
216     else if (myField.selectionStart || myField.selectionStart == '0') {
217     var startPos = myField.selectionStart;
218     var endPos = myField.selectionEnd;
219     var cursorPos = endPos;
220     var scrollTop = myField.scrollTop;
221    
222     if (startPos != endPos) {
223     myField.value = myField.value.substring(0, startPos)
224     + edButtons[i].tagStart
225     + myField.value.substring(startPos, endPos)
226     + edButtons[i].tagEnd
227     + myField.value.substring(endPos, myField.value.length);
228     cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
229     }
230     else {
231     if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
232     myField.value = myField.value.substring(0, startPos)
233     + edButtons[i].tagStart
234     + myField.value.substring(endPos, myField.value.length);
235     edAddTag(i);
236     cursorPos = startPos + edButtons[i].tagStart.length;
237     }
238     else {
239     myField.value = myField.value.substring(0, startPos)
240     + edButtons[i].tagEnd
241     + myField.value.substring(endPos, myField.value.length);
242     edRemoveTag(i);
243     cursorPos = startPos + edButtons[i].tagEnd.length;
244     }
245     }
246     myField.focus();
247     myField.selectionStart = cursorPos;
248     myField.selectionEnd = cursorPos;
249     myField.scrollTop = scrollTop;
250     }
251     else {
252     if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
253     myField.value += edButtons[i].tagStart;
254     edAddTag(i);
255     }
256     else {
257     myField.value += edButtons[i].tagEnd;
258     edRemoveTag(i);
259     }
260     myField.focus();
261     }
262     }
263    
264     function edInsertContent(myField, myValue) {
265     //IE support
266     if (document.selection) {
267     myField.focus();
268     sel = document.selection.createRange();
269     sel.text = myValue;
270     myField.focus();
271     }
272     //MOZILLA/NETSCAPE support
273     else if (myField.selectionStart || myField.selectionStart == '0') {
274     var startPos = myField.selectionStart;
275     var endPos = myField.selectionEnd;
276     myField.value = myField.value.substring(0, startPos)
277     + myValue
278     + myField.value.substring(endPos, myField.value.length);
279     myField.focus();
280     myField.selectionStart = startPos + myValue.length;
281     myField.selectionEnd = startPos + myValue.length;
282     } else {
283     myField.value += myValue;
284     myField.focus();
285     }
286     }
287    
288     function edInsertLink(myField, i, defaultValue) {
289     if (!defaultValue) {
290     defaultValue = 'http://';
291     }
292     if (!edCheckOpenTags(i)) {
293     var URL = prompt('Enter the URL' ,defaultValue);
294     if (URL) {
295     edButtons[i].tagStart = '<a href="' + URL + '">';
296     edInsertTag(myField, i);
297     }
298     }
299     else {
300     edInsertTag(myField, i);
301     }
302     }
303    
304     /* additional methods on textarea */
305    
306     /*
307     onkeydown="return edTab(event);"
308     */
309     function edTab(event) {
310     var e = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
311     if (e == 9) {
312     edInsertContent(edCanvas, '\t');
313     return false;
314     }
315     return true;
316     }
317    
318     /*
319     onfocus="return edFocus('template_content');"
320     */
321     function edFocus( name ) {
322     Logger.info('edFocus '+name);
323     edCanvas = $( name );
324     if (! edCanvas) Logger.error("can't find "+name);
325     edToolbar( name );
326     return false;
327     }
328    
329     /*
330     onblur="return edBlur();"
331     */
332     function edBlur() {
333     Logger.info('edBlur');
334     edChanvas = null;
335     return false;
336     }
337    
338     /*
339     call this function for cleanup of toolbar and other
340     temporary data.
341     */
342     function edKill( name ) {
343     Logger.info('edKill '+name);
344     edActiveToolbar.name = null;
345     }

  ViewVC Help
Powered by ViewVC 1.1.26