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 )) {
124 var ms = mi.fetch(0);
125 if (ms.contains("|")) {
126 var ar = ms.split("|");
127 for (var i =0 ; i < ar.length;i++) {
128 optvalues.add(ar[i].strip());
130 src = src.substring(ms.length, src.length - ms.length);
137 this.desc = src; // whatever is left
139 // example tags need to have whitespace preserved
140 if (this.title != DocTagTitle.EXAMPLE) {
141 this.desc = this.desc.strip();
152 Find and shift off the title of a tag.
156 private string nibbleTitle (string src) throws DocTagException
158 //GLib.debug("nibbleTitle: %s", src);
161 if(! /^\s*(\S+)\s*(?:\s([\s\S]*))?$/.match_full(src, src.length, 0, 0, out mi) ||
162 mi.get_match_count() < 2) {
163 throw new DocTagException.NO_TITLE("missing title");
167 //GLib.debug("nibbleTitle: regexmatches %d : %s",
168 // mi.get_match_count(),
169 // mi.fetch(1).up());
171 EnumClass enumc = (EnumClass) typeof (DocTagTitle).class_ref ();
173 unowned EnumValue? eval = enumc.get_value_by_name ( "JSDOC_DOC_TAG_TITLE_"+ mi.fetch(1).up());
175 throw new DocTagException.INVALID_TITLE("title not supported ??");
178 this.title = (DocTagTitle) eval.value;
179 return mi.get_match_count() > 2 ? mi.fetch(2) : "";
184 Find and shift off the type of a tag.
185 @requires frame/String.js
189 private string nibbleType(string src)
192 if(! /^\s*\{/.match_all(src, 0, out mi)) {
198 this.balance(src,'{', '}', out start, out stop);
199 //GLib.debug("nibble type: %s %d, %d", src, start,stop);
201 throw new DocTagException.INVALID_TYPE("Malformed comment tag ignored. Tag type requires an opening { and a closing }: ") ;
204 this.type = src.substring(start+1,stop-1).strip();
205 this.type = this.type.replace(",", "|"); // multiples can be separated by , or |
206 return src.substring(stop+1, -1);
213 Find and shift off the name of a tag.
214 @requires frame/String.js
218 private string nibbleName( string in_src) throws DocTagException
222 var src = in_src.strip();
223 //GLib.debug("nibbleName: %s", in_src);
226 if (src.get(0) == '[') {
228 this.balance(src,'[', ']', out start, out stop);
230 throw new DocTagException.INVALID_NAME("Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: ");
233 this.name = src.substring(start+1, stop).strip();
234 this.isOptional = true;
236 src = src.substring(stop+1);
238 // has default value?
239 var nameAndValue = this.name.split("=");
240 if (nameAndValue.length > 1) {
241 var oname = this.name;
242 this.name = nameAndValue[0].strip();
244 this.defaultValue = oname.substring( nameAndValue[0].length + 1 , nameAndValue[0].length + 1 - oname.length); /// what about
246 GLib.debug("got name %s", this.name);
247 return src.substring(stop+1, stop+1-src.length);
249 // not encased with [ ]
253 if (/^(\S+)(?:\s([\s\S]*))?$/.match_full(src, src.length, 0, 0, out mi)) {
254 this.name = mi.fetch(1);
255 GLib.debug("got name %s", this.name);
256 return mi.get_match_count() > 2 ? mi.fetch(2) : "";
264 private void balance(string str, char open, char close, out int start, out int stop) {
267 while (str.get(start) != open) {
268 if (start == str.length) {
276 while (stop < str.length) {
277 if (str.get(stop) == open) balance++;
278 if (str.get(stop) == close) balance--;
279 if (balance == 0) break;
281 if (stop == str.length) {
290 public Json.Array optvalue_as_json_array()
292 var ret = new Json.Array();
293 foreach (var str in this.optvalues ) {
294 ret.add_string_element(str);