From 633fb777a05c91cff7b425495e810f04887d953a Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Sun, 20 Nov 2016 18:17:48 -0500 Subject: [PATCH] Generated HTML data extraction hacks --- .../javadoc/internal/JavadocContents.java | 85 ++++++++++++- .../vscode/commons/maven/JavaIndexTest.java | 117 ++++++++++++++---- .../src/main/java/hello/Greeting.java | 20 ++- 3 files changed, 192 insertions(+), 30 deletions(-) diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/internal/JavadocContents.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/internal/JavadocContents.java index 8c4d920f9..8d9dcd589 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/internal/JavadocContents.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/internal/JavadocContents.java @@ -1,5 +1,6 @@ package org.springframework.ide.vscode.commons.javadoc.internal; +import java.util.Arrays; import java.util.stream.Collectors; import org.springframework.ide.vscode.commons.java.IField; @@ -206,7 +207,7 @@ public class JavadocContents { int javadocStart = indexOfEndLink + JavadocConstants.ANCHOR_SUFFIX_LENGTH; int javadocEnd = indexOfNextElement == -1 ? indexOfBottom : Math.min(indexOfNextElement, indexOfBottom); - range = new int[]{javadocStart, javadocEnd}; + range = sanitizeRange(new int[]{javadocStart, javadocEnd}); } else { // the anchor has no suffix range = UNKNOWN_FORMAT; @@ -237,7 +238,10 @@ public class JavadocContents { lastIndex = this.indexOfMethodDetails == -1 ? lastIndex : this.indexOfMethodDetails; // we take the end of class data + final int indexOfStartOfClassData = CharOperation.indexOf(JavadocConstants.START_OF_CLASS_DATA, this.content, false); this.indexOfEndOfClassData = CharOperation.indexOf(JavadocConstants.END_OF_CLASS_DATA, this.content, false, lastIndex); + int[] classDataRange = sanitizeRange(new int[] { indexOfStartOfClassData + JavadocConstants.START_OF_CLASS_DATA.length, indexOfEndOfClassData}); + this.indexOfEndOfClassData = classDataRange[1]; // try to find the field detail end this.indexOfFieldsBottom = @@ -252,9 +256,38 @@ public class JavadocContents { this.indexOfAllMethodsBottom = this.indexOfEndOfClassData; + // Get rid of possible \n\n"; + indexOfAllMethodsBottom = trimBadEnding(badEnding, indexOfAllMethodsBottom, badEnding.length() / 2); + this.hasComputedChildrenSections = true; + + } + + private int trimBadEnding(String badEnding, int end) { + return trimBadEnding(badEnding, end, badEnding.length()); } + private int trimBadEnding(String badEnding, int end, int numberOfCharsToTrim) { + if (Arrays.equals(CharOperation.subarray(content, end - badEnding.length(), end), badEnding.toCharArray())) { + return end - numberOfCharsToTrim; + } else { + return end; + } + } + /* * Compute the ranges of the parts of the javadoc that describe each child of the type (fields, methods) */ @@ -534,6 +567,54 @@ public class JavadocContents { start = afterHierarchy; } - this.typeDocRange = new int[]{start, indexOfNextSummary}; + int indexOfClassDescriptionEnd = trimBadEnding("
\n\n
\n", indexOfClassDescriptionEnd); + this.typeDocRange = new int[]{start, indexOfClassDescriptionEnd}; + this.typeDocRange = sanitizeRange(typeDocRange); + } + + private int[] trimRange(int[] range) { + int start = range[0]; + int end = range[1]; + + while (start < content.length && start < end && Character.isWhitespace(content[start])) { + start++; + } + + while (end > 0 && start < end && Character.isWhitespace(content[end-1])) { + end--; + } + + return new int[] { start, end }; + } + + private int[] trimTag(int[] range, CharSequence tag) { + int start = range[0]; + int end = range[1]; + + char[] startingTag = ("<" + tag).toCharArray(); + char[] closingTag = ("").toCharArray(); + char[] ending = CharOperation.subarray(content, end - closingTag.length, end); + char[] starting = CharOperation.subarray(content, start, start + startingTag.length); + if (Arrays.equals(closingTag, ending) && Arrays.equals(startingTag, starting)) { + return new int[] { CharOperation.indexOf('>', content, start, end) + 1, end - closingTag.length}; + } else { + return range; + } + } + + private int[] sanitizeRange(int[] range) { + boolean changed = false; + do { + int[] newRange = trimRange(range); + newRange = trimTag(newRange, "div"); + newRange = trimTag(newRange, "ul"); + newRange = trimTag(newRange, "li"); + changed = !Arrays.equals(newRange, range); + range = newRange; + } while (changed); + return range; + } + } diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java index 7bd17c687..9797787f4 100644 --- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java @@ -3,7 +3,6 @@ package org.springframework.ide.vscode.commons.maven; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; import java.nio.file.Path; import java.nio.file.Paths; @@ -318,9 +317,6 @@ public class JavaIndexTest { assertNotNull(method); String expected = String.join("\n", - "", - "