--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandlerImpl.java Mon Jan 07 18:48:39 2019 -0800
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandlerImpl.java Tue Jan 08 11:16:32 2019 +0530
@@ -31,6 +31,7 @@
import com.sun.source.doctree.EndElementTree;
import com.sun.source.doctree.StartElementTree;
import com.sun.source.doctree.TextTree;
+import com.sun.source.util.DocTreeFactory;
import com.sun.source.util.SimpleDocTreeVisitor;
import com.sun.tools.doclint.HtmlTag;
import com.sun.tools.doclint.HtmlTag.Attr;
@@ -43,6 +44,7 @@
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
+import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
import jdk.javadoc.internal.doclets.toolkit.util.Utils;
import javax.lang.model.element.Element;
@@ -51,6 +53,7 @@
import javax.tools.FileObject;
import javax.tools.JavaFileManager.Location;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -140,13 +143,12 @@
srcfile.getPath(), dstdir.getPath());
} else {
if (Utils.toLowerCase(srcfile.getPath()).endsWith(".html")) {
- if (handleHtmlFile(srcfile, dstDocPath)) {
- continue;
- }
+ handleHtmlFile(srcfile, dstDocPath);
+ } else {
+ configuration.messages.notice("doclet.Copying_File_0_To_Dir_1",
+ srcfile.getPath(), dstdir.getPath());
+ destfile.copyFile(srcfile);
}
- configuration.messages.notice("doclet.Copying_File_0_To_Dir_1",
- srcfile.getPath(), dstdir.getPath());
- destfile.copyFile(srcfile);
}
} else if (srcfile.isDirectory()) {
if (configuration.copydocfilesubdirs
@@ -158,19 +160,18 @@
}
}
- private boolean handleHtmlFile(DocFile srcfile, DocPath dstPath) throws DocFileIOException {
+ private void handleHtmlFile(DocFile srcfile, DocPath dstPath) throws DocFileIOException {
Utils utils = configuration.utils;
FileObject fileObject = srcfile.getFileObject();
DocFileElement dfElement = new DocFileElement(element, fileObject);
- if (shouldPassThrough(utils.getPreamble(dfElement))) {
- return false;
- }
-
DocPath dfilePath = dstPath.resolve(srcfile.getName());
HtmlDocletWriter docletWriter = new DocFileWriter(configuration, dfilePath, element);
configuration.messages.notice("doclet.Generating_0", docletWriter.filename.getPath());
+ List<? extends DocTree> localTags = getLocalHeaderTags(utils.getPreamble(dfElement));
+ Content localTagsContent = docletWriter.commentTagsToContent(null, dfElement, localTags, false);
+
String title = getWindowTitle(docletWriter, dfElement).trim();
HtmlTree htmlContent = docletWriter.getBody(true, title);
docletWriter.addTop(htmlContent);
@@ -193,70 +194,61 @@
navBar.setUserFooter(docletWriter.getUserHeaderFooter(false));
htmlContent.addContent(navBar.getContent(false));
docletWriter.addBottom(htmlContent);
- docletWriter.printHtmlDocument(Collections.emptyList(), false, htmlContent);
- return true;
+ docletWriter.printHtmlDocument(Collections.emptyList(), false, localTagsContent, htmlContent);
}
- private boolean shouldPassThrough(List<? extends DocTree> dtrees) {
- SimpleDocTreeVisitor<Boolean, Boolean> check = new SimpleDocTreeVisitor<Boolean, Boolean>() {
- @Override
- public Boolean visitStartElement(StartElementTree node, Boolean p) {
- if (Utils.toLowerCase(node.getName().toString()).equals((Attr.STYLE.getText()))) {
- return true;
- }
- if (Utils.toLowerCase(node.getName().toString()).equals(HtmlTag.LINK.getText())) {
- for (DocTree dt : node.getAttributes()) {
- if (this.visit(dt, true))
- return true;
+ private List<? extends DocTree> getLocalHeaderTags(List<? extends DocTree> dtrees) {
+ List<DocTree> localTags = new ArrayList<>();
+ DocTreeFactory docTreeFactory = configuration.docEnv.getDocTrees().getDocTreeFactory();
+ boolean inHead = false;
+ boolean inTitle = false;
+ loop:
+ for (DocTree dt : dtrees) {
+ switch (dt.getKind()) {
+ case START_ELEMENT:
+ StartElementTree startElem = (StartElementTree)dt;
+ switch (HtmlTag.get(startElem.getName())) {
+ case HEAD:
+ inHead = true;
+ break;
+ case META:
+ break;
+ case TITLE:
+ inTitle = true;
+ break;
+ default:
+ if (inHead) {
+ localTags.add(startElem);
+ localTags.add(docTreeFactory.newTextTree(DocletConstants.NL));
+ }
}
- }
- return false;
+ break;
+ case END_ELEMENT:
+ EndElementTree endElem = (EndElementTree)dt;
+ switch (HtmlTag.get(endElem.getName())) {
+ case HEAD:
+ inHead = false;
+ break loop;
+ case TITLE:
+ inTitle = false;
+ break;
+ default:
+ if (inHead) {
+ localTags.add(endElem);
+ localTags.add(docTreeFactory.newTextTree(DocletConstants.NL));
+ }
+ }
+ break;
+ case ENTITY:
+ case TEXT:
+ if (inHead && !inTitle) {
+ localTags.add(dt);
+ }
+ break;
}
-
- @Override
- public Boolean visitAttribute(AttributeTree node, Boolean p) {
- if (p == null || p == false) {
- return false;
- }
- if (Utils.toLowerCase(node.getName().toString()).equals("rel")) {
- for (DocTree dt : node.getValue()) {
- Boolean found = new SimpleDocTreeVisitor<Boolean, ValueKind>() {
-
- @Override
- public Boolean visitText(TextTree node, ValueKind valueKind) {
- switch (valueKind) {
- case EMPTY:
- return false;
- default:
- return Utils.toLowerCase(node.getBody()).equals("stylesheet");
- }
- }
-
- @Override
- protected Boolean defaultAction(DocTree node, ValueKind valueKind) {
- return false;
- }
-
- }.visit(dt, node.getValueKind());
-
- if (found)
- return true;
- }
- }
- return false;
- }
-
- @Override
- protected Boolean defaultAction(DocTree node, Boolean p) {
- return false;
- }
- };
- for (DocTree dt : dtrees) {
- if (check.visit(dt, false))
- return true;
}
- return false;
+ return localTags;
}
private String getWindowTitle(HtmlDocletWriter docletWriter, Element element) {