merged from HEAD (TCL html::author documentation bug)
diff --git a/tcl/plugins/org.eclipse.dltk.tcl.ui/src/org/eclipse/dltk/tcl/internal/ui/documentation/TclCommentDocumentationProvider.java b/tcl/plugins/org.eclipse.dltk.tcl.ui/src/org/eclipse/dltk/tcl/internal/ui/documentation/TclCommentDocumentationProvider.java
index 20de05a..70edf65 100644
--- a/tcl/plugins/org.eclipse.dltk.tcl.ui/src/org/eclipse/dltk/tcl/internal/ui/documentation/TclCommentDocumentationProvider.java
+++ b/tcl/plugins/org.eclipse.dltk.tcl.ui/src/org/eclipse/dltk/tcl/internal/ui/documentation/TclCommentDocumentationProvider.java
@@ -11,6 +11,8 @@
import java.io.Reader;
import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
import org.eclipse.dltk.core.IBuffer;
import org.eclipse.dltk.core.IMember;
@@ -18,17 +20,20 @@
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.ui.documentation.IScriptDocumentationProvider;
+import org.eclipse.dltk.utils.TextUtils;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
-public class TclCommentDocumentationProvider extends
- ScriptDocumentationProvider implements IScriptDocumentationProvider {
+public class TclCommentDocumentationProvider implements
+ IScriptDocumentationProvider {
+
+ private static final char COMMENT_SIGN = '#';
protected String getLine(Document d, int line) throws BadLocationException {
return d.get(d.getLineOffset(line), d.getLineLength(line));
}
- protected String getHeaderComment(IMember member) {
+ protected List getHeaderComment(IMember member) {
// if (member instanceof IField) {
// return null;
// }
@@ -55,77 +60,100 @@
contents = member.getSourceModule().getSource();
}
- String result = "";
-
Document doc = new Document(contents);
try {
int line = doc.getLineOfOffset(start);
- line--;
- if (line < 0)
- return null;
- boolean emptyEnd = true;
- while (line >= 0) {
- String curLine = getLine(doc, line);
- String curLineTrimmed = curLine.trim();
- if ((curLineTrimmed.length() == 0 && emptyEnd)
- || curLineTrimmed.startsWith("#")) {
- if (curLineTrimmed.length() != 0)
- emptyEnd = false;
- result = curLine + result;
- } else
- break;
-
- line--;
+ --line; // look on the previous line
+ if (line >= 0) {
+ final List result = new ArrayList();
+ do {
+ final String curLine = getLine(doc, line).trim();
+ if (curLine.length() > 0
+ && curLine.charAt(0) == COMMENT_SIGN) {
+ result.add(0, curLine);
+ } else if (!(curLine.length() == 0 && result.isEmpty())) {
+ // skip empty lines between comment and code only
+ break;
+ }
+ } while (--line >= 0);
+ return result;
}
} catch (BadLocationException e) {
- return null;
+ // ignore
}
- return result;
-
} catch (ModelException e) {
+ // ignore
}
return null;
}
public Reader getInfo(IMember member, boolean lookIntoParents,
boolean lookIntoExternal) {
- String header = getHeaderComment(member);
- return new StringReader(convertToHTML(header));
+ final List header = getHeaderComment(member);
+ if (header != null && !header.isEmpty()) {
+ return new StringReader(convertToHTML(header));
+ } else {
+ return null;
+ }
}
- protected String convertToHTML(String header) {
- StringBuffer result = new StringBuffer();
- // result.append("<p>\n");
- Document d = new Document(header);
- for (int line = 0;; line++) {
- try {
- String str = getLine(d, line).trim();
- if (str == null)
- break;
- while (str.length() > 0 && str.startsWith("#"))
- str = str.substring(1);
- while (str.length() > 0 && str.endsWith("#"))
- str = str.substring(0, str.length() - 1);
- if (str.length() == 0)
- result.append("<p>");
- else {
- if (str.trim().matches("\\w*:")) {
- result.append("<h4>");
- result.append(str);
- result.append("</h4>");
- } else
- result.append(str + "<br>");
- }
- } catch (BadLocationException e) {
- break;
+ protected String convertToHTML(List header) {
+ final StringBuffer result = new StringBuffer();
+ boolean paragraphStarted = false;
+ for (int line = 0; line < header.size(); line++) {
+ String str = (String) header.get(line);
+ int begin = 0;
+ int end = str.length();
+ while (begin < end && str.charAt(begin) == COMMENT_SIGN) {
+ ++begin;
}
-
+ while (begin < end && Character.isWhitespace(str.charAt(begin))) {
+ ++begin;
+ }
+ while (begin < end && str.charAt(end - 1) == COMMENT_SIGN) {
+ --end;
+ }
+ while (begin < end && Character.isWhitespace(str.charAt(end - 1))) {
+ --end;
+ }
+ if (begin == end) {
+ if (paragraphStarted) {
+ result.append(P_END);
+ paragraphStarted = false;
+ }
+ } else {
+ str = str.substring(begin, end);
+ if (str.matches("\\w+(\\s+\\w+)*:")) { //$NON-NLS-1$
+ if (paragraphStarted) {
+ result.append(P_END);
+ paragraphStarted = false;
+ }
+ result.append("<h4>"); //$NON-NLS-1$
+ result.append(TextUtils.escapeHTML(str));
+ result.append("</h4>\n"); //$NON-NLS-1$
+ } else {
+ if (!paragraphStarted) {
+ result.append(P_BEGIN);
+ paragraphStarted = true;
+ } else {
+ result.append(LINE_BREAK);
+ }
+ result.append(TextUtils.escapeHTML(str));
+ }
+ }
}
- // result.append("</p>\n");
+ if (paragraphStarted) {
+ result.append(P_END);
+ }
return result.toString();
}
+ private static final String P_BEGIN = "<p>"; //$NON-NLS-1$
+ private static final String P_END = "</p>"; //$NON-NLS-1$
+
+ private static final String LINE_BREAK = "<br>\n"; //$NON-NLS-1$
+
public Reader getInfo(String content) {
return null;
}