package org.develnext.jphp.genapi; import org.develnext.jphp.core.common.TokenizeGrammarUtils; import java.util.*; public class DocAnnotations { protected final String text; protected String description; protected Map<String, Parameter> parameters; public DocAnnotations(String docComment) { this.text = docComment; parameters = new LinkedHashMap<String, Parameter>(); parse(); } protected int parseParameter(String source, int offset) { String name = null; int valueOffset = 0; for(int i = offset; i < source.length() + 1; i++) { char ch = i < source.length() ? source.charAt(i) : '\0'; char prev_ch = i < 1 ? '\0' : source.charAt(i - 1); if (name == null && TokenizeGrammarUtils.isSpace(ch)) { name = source.substring(offset, i); valueOffset = i + 1; } if (ch == '\0' || (ch == '@' && TokenizeGrammarUtils.isNewline(prev_ch))) { if (name != null) { String value = source.substring(valueOffset, i); Parameter parameter = parameters.get(name.toLowerCase()); if (parameter == null) parameters.put(name.toLowerCase(), parameter = new Parameter()); parameter.addValue(value); } return i - 1; } } return source.length() - 1; } protected void parse(){ int len = text.length(); for(int i = 0; i < len; i++) { char ch = text.charAt(i); char prev_ch = i < 1 ? '\0' : text.charAt(i - 1); if (ch == '@' && (TokenizeGrammarUtils.isNewline(prev_ch) || i == 0)) { if (description == null) { description = i == 0 ? "" : text.substring(0, i - 1); } i = parseParameter(text, i + 1); } } } public String getDescription() { return description; } public boolean hasParameter(String name) { return parameters.containsKey(name.toLowerCase()); } public Parameter getParameter(String name) { return parameters.get(name.toLowerCase()); } public class Parameter { protected List<String> values; public Parameter() { values = new ArrayList<String>(); } public String addValue(String value) { values.add(value); return value; } public Collection<String> values() { return values; } public String value() { return values.get(0); } } }