5 public enum DocTagTitle
50 errordomain DocTagException {
58 public class DocTag : Object
61 public DocTagTitle title = DocTagTitle.NO_VALUE;
62 public string type = ""; // eg.. boolean / string etc..., may be xxxx|bbbb - eg. optional types
63 public string name = ""; // eg. "title" << a property name etc...
64 public bool isOptional = false;
65 public string defaultValue = "";
66 public string desc = "";
67 public Gee.ArrayList<string> optvalues;
68 public string memberOf = ""; // set by add addMember..
70 public string asString()
72 return "DocTag: title=%s name=%s type=%s desc=%s".printf(
73 this.title.to_string(),
84 public DocTag (string in_src)
87 GLib.debug("Parsing Tag: %s", in_src);
92 this.optvalues = new Gee.ArrayList<string>();
97 src = this.nibbleTitle(src);
99 src = this.nibbleType(src);
102 // only some tags are allowed to have names.
104 this.title == DocTagTitle.PARAM ||
105 this.title == DocTagTitle.PROPERTY ||
106 this.title == DocTagTitle.CFG) { // @config is deprecated
107 src = this.nibbleName(src);
110 catch(DocTagException e) {
111 GLib.debug("Failed to parse tag: '%s' = error = %s", in_src, e.message);
112 // only throw if in 'strict'??
117 // if type == @cfg, and matches (|....|...)
123 if (this.title == DocTagTitle.CFG && /^\([^)]+\)/.match_all(src, 0, out mi )) {
125 var ms = mi.fetch(0);
126 GLib.debug("Got Opt list: %s", ms);
128 ms = ms.substring(1,ms.length-2);
129 if (ms.contains("|")) {
130 var ar = ms.split("|");
131 for (var i =0 ; i < ar.length;i++) {
132 optvalues.add(ar[i].strip());
134 src = src.substring(ms.length, src.length - ms.length);
141 this.desc = src; // whatever is left
143 // example tags need to have whitespace preserved
144 if (this.title != DocTagTitle.EXAMPLE) {
145 this.desc = this.desc.strip();
156 Find and shift off the title of a tag.
160 private string nibbleTitle (string src) throws DocTagException
162 //GLib.debug("nibbleTitle: %s", src);
165 if(! /^\s*(\S+)\s*(?:\s([\s\S]*))?$/.match_full(src, src.length, 0, 0, out mi) ||
166 mi.get_match_count() < 2) {
167 throw new DocTagException.NO_TITLE("missing title");
171 //GLib.debug("nibbleTitle: regexmatches %d : %s",
172 // mi.get_match_count(),
173 // mi.fetch(1).up());
175 EnumClass enumc = (EnumClass) typeof (DocTagTitle).class_ref ();
177 unowned EnumValue? eval = enumc.get_value_by_name ( "JSDOC_DOC_TAG_TITLE_"+ mi.fetch(1).up());
179 throw new DocTagException.INVALID_TITLE("title not supported ??");
182 this.title = (DocTagTitle) eval.value;
183 return mi.get_match_count() > 2 ? mi.fetch(2) : "";
188 Find and shift off the type of a tag.
189 @requires frame/String.js
193 private string nibbleType(string src)
196 if(! /^\s*\{/.match_all(src, 0, out mi)) {
202 this.balance(src,'{', '}', out start, out stop);
203 //GLib.debug("nibble type: %s %d, %d", src, start,stop);
205 throw new DocTagException.INVALID_TYPE("Malformed comment tag ignored. Tag type requires an opening { and a closing }: ") ;
208 this.type = src.substring(start+1,stop-1).strip();
209 this.type = this.type.replace(",", "|"); // multiples can be separated by , or |
210 return src.substring(stop+1, -1);
217 Find and shift off the name of a tag.
218 @requires frame/String.js
222 private string nibbleName( string in_src) throws DocTagException
226 var src = in_src.strip();
227 //GLib.debug("nibbleName: %s", in_src);
230 if (src.get(0) == '[') {
232 this.balance(src,'[', ']', out start, out stop);
234 throw new DocTagException.INVALID_NAME("Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: ");
237 this.name = src.substring(start+1, stop).strip();
238 this.isOptional = true;
240 src = src.substring(stop+1);
242 // has default value?
243 var nameAndValue = this.name.split("=");
244 if (nameAndValue.length > 1) {
245 var oname = this.name;
246 this.name = nameAndValue[0].strip();
248 this.defaultValue = oname.substring( nameAndValue[0].length + 1 , nameAndValue[0].length + 1 - oname.length); /// what about
250 GLib.debug("got name %s", this.name);
251 return src.substring(stop+1, stop+1-src.length);
253 // not encased with [ ]
257 if (/^(\S+)(?:\s([\s\S]*))?$/.match_full(src, src.length, 0, 0, out mi)) {
258 this.name = mi.fetch(1);
259 GLib.debug("got name %s", this.name);
260 return mi.get_match_count() > 2 ? mi.fetch(2) : "";
268 private void balance(string str, char open, char close, out int start, out int stop) {
271 while (str.get(start) != open) {
272 if (start == str.length) {
280 while (stop < str.length) {
281 if (str.get(stop) == open) balance++;
282 if (str.get(stop) == close) balance--;
283 if (balance == 0) break;
285 if (stop == str.length) {
294 public Json.Array optvalue_as_json_array()
296 var ret = new Json.Array();
297 foreach (var str in this.optvalues ) {
298 ret.add_string_element(str);