JsRender/JsRender.vala
[app.Builder.js] / JsRender / JsRender.vala
1 //<Script type="text/javascript">
2
3 namespace JsRender {
4
5
6 public errordomain Error {
7     INVALID_FORMAT
8 }
9     
10 public abstract class JsRender  : Object {
11     /**
12      * @cfg {Array} doubleStringProps list of properties that can be double quoted.
13      */
14     public GLib.List<string> doubleStringProps;
15     
16     public string id;
17     public string name;   // is the JS name of the file.
18     public string fullname;
19     public string path;  // is the full path to the file.
20     public string parent;  // JS parent.
21     
22     public string title;  // a title.. ?? nickname.. ??? -
23
24     public string permname;
25     public string modOrder;
26     public string xtype;
27
28         
29     public Project.Project project;
30     //Project : false, // link to container project!
31     
32     public Node tree; // the tree of nodes.
33     
34     public GLib.List<JsRender> cn; // child files.. (used by project ... should move code here..)
35
36     public bool hasParent; 
37     
38     public JsRender(Project.Project project, string path) {
39         
40         this.cn = new GLib.List<JsRender>();
41         this.path = path;
42         this.project = project;
43         this.hasParent = false;
44         this.parent = "";
45         this.tree = null;
46         
47         var ar = this.path.split("/");
48             // name is in theory filename without .bjs (or .js eventually...)
49         try {
50             Regex regex = new Regex ("\\.(bjs|js)$");
51
52             this.name = regex.replace(ar[ar.length-1],ar[ar.length-1].length, 0 , "");
53         } catch (Error e) {
54             this.name = "???";
55         }
56         this.fullname = (this.parent.length > 0 ? (this.parent + ".") : "" ) + this.name;
57
58
59         
60     }
61     public static JsRender factory(string xt, Project.Project project, string path)
62     {
63  
64         switch (xt) {
65             case "Gtk":
66                 return new Gtk(project, path);
67             case "Roo":
68                 return new Roo(project, path);
69         }
70                 throw new Error.INVALID_FORMAT("JsRender Factory called with xtype=%s", xt);
71         return null;    
72     }
73
74         public string toJsonString()
75         {
76                 var generator = new Json.Generator ();
77         generator.indent = 4;
78         generator.pretty = true;
79         var node = new Json.Node(Json.NodeType.OBJECT);
80         node.set_object(this.toJsonObject());
81         generator.set_root(node);
82         return generator.to_data(null);
83         }
84         
85     public void save ()
86     {
87          
88         var generator = new Json.Generator ();
89         generator.indent = 4;
90         generator.pretty = true;
91         var node = new Json.Node(Json.NodeType.OBJECT);
92         node.set_object(this.toJsonObject());
93         generator.set_root(node);
94         
95         print("WRITE: " + this.path);// + "\n" + JSON.stringify(write));
96         try {
97             generator.to_file(this.path);
98         } catch(Error e) {
99             print("Save failed");
100         }
101     }
102         
103     public void   saveHTML ()
104     {
105         // NOOP
106     }
107
108     public abstract void loadItems() throws Error;
109     
110     /**
111      *
112      * load from a javascript file.. rather than bjs..
113      * 
114      *
115      */
116      /*
117     _loadItems : function(cb)
118     {
119         // already loaded..
120         if (this.items !== false) {
121             return false;
122         }
123           
124         
125         
126         var tr = new  TokenReader(  { 
127             keepDocs :true, 
128             keepWhite : true,  
129             keepComments : true, 
130             sepIdents : false,
131             collapseWhite : false,
132             filename : args[0],
133             ignoreBadGrammer: true
134         });
135         
136         var str = File.read(this.path);
137         var toks = tr.tokenize(new TextStream(str));  
138         var rf = new JsParser(toks);
139         rf.parse();
140         var cfg = rf.cfg;
141         
142         this.modOrder = cfg.modOrder || '001';
143         this.name = cfg.name.replace(/\.bjs/, ''); // BC!
144         this.parent =  cfg.parent;
145         this.permname =  cfg.permname || '';
146         this.title =  cfg.title || cfg.name;;
147         this.items = cfg.items || []; 
148         //???
149         //this.fixItems(_this, false);
150         cb();
151         return true;    
152             
153     },
154     */
155         /**
156          * accepts:
157          * { success : , failure : , scope : }
158          * 
159          * 
160          * 
161          */
162     /*     
163     void getTree ( o ) {
164         print("File.getTree tree called on base object?!?!");
165     }
166 */
167     public Json.Object toJsonObject ()
168     {
169         
170         
171         var ret = new Json.Object();
172         //ret.set_string_member("id", this.id); // not relivant..
173         ret.set_string_member("name", this.name);
174         ret.set_string_member("parent", this.parent == null ? "" : this.parent);
175         ret.set_string_member("title", this.title == null ? "" : this.title);
176         ret.set_string_member("path", this.path);
177         //ret.set_string_member("items", this.items);
178         ret.set_string_member("permname", this.permname  == null ? "" : this.permname);
179         ret.set_string_member("modOrder", this.modOrder  == null ? "" : this.modOrder);
180                 var ar = new Json.Array();
181                 ar.add_object_element(this.tree.toJsonObject());
182                 ret.set_array_member("items", ar);
183                 
184         return ret;
185     }
186     
187     
188
189     public string getTitle ()
190     {
191         if (this.title.length > 0) {
192             return this.title;
193         }
194         var a = this.path.split("/");
195         return a[a.length-1];
196     }
197     public string getTitleTip()
198     {
199         if (this.title.length > 0) {
200             return "<b>" + this.title + "</b> " + this.path;
201         }
202         return this.path;
203     }
204     /*
205         sortCn: function()
206         {
207             this.cn.sort(function(a,b) {
208                 return a.path > b.path;// ? 1 : -1;
209             });
210         },
211     */
212         // should be in palete provider really..
213         
214     public string guessName(Node ar) // turns the object into full name.
215     {
216          // eg. xns: Roo, xtype: XXX -> Roo.xxx
217         if (!ar.hasXnsType()) {
218            return "";
219         }
220         
221         return ar.get("|xns") + "." + ar.get("|xtype");
222                           
223                             
224     }
225          
226         
227     /*
228     copyTo: function(path, cb)
229     {
230         var _this = this;
231         this.loadItems(function() {
232             
233             _this.path = path;
234             cb();
235         });
236         
237     },
238     */
239     
240     /**
241      * 
242      * munge JSON tree into Javascript code.
243      *
244      * NOTE - needs a deep copy of original tree, before starting..
245      *     - so that it does not modify current..
246      * 
247      * FIXME: + or / prefixes to properties hide it from renderer.
248      * FIXME: '*props' - not supported by this.. ?? - upto rendering code..
249      * FIXME: needs to understand what properties might be translatable (eg. double quotes)
250      * 
251      * @arg {object} obj the object or array to munge..
252      * @arg {boolean} isListener - is the array being sent a listener..
253      * @arg {string} pad - the padding to indent with. 
254      */
255     
256     public string mungeToString(string pad)
257     {
258         return this.tree.mungeToString(false, pad, this.doubleStringProps);
259         
260     }
261      abstract  public string toSource() ;
262       
263 }
264     
265
266
267
268
269
270
271
272