source: trunk/plugins/Equation/equation.js @ 999

Last change on this file since 999 was 999, checked in by ray, 11 years ago

#1195 Allow to specify an external url to load a plugin from

  • Property svn:keywords set to LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
File size: 6.4 KB
Line 
1/*------------------------------------------*\
2 AsciiMathML Formula Editor for Xinha
3 _______________________
4 
5 Based on AsciiMathML by Peter Jipsen http://www.chapman.edu/~jipsen
6 
7 Including a table with math symbols for easy input modified from CharacterMap for ASCIIMathML by Peter Jipsen
8 HTMLSource based on HTMLArea XTD 1.5 (http://mosforge.net/projects/htmlarea3xtd/) modified by Holger Hees
9 Original Author - Bernhard Pfeifer novocaine@gmx.net
10 
11 See readme.txt
12 
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU Lesser General Public License as published by
15 the Free Software Foundation; either version 2.1 of the License, or (at
16 your option) any later version.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 Lesser General Public License (at http://www.gnu.org/licenses/lgpl.html)
22 for more details.
23
24 Raimund Meyer  11/23/2006
25     
26\*------------------------------------------*/
27function Equation(editor) {
28        this.editor = editor;
29
30        var cfg = editor.config;
31        var self = this;
32       
33
34        // register the toolbar buttons provided by this plugin
35        cfg.registerButton({
36        id       : "equation",
37        tooltip  : this._lc("Formula Editor"),
38        image    : editor.imgURL("equation.gif", "Equation"),
39        textMode : false,
40        action   : function(editor, id) {
41                        self.buttonPress(editor, id);
42                }
43        });
44        cfg.addToolbarElement("equation", "inserthorizontalrule", -1);
45       
46        mathcolor = cfg.Equation.mathcolor;       // change it to "" (to inherit) or any other color
47        mathfontfamily = cfg.Equation.mathfontfamily;
48       
49        this.enabled = !Xinha.is_ie;
50       
51        if (this.enabled)
52        {       
53                this.onBeforeSubmit = this.onBeforeUnload = function () {self.unParse();};
54        }
55       
56        if (typeof  AMprocessNode != "function")
57        {
58                Xinha._loadback(Xinha.getPluginDir('Equation') + "/ASCIIMathML.js", function () { translate(); });
59        }
60}
61
62Xinha.Config.prototype.Equation =
63{
64        "mathcolor" : "black",       // change it to "" (to inherit) or any other color
65        "mathfontfamily" : "serif" // change to "" to inherit (works in IE)
66                               // or another family (e.g. "arial")
67}
68
69Equation._pluginInfo = {
70        name          : "ASCIIMathML Formula Editor",
71        version       : "2.3 (2008-01-26)",
72        developer     : "Raimund Meyer",
73        developer_url : "http://xinha.raimundmeyer.de",
74        c_owner       : "",
75        sponsor       : "",
76        sponsor_url   : "",
77        license       : "GNU/LGPL"
78};
79
80Equation.prototype._lc = function(string)
81{
82    return Xinha._lc(string, 'Equation');
83};
84Equation.prototype.onGenerate = function()
85{
86        this.parse();
87};
88
89// avoid changing the formula in the editor
90Equation.prototype.onKeyPress = function(ev)
91{
92        if (this.enabled)
93        {
94                e = this.editor;
95                var span = e._getFirstAncestor(e.getSelection(),['span']);
96                if ( span && span.className == "AM" )
97                {
98                        if (
99                                ev.keyCode == 8 || // delete
100                                ev.keyCode == 46 ||// backspace
101                                ev.charCode            // all character keys
102                        )
103                        { // stop event
104                                Xinha._stopEvent(ev);
105                                return true;
106                        }
107                }
108        }
109        return false;
110}
111Equation.prototype.onBeforeMode = function( mode )
112{
113        if (this.enabled && mode == 'textmode')
114        {
115                this.unParse();
116        }
117}
118Equation.prototype.onMode = function( mode )
119{
120        if (this.enabled && mode == 'wysiwyg')
121        {
122                this.parse();
123        }
124}
125
126Equation.prototype.parse = function ()
127{
128        if (this.enabled)
129        {
130                var doc = this.editor._doc;
131                var spans = doc.getElementsByTagName("span");
132                for (var i = 0;i<spans.length;i++)
133                {
134                        var node = spans[i];
135                        if (node.className != 'AM') continue;
136                        if (node.innerHTML.indexOf(this.editor.cc) != -1) // avoid problems with source code position auxiliary character
137                        {
138                                node.innerHTML = node.innerHTML.replace(this.editor.cc,'');
139                                node.parentNode.insertBefore(doc.createTextNode(this.editor.cc), node);
140                        }
141                        node.title = node.innerHTML;
142                        // FF3 strict source document policy:
143                        // the span is taken from the editor document, processed in the plugin document, and put back in the editor
144                        var clone = node.cloneNode(true);
145                        try {
146                                document.adoptNode(clone);
147                        } catch (e) {}
148                        AMprocessNode(clone, false);
149                        try {
150                                doc.adoptNode(clone);
151                        } catch (e) {}
152                        node.parentNode.replaceChild(clone, node);
153                        // insert space before and after the protected node, otherwide one could get stuck
154                        clone.parentNode.insertBefore(doc.createTextNode(String.fromCharCode(32)),clone);
155                        clone.parentNode.insertBefore(doc.createTextNode(String.fromCharCode(32)),clone.nextSibling);
156                }
157        }
158}
159
160Equation.prototype.unParse = function ()
161{
162        var doc = this.editor._doc;
163        var spans = doc.getElementsByTagName("span");
164        for (var i = 0;i<spans.length;i++)
165        {
166                var node = spans[i];
167                if (node.className.indexOf ("AM") == -1 || node.getElementsByTagName("math").length == 0) continue;
168                var formula = node.getAttribute("title");
169                node.innerHTML = formula;
170                node.setAttribute("title", null);
171        }
172}
173
174Equation.prototype.buttonPress = function()
175{
176        var self = this;
177        var editor = this.editor;
178        var args = {};
179       
180        args['editor'] = editor;
181       
182        var parent = editor._getFirstAncestor(editor.getSelection(),['span']);
183        if (parent)
184        {
185                args["editedNode"] = parent;
186        }
187        Dialog(Xinha.getPluginDir('Equation') + "/popups/dialog.html", function(params) {
188                                self.insert(params);
189                        }, args);
190};
191
192Equation.prototype.insert = function (param)
193{
194        if (typeof param["formula"] != "undefined")
195        {
196                var formula = (param["formula"] != '') ? param["formula"].replace(/^`?(.*)`?$/m,"`$1`") : '';
197
198                if (param["editedNode"] && (param["editedNode"].tagName.toLowerCase() == 'span'))
199                {
200                        var span = param["editedNode"];
201                        if (formula != '')
202                        {
203                                span.innerHTML = formula;
204                                if (this.enabled) span.title = formula;
205                        }
206                        else
207                        {
208                                span.parentNode.removeChild(span);
209                        }
210                       
211                }
212                else if (!param["editedNode"] && formula != '')
213                {
214                        if (this.enabled)
215                        {                       
216                                var span = document.createElement('span');
217                                span.className = 'AM';
218                                this.editor.insertNodeAtSelection(span);
219                                span.innerHTML = formula;
220                                span.title = formula;
221                        }
222                        else
223                        {
224                                this.editor.insertHTML('<span class="AM">'+formula+'</span>');
225                        }
226                }
227
228                if (this.enabled) this.parse();//AMprocessNode(this.editor._doc.body, false);
229        }
230}
Note: See TracBrowser for help on using the repository browser.