8213354: Support package-specific stylesheets

Reviewed-by: jjg
This commit is contained in:
Priya Lakshmi Muthuswamy 2019-02-21 11:26:39 +05:30
parent e6f6863cbc
commit dcf38e3cfe
8 changed files with 137 additions and 10 deletions

View File

@ -153,10 +153,10 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter
@Override
public void printDocument(Content contentTree) throws DocFileIOException {
String description = getDescription("declaration", annotationType);
PackageElement pkg = utils.containingPackage(this.annotationType);
Content stylesheetContent = getLocalStylesheetContent(pkg);
printHtmlDocument(configuration.metakeywords.getMetaKeywords(annotationType),
description,
true,
contentTree);
description, true, stylesheetContent, contentTree);
}
/**

View File

@ -178,10 +178,10 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite
@Override
public void printDocument(Content contentTree) throws DocFileIOException {
String description = getDescription("declaration", typeElement);
PackageElement pkg = utils.containingPackage(typeElement);
Content stylesheetContent = getLocalStylesheetContent(pkg);
printHtmlDocument(configuration.metakeywords.getMetaKeywords(typeElement),
description,
true,
contentTree);
description, true, stylesheetContent, contentTree);
}
/**

View File

@ -31,7 +31,6 @@ import com.sun.source.doctree.StartElementTree;
import com.sun.source.doctree.TextTree;
import com.sun.source.util.DocTreeFactory;
import com.sun.tools.doclint.HtmlTag;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Navigation;
import jdk.javadoc.internal.doclets.toolkit.Content;
@ -125,6 +124,16 @@ public class DocFilesHandlerImpl implements DocFilesHandler {
}
}
public List<DocPath> getStylesheets() throws DocFileIOException {
List<DocPath> stylesheets = new ArrayList<DocPath>();
for (DocFile srcdir : DocFile.list(configuration, location, source)) {
for (DocFile srcFile : srcdir.list()) {
if (srcFile.getName().endsWith(".css"))
stylesheets.add(DocPaths.DOC_FILES.resolve(srcFile.getName()));
}
}
return stylesheets;
}
private void copyDirectory(DocFile srcdir, final DocPath dstDocPath,
boolean first) throws DocFileIOException {

View File

@ -240,6 +240,8 @@ public class HtmlConfiguration extends BaseConfiguration {
public DocPaths docPaths;
public Map<Element, List<DocPath>> localStylesheetMap = new HashMap<>();
/**
* Creates an object to hold the configuration for a doclet.
*

View File

@ -2219,4 +2219,21 @@ public class HtmlDocletWriter {
Script getMainBodyScript() {
return mainBodyScript;
}
Content getLocalStylesheetContent(Element element) throws DocFileIOException {
Content stylesheetContent = new ContentBuilder();
List<DocPath> localStylesheets = configuration.localStylesheetMap.get(element);
if (localStylesheets == null) {
DocFilesHandlerImpl docFilesHandler = (DocFilesHandlerImpl)configuration
.getWriterFactory().getDocFilesHandler(element);
localStylesheets = docFilesHandler.getStylesheets();
configuration.localStylesheetMap.put(element, localStylesheets);
}
for (DocPath stylesheet : localStylesheets) {
stylesheetContent.addContent(HtmlTree.LINK("stylesheet",
"text/css", stylesheet.getPath(), "Style"));
}
return stylesheetContent;
}
}

View File

@ -317,9 +317,8 @@ public class PackageWriterImpl extends HtmlDocletWriter
@Override
public void printDocument(Content contentTree) throws DocFileIOException {
String description = getDescription("declaration", packageElement);
Content stylesheetContent = getLocalStylesheetContent(packageElement);
printHtmlDocument(configuration.metakeywords.getMetaKeywords(packageElement),
description,
true,
contentTree);
description, true, stylesheetContent, contentTree);
}
}

View File

@ -26,6 +26,9 @@
package jdk.javadoc.internal.doclets.toolkit;
import java.util.List;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
/**
* The interface for copying doc-files to the output.
*
@ -37,4 +40,5 @@ package jdk.javadoc.internal.doclets.toolkit;
public interface DocFilesHandler {
void copyDocFiles() throws DocletException;
List<DocPath> getStylesheets() throws DocletException;
}

View File

@ -0,0 +1,96 @@
/*
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8213354
* @summary Support package-specific stylesheets
* @library /tools/lib ../../lib
* @modules jdk.javadoc/jdk.javadoc.internal.tool
* @build javadoc.tester.* toolbox.ToolBox builder.ClassBuilder
* @run main TestPackageSpecificStylesheet
*/
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import builder.ClassBuilder;
import toolbox.ToolBox;
import javadoc.tester.JavadocTester;
public class TestPackageSpecificStylesheet extends JavadocTester {
final ToolBox tb;
public static void main(String... args) throws Exception {
TestPackageSpecificStylesheet tester = new TestPackageSpecificStylesheet();
tester.runTests(m -> new Object[]{Paths.get(m.getName())});
}
TestPackageSpecificStylesheet() {
tb = new ToolBox();
}
@Test
public void test(Path base) throws Exception {
Path srcDir = base.resolve("src");
Path outDir = base.resolve("out");
new ClassBuilder(tb, "pkg.A")
.setComments("<span>test span style</span>")
.setModifiers("public", "class")
.write(srcDir);
Path docFilesDir = Files.createDirectories(srcDir.resolve("pkg").resolve("doc-files"));
Path stylesheet = docFilesDir.resolve("spanstyle.css");
Files.createFile(stylesheet);
Files.write(stylesheet, List.of("span{ color:blue; }"));
new ClassBuilder(tb, "pkg2.B")
.setModifiers("public", "class")
.write(srcDir);
javadoc("-d", outDir.toString(),
"-sourcepath", srcDir.toString(),
"pkg", "pkg2");
checkExit(Exit.OK);
checkOutput("pkg/A.html", true,
"<link rel=\"stylesheet\" type=\"text/css\" href=\"doc-files/spanstyle.css\"" +
" title=\"Style\">");
checkOutput("pkg/package-summary.html", true,
"<link rel=\"stylesheet\" type=\"text/css\" href=\"doc-files/spanstyle.css\"" +
" title=\"Style\">");
checkOutput("pkg2/B.html", false,
"<link rel=\"stylesheet\" type=\"text/css\" href=\"doc-files/spanstyle.css\"" +
" title=\"Style\">");
}
}