# HG changeset patch # User jjg # Date 1510874181 28800 # Node ID 4a28dc8a86c26ba3c9d099a5660c370d1dd166e7 # Parent 0e38db7cf1cc8cdc080fd4b628dc9792b47cdfa3 8190821: Introduce a new Links builder class Reviewed-by: bpatel, ksrini diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -358,6 +358,6 @@ } } buf.append(")"); - return foundTypeVariable ? writer.getName(buf.toString()) : null; + return foundTypeVariable ? configuration.links.getName(buf.toString()) : null; } } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -222,6 +222,7 @@ * * @param mdle the module to be documented * @param dlTree the content tree to which the description will be added + * @param si the search index item */ protected void addDescription(ModuleElement mdle, Content dlTree, SearchIndexItem si) { String moduleName = utils.getFullyQualifiedName(mdle); @@ -316,7 +317,7 @@ name = name + utils.flatSignature(ee); si.setLabel(name); if (!((utils.signature(ee)).equals(utils.flatSignature(ee)))) { - si.setUrl(getName(getAnchor(ee))); + si.setUrl(links.getName(getAnchor(ee))); } } else { @@ -420,7 +421,7 @@ * @return a content tree for the marker anchor */ public Content getMarkerAnchorForIndex(String anchorNameForIndex) { - return getMarkerAnchor(getNameForIndex(anchorNameForIndex), null); + return links.createAnchor(getNameForIndex(anchorNameForIndex), null); } /** @@ -430,7 +431,7 @@ * @return a valid HTML name string. */ public String getNameForIndex(String unicode) { - return "I:" + getName(unicode); + return "I:" + links.getName(unicode); } /** @@ -452,6 +453,13 @@ } /** + * Creates a search index file. + * + * @param searchIndexFile the file to be generated + * @param searchIndexZip the zip file to be generated + * @param searchIndexJS the file for the JavaScript to be generated + * @param searchIndex the search index items + * @param varName the variable name to write in the JavaScript file * @throws DocFileIOException if there is a problem creating the search index file */ protected void createSearchIndexFile(DocPath searchIndexFile, DocPath searchIndexZip, diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -44,6 +44,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; @@ -74,6 +75,7 @@ protected final SubWriterHolderWriter writer; protected final Contents contents; protected final Resources resources; + protected final Links links; protected final TypeElement typeElement; public final boolean nodepr; @@ -88,6 +90,7 @@ this.utils = configuration.utils; this.contents = configuration.contents; this.resources = configuration.resources; + this.links = configuration.links; } public AbstractMemberWriter(SubWriterHolderWriter writer) { @@ -519,6 +522,7 @@ * @param member the member being documented * @param firstSentenceTags the first sentence tags to be added to the summary */ + @Override public void addMemberSummary(TypeElement tElement, Element member, List firstSentenceTags) { if (tElement != typeElement) { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -39,6 +39,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.AnnotationTypeFieldWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -108,7 +109,7 @@ public void addAnnotationDetailsTreeHeader(TypeElement typeElement, Content memberDetailsTree) { if (!writer.printedAnnotationFieldHeading) { - memberDetailsTree.addContent(writer.getMarkerAnchor( + memberDetailsTree.addContent(links.createAnchor( SectionName.ANNOTATION_TYPE_FIELD_DETAIL)); Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, contents.fieldDetailsLabel); @@ -122,8 +123,7 @@ */ public Content getAnnotationDocTreeHeader(Element member, Content annotationDetailsTree) { - annotationDetailsTree.addContent( - writer.getMarkerAnchor(name(member))); + annotationDetailsTree.addContent(links.createAnchor(name(member))); Content annotationDocTree = writer.getMemberTreeHeader(); Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); heading.addContent(name(member)); @@ -232,26 +232,30 @@ /** * {@inheritDoc} */ + @Override public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( + memberTree.addContent(links.createAnchor( SectionName.ANNOTATION_TYPE_FIELD_SUMMARY)); } /** * {@inheritDoc} */ + @Override public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { } /** * {@inheritDoc} */ + @Override public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) { } /** * {@inheritDoc} */ + @Override protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, Content tdSummary) { Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink, @@ -288,7 +292,7 @@ */ protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { - return writer.getHyperLink( + return Links.createLink( SectionName.ANNOTATION_TYPE_FIELD_SUMMARY, contents.navField); } else { @@ -301,7 +305,7 @@ */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink( + liNav.addContent(Links.createLink( SectionName.ANNOTATION_TYPE_FIELD_DETAIL, contents.navField)); } else { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -35,6 +35,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.AnnotationTypeOptionalMemberWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -148,7 +149,7 @@ */ @Override public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( + memberTree.addContent(links.createAnchor( SectionName.ANNOTATION_TYPE_OPTIONAL_ELEMENT_SUMMARY)); } @@ -158,7 +159,7 @@ @Override protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { - return writer.getHyperLink( + return Links.createLink( SectionName.ANNOTATION_TYPE_OPTIONAL_ELEMENT_SUMMARY, contents.navAnnotationTypeOptionalMember); } else { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -40,6 +40,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.AnnotationTypeRequiredMemberWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -110,7 +111,7 @@ public void addAnnotationDetailsTreeHeader(TypeElement te, Content memberDetailsTree) { if (!writer.printedAnnotationHeading) { - memberDetailsTree.addContent(writer.getMarkerAnchor( + memberDetailsTree.addContent(links.createAnchor( SectionName.ANNOTATION_TYPE_ELEMENT_DETAIL)); Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, contents.annotationTypeDetailsLabel); @@ -122,11 +123,11 @@ /** * {@inheritDoc} */ - public Content getAnnotationDocTreeHeader(Element member, - Content annotationDetailsTree) { + @Override + public Content getAnnotationDocTreeHeader(Element member, Content annotationDetailsTree) { String simpleName = name(member); - annotationDetailsTree.addContent(writer.getMarkerAnchor(simpleName + - utils.signature((ExecutableElement) member))); + annotationDetailsTree.addContent(links.createAnchor( + simpleName + utils.signature((ExecutableElement) member))); Content annotationDocTree = writer.getMemberTreeHeader(); Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); heading.addContent(simpleName); @@ -252,7 +253,7 @@ * {@inheritDoc} */ public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( + memberTree.addContent(links.createAnchor( SectionName.ANNOTATION_TYPE_REQUIRED_ELEMENT_SUMMARY)); } @@ -307,7 +308,7 @@ */ protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { - return writer.getHyperLink( + return Links.createLink( SectionName.ANNOTATION_TYPE_REQUIRED_ELEMENT_SUMMARY, contents.navAnnotationTypeRequiredMember); } else { @@ -320,7 +321,7 @@ */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink( + liNav.addContent(Links.createLink( SectionName.ANNOTATION_TYPE_ELEMENT_DETAIL, contents.navAnnotationTypeMember)); } else { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -37,6 +37,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.AnnotationTypeWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -108,7 +109,7 @@ */ @Override protected Content getNavLinkPackage() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, + Content linkContent = Links.createLink(DocPaths.PACKAGE_SUMMARY, contents.packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -132,7 +133,7 @@ */ @Override protected Content getNavLinkClassUse() { - Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), contents.useLabel); + Content linkContent = Links.createLink(DocPaths.CLASS_USE.resolve(filename), contents.useLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -346,7 +347,7 @@ */ @Override protected Content getNavLinkTree() { - Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE, + Content treeLinkContent = Links.createLink(DocPaths.PACKAGE_TREE, contents.treeLabel, "", ""); Content li = HtmlTree.LI(treeLinkContent); return li; diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -47,6 +47,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; @@ -348,7 +349,7 @@ HtmlTree ul = new HtmlTree(HtmlTag.UL); ul.setStyle(HtmlStyle.blockList); for (PackageElement pkg : pkgSet) { - Content markerAnchor = getMarkerAnchor(getPackageAnchorName(pkg)); + Content markerAnchor = links.createAnchor(getPackageAnchorName(pkg)); HtmlTree htmlTree = (configuration.allowTag(HtmlTag.SECTION)) ? HtmlTree.SECTION(markerAnchor) : HtmlTree.LI(HtmlStyle.blockList, markerAnchor); @@ -377,7 +378,7 @@ */ protected void addPackageUse(PackageElement pkg, Table table) { Content pkgLink = - getHyperLink(getPackageAnchorName(pkg), new StringContent(utils.getPackageName(pkg))); + links.createLink(getPackageAnchorName(pkg), new StringContent(utils.getPackageName(pkg))); Content summary = new ContentBuilder(); addSummaryComment(pkg, summary); table.addRow(pkgLink, summary); @@ -514,7 +515,7 @@ */ protected Content getNavLinkPackage() { Content linkContent = - getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_SUMMARY), contents.packageLabel); + Links.createLink(DocPath.parent.resolve(DocPaths.PACKAGE_SUMMARY), contents.packageLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -549,8 +550,8 @@ */ protected Content getNavLinkTree() { Content linkContent = utils.isEnclosingPackageIncluded(typeElement) - ? getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_TREE), contents.treeLabel) - : getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), contents.treeLabel); + ? Links.createLink(DocPath.parent.resolve(DocPaths.PACKAGE_TREE), contents.treeLabel) + : Links.createLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), contents.treeLabel); Content li = HtmlTree.LI(linkContent); return li; } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -40,6 +40,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.ClassWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -119,7 +120,7 @@ */ @Override protected Content getNavLinkPackage() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, + Content linkContent = Links.createLink(DocPaths.PACKAGE_SUMMARY, contents.packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -143,7 +144,7 @@ */ @Override protected Content getNavLinkClassUse() { - Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), contents.useLabel); + Content linkContent = Links.createLink(DocPaths.CLASS_USE.resolve(filename), contents.useLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -659,7 +660,7 @@ */ @Override protected Content getNavLinkTree() { - Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE, + Content treeLinkContent = Links.createLink(DocPaths.PACKAGE_TREE, contents.treeLabel, "", ""); Content li = HtmlTree.LI(treeLinkContent); return li; diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -40,6 +40,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.ConstantsSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -134,14 +135,13 @@ //add link to summary Content link; if (pkg.isUnnamed()) { - link = getHyperLink(getDocLink( - SectionName.UNNAMED_PACKAGE_ANCHOR), + link = Links.createLink(SectionName.UNNAMED_PACKAGE_ANCHOR, contents.defaultPackageLabel, "", ""); } else { String parsedPackageName = utils.parsePackageName(pkg); Content packageNameContent = getPackageLabel(parsedPackageName); packageNameContent.addContent(".*"); - link = getHyperLink(DocLink.fragment(parsedPackageName), + link = Links.createLink(DocLink.fragment(parsedPackageName), packageNameContent, "", ""); PackageElement abbrevPkg = configuration.workArounds.getAbbreviatedPackageElement(pkg); printedPackageHeaders.add(abbrevPkg); @@ -193,12 +193,11 @@ summariesTree.addContent(summaryTree); } if (pkg.isUnnamed()) { - summariesTree.addContent(getMarkerAnchor( - SectionName.UNNAMED_PACKAGE_ANCHOR)); + summariesTree.addContent(links.createAnchor(SectionName.UNNAMED_PACKAGE_ANCHOR)); pkgNameContent = contents.defaultPackageLabel; } else { String parsedPackageName = utils.parsePackageName(pkg); - summariesTree.addContent(getMarkerAnchor(parsedPackageName)); + summariesTree.addContent(links.createAnchor(parsedPackageName)); pkgNameContent = getPackageLabel(parsedPackageName); } Content headingContent = new StringContent(".*"); @@ -277,8 +276,8 @@ * @return the type column of the constant table row */ private Content getTypeColumn(VariableElement member) { - Content anchor = getMarkerAnchor(currentTypeElement.getQualifiedName() + - "." + member.getSimpleName()); + Content anchor = links.createAnchor( + currentTypeElement.getQualifiedName() + "." + member.getSimpleName()); Content typeContent = new ContentBuilder(); typeContent.addContent(anchor); Content code = new HtmlTree(HtmlTag.CODE); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -38,6 +38,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.ConstructorWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -119,7 +120,7 @@ Content memberDetailsTree) { memberDetailsTree.addContent(HtmlConstants.START_OF_CONSTRUCTOR_DETAILS); Content constructorDetailsTree = writer.getMemberTreeHeader(); - constructorDetailsTree.addContent(writer.getMarkerAnchor( + constructorDetailsTree.addContent(links.createAnchor( SectionName.CONSTRUCTOR_DETAIL)); Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, contents.constructorDetailsLabel); @@ -135,10 +136,9 @@ Content constructorDetailsTree) { String erasureAnchor; if ((erasureAnchor = getErasureAnchor(constructor)) != null) { - constructorDetailsTree.addContent(writer.getMarkerAnchor((erasureAnchor))); + constructorDetailsTree.addContent(links.createAnchor((erasureAnchor))); } - constructorDetailsTree.addContent( - writer.getMarkerAnchor(writer.getAnchor(constructor))); + constructorDetailsTree.addContent(links.createAnchor(writer.getAnchor(constructor))); Content constructorDocTree = writer.getMemberTreeHeader(); Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); heading.addContent(name(constructor)); @@ -277,8 +277,7 @@ */ @Override public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( - SectionName.CONSTRUCTOR_SUMMARY)); + memberTree.addContent(links.createAnchor(SectionName.CONSTRUCTOR_SUMMARY)); } /** @@ -301,7 +300,7 @@ @Override protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { - return writer.getHyperLink(SectionName.CONSTRUCTOR_SUMMARY, + return Links.createLink(SectionName.CONSTRUCTOR_SUMMARY, contents.navConstructor); } else { return contents.navConstructor; @@ -314,7 +313,7 @@ @Override protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink( + liNav.addContent(Links.createLink( SectionName.CONSTRUCTOR_DETAIL, contents.navConstructor)); } else { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -325,7 +325,7 @@ private void addIndexLink(DeprecatedAPIListBuilder builder, DeprElementKind kind, Content contentTree) { if (builder.hasDocumentation(kind)) { - Content li = HtmlTree.LI(getHyperLink(getAnchorName(kind), + Content li = HtmlTree.LI(links.createLink(getAnchorName(kind), contents.getContent(getHeadingKey(kind)))); contentTree.addContent(li); } @@ -362,7 +362,7 @@ */ private void addAnchor(DeprecatedAPIListBuilder builder, DeprElementKind kind, Content htmlTree) { if (builder.hasDocumentation(kind)) { - htmlTree.addContent(getMarkerAnchor(getAnchorName(kind))); + htmlTree.addContent(links.createAnchor(getAnchorName(kind))); } } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -37,6 +37,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.EnumConstantWriter; @@ -92,7 +93,7 @@ Content memberDetailsTree) { memberDetailsTree.addContent(HtmlConstants.START_OF_ENUM_CONSTANT_DETAILS); Content enumConstantsDetailsTree = writer.getMemberTreeHeader(); - enumConstantsDetailsTree.addContent(writer.getMarkerAnchor( + enumConstantsDetailsTree.addContent(links.createAnchor( SectionName.ENUM_CONSTANT_DETAIL)); Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, contents.enumConstantDetailLabel); @@ -106,8 +107,7 @@ @Override public Content getEnumConstantsTreeHeader(VariableElement enumConstant, Content enumConstantsDetailsTree) { - enumConstantsDetailsTree.addContent( - writer.getMarkerAnchor(name(enumConstant))); + enumConstantsDetailsTree.addContent(links.createAnchor(name(enumConstant))); Content enumConstantsTree = writer.getMemberTreeHeader(); Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); heading.addContent(name(enumConstant)); @@ -221,8 +221,7 @@ */ @Override public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( - SectionName.ENUM_CONSTANT_SUMMARY)); + memberTree.addContent(links.createAnchor(SectionName.ENUM_CONSTANT_SUMMARY)); } /** @@ -282,10 +281,10 @@ protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { if (typeElement == null) { - return writer.getHyperLink(SectionName.ENUM_CONSTANT_SUMMARY, + return Links.createLink(SectionName.ENUM_CONSTANT_SUMMARY, contents.navEnum); } else { - return writer.getHyperLink( + return links.createLink( SectionName.ENUM_CONSTANTS_INHERITANCE, configuration.getClassName(typeElement), contents.navEnum); } @@ -300,7 +299,7 @@ @Override protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink( + liNav.addContent(Links.createLink( SectionName.ENUM_CONSTANT_DETAIL, contents.navEnum)); } else { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -39,6 +39,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.FieldWriter; @@ -95,7 +96,7 @@ public Content getFieldDetailsTreeHeader(TypeElement typeElement, Content memberDetailsTree) { memberDetailsTree.addContent(HtmlConstants.START_OF_FIELD_DETAILS); Content fieldDetailsTree = writer.getMemberTreeHeader(); - fieldDetailsTree.addContent(writer.getMarkerAnchor( + fieldDetailsTree.addContent(links.createAnchor( SectionName.FIELD_DETAIL)); Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, contents.fieldDetailsLabel); @@ -108,7 +109,7 @@ */ @Override public Content getFieldDocTreeHeader(VariableElement field, Content fieldDetailsTree) { - fieldDetailsTree.addContent(writer.getMarkerAnchor(name(field))); + fieldDetailsTree.addContent(links.createAnchor(name(field))); Content fieldTree = writer.getMemberTreeHeader(); Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); heading.addContent(name(field)); @@ -226,7 +227,7 @@ */ @Override public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( + memberTree.addContent(links.createAnchor( SectionName.FIELD_SUMMARY)); } @@ -235,7 +236,7 @@ */ @Override public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { - inheritedTree.addContent(writer.getMarkerAnchor( + inheritedTree.addContent(links.createAnchor( SectionName.FIELDS_INHERITANCE, configuration.getClassName(typeElement))); } @@ -309,11 +310,11 @@ protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { if (typeElement == null) { - return writer.getHyperLink( + return Links.createLink( SectionName.FIELD_SUMMARY, contents.navField); } else { - return writer.getHyperLink( + return links.createLink( SectionName.FIELDS_INHERITANCE, configuration.getClassName(typeElement), contents.navField); } @@ -328,7 +329,7 @@ @Override protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink( + liNav.addContent(Links.createLink( SectionName.FIELD_DETAIL, contents.navField)); } else { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -29,6 +29,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; @@ -132,7 +133,7 @@ ? HtmlTree.SECTION(overviewHeading) : HtmlTree.LI(HtmlStyle.blockList, overviewHeading); Content line3 = contents.getContent("doclet.Help_line_3", - getHyperLink(DocPaths.overviewSummary(configuration.frames), + Links.createLink(DocPaths.overviewSummary(configuration.frames), configuration.getText("doclet.Overview"))); Content overviewPara = HtmlTree.P(line3); htmlTree.addContent(overviewPara); @@ -282,7 +283,7 @@ ? HtmlTree.SECTION(treeHead) : HtmlTree.LI(HtmlStyle.blockList, treeHead); Content line17 = contents.getContent("doclet.Help_line_17_with_tree_link", - getHyperLink(DocPaths.OVERVIEW_TREE, + Links.createLink(DocPaths.OVERVIEW_TREE, configuration.getText("doclet.Class_Hierarchy")), HtmlTree.CODE(new StringContent("java.lang.Object"))); Content treePara = HtmlTree.P(line17); @@ -307,7 +308,7 @@ ? HtmlTree.SECTION(dHead) : HtmlTree.LI(HtmlStyle.blockList, dHead); Content line20 = contents.getContent("doclet.Help_line_20_with_deprecated_api_link", - getHyperLink(DocPaths.DEPRECATED_LIST, + Links.createLink(DocPaths.DEPRECATED_LIST, configuration.getText("doclet.Deprecated_API"))); Content dPara = HtmlTree.P(line20); htmlTree.addContent(dPara); @@ -320,10 +321,10 @@ if (configuration.createindex) { Content indexlink; if (configuration.splitindex) { - indexlink = getHyperLink(DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)), + indexlink = Links.createLink(DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)), configuration.getText("doclet.Index")); } else { - indexlink = getHyperLink(DocPaths.INDEX_ALL, + indexlink = Links.createLink(DocPaths.INDEX_ALL, configuration.getText("doclet.Index")); } Content indexHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, @@ -377,7 +378,7 @@ ? HtmlTree.SECTION(allclassesHead) : HtmlTree.LI(HtmlStyle.blockList, allclassesHead); Content line27 = contents.getContent("doclet.Help_line_27", - getHyperLink(DocPaths.AllClasses(configuration.frames), + Links.createLink(DocPaths.AllClasses(configuration.frames), resources.getText("doclet.All_Classes"))); Content allclassesPara = HtmlTree.P(line27); htmlTree.addContent(allclassesPara); @@ -405,7 +406,7 @@ ? HtmlTree.SECTION(constHead) : HtmlTree.LI(HtmlStyle.blockList, constHead); Content line29 = contents.getContent("doclet.Help_line_29", - getHyperLink(DocPaths.CONSTANT_VALUES, + Links.createLink(DocPaths.CONSTANT_VALUES, resources.getText("doclet.Constants_Summary"))); Content constPara = HtmlTree.P(line29); htmlTree.addContent(constPara); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java Thu Nov 16 15:16:21 2017 -0800 @@ -44,6 +44,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlVersion; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.DocletException; @@ -239,9 +240,11 @@ protected Set tagSearchIndexKeys; - protected Contents contents; + protected final Contents contents; - protected Messages messages; + protected final Messages messages; + + protected Links links; /** * Creates an object to hold the configuration for a doclet. @@ -353,6 +356,7 @@ setTopFile(docEnv); workArounds.initDocLint(doclintOpts.values(), tagletManager.getCustomTagNames(), Utils.toLowerCase(htmlVersion.name())); + links = new Links(htmlVersion); return true; } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -77,6 +77,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.Script; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; @@ -154,6 +155,8 @@ protected final Resources resources; + protected final Links links; + /** * To check whether annotation heading is printed or not. */ @@ -196,6 +199,7 @@ this.contents = configuration.contents; this.messages = configuration.messages; this.resources = configuration.resources; + this.links = configuration.links; this.utils = configuration.utils; this.path = path; this.pathToRoot = path.parent().invert(); @@ -366,7 +370,7 @@ */ public Content getTargetPackageLink(PackageElement pkg, String target, Content label) { - return getHyperLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY), label, "", target); + return Links.createLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY), label, "", target); } /** @@ -380,7 +384,7 @@ */ public Content getTargetModulePackageLink(PackageElement pkg, String target, Content label, ModuleElement mdle) { - return getHyperLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY), + return Links.createLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY), label, "", target); } @@ -393,7 +397,7 @@ * @return a content for the target module link */ public Content getTargetModuleLink(String target, Content label, ModuleElement mdle) { - return getHyperLink(pathToRoot.resolve( + return Links.createLink(pathToRoot.resolve( DocPaths.moduleSummary(mdle)), label, "", target); } @@ -500,28 +504,28 @@ fixedNavDiv.addContent(HtmlConstants.START_OF_TOP_NAVBAR); navDiv.setStyle(HtmlStyle.topNav); allClassesId += "navbar_top"; - Content a = getMarkerAnchor(SectionName.NAVBAR_TOP); + Content a = links.createAnchor(SectionName.NAVBAR_TOP); //WCAG - Hyperlinks should contain text or an image with alt text - for AT tools navDiv.addContent(a); - Content skipLinkContent = HtmlTree.DIV(HtmlStyle.skipNav, getHyperLink( - getDocLink(SectionName.SKIP_NAVBAR_TOP), skipNavLinks, - skipNavLinks.toString(), "")); + Content skipLinkContent = HtmlTree.DIV(HtmlStyle.skipNav, + Links.createLink(SectionName.SKIP_NAVBAR_TOP, skipNavLinks, + skipNavLinks.toString(), "")); navDiv.addContent(skipLinkContent); } else { tree.addContent(HtmlConstants.START_OF_BOTTOM_NAVBAR); navDiv.setStyle(HtmlStyle.bottomNav); allClassesId += "navbar_bottom"; - Content a = getMarkerAnchor(SectionName.NAVBAR_BOTTOM); + Content a = links.createAnchor(SectionName.NAVBAR_BOTTOM); navDiv.addContent(a); - Content skipLinkContent = HtmlTree.DIV(HtmlStyle.skipNav, getHyperLink( - getDocLink(SectionName.SKIP_NAVBAR_BOTTOM), skipNavLinks, - skipNavLinks.toString(), "")); + Content skipLinkContent = HtmlTree.DIV(HtmlStyle.skipNav, + Links.createLink(SectionName.SKIP_NAVBAR_BOTTOM, skipNavLinks, + skipNavLinks.toString(), "")); navDiv.addContent(skipLinkContent); } if (header) { - navDiv.addContent(getMarkerAnchor(SectionName.NAVBAR_TOP_FIRSTROW)); + navDiv.addContent(links.createAnchor(SectionName.NAVBAR_TOP_FIRSTROW)); } else { - navDiv.addContent(getMarkerAnchor(SectionName.NAVBAR_BOTTOM_FIRSTROW)); + navDiv.addContent(links.createAnchor(SectionName.NAVBAR_BOTTOM_FIRSTROW)); } HtmlTree navList = new HtmlTree(HtmlTag.UL); navList.setStyle(HtmlStyle.navList); @@ -592,7 +596,7 @@ subDiv.addContent(getAllClassesLinkScript(allClassesId)); addSummaryDetailLinks(subDiv); if (header) { - subDiv.addContent(getMarkerAnchor(SectionName.SKIP_NAVBAR_TOP)); + subDiv.addContent(links.createAnchor(SectionName.SKIP_NAVBAR_TOP)); fixedNavDiv.addContent(subDiv); fixedNavDiv.addContent(HtmlConstants.END_OF_TOP_NAVBAR); tree.addContent(fixedNavDiv); @@ -604,7 +608,7 @@ + "//-->\n"); tree.addContent(script.asContent()); } else { - subDiv.addContent(getMarkerAnchor(SectionName.SKIP_NAVBAR_BOTTOM)); + subDiv.addContent(links.createAnchor(SectionName.SKIP_NAVBAR_BOTTOM)); tree.addContent(subDiv); tree.addContent(HtmlConstants.END_OF_BOTTOM_NAVBAR); } @@ -646,7 +650,7 @@ * @return a content tree for the link */ protected Content getNavLinkContents() { - Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.overviewSummary(configuration.frames)), + Content linkContent = Links.createLink(pathToRoot.resolve(DocPaths.overviewSummary(configuration.frames)), contents.overviewLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; @@ -715,7 +719,7 @@ public Content getNavLinkPrevious(DocPath prev) { Content li; if (prev != null) { - li = HtmlTree.LI(getHyperLink(prev, contents.prevLabel, "", "")); + li = HtmlTree.LI(Links.createLink(prev, contents.prevLabel, "", "")); } else li = HtmlTree.LI(contents.prevLabel); @@ -732,7 +736,7 @@ public Content getNavLinkNext(DocPath next) { Content li; if (next != null) { - li = HtmlTree.LI(getHyperLink(next, contents.nextLabel, "", "")); + li = HtmlTree.LI(Links.createLink(next, contents.nextLabel, "", "")); } else li = HtmlTree.LI(contents.nextLabel); @@ -747,7 +751,7 @@ */ protected Content getNavShowLists(DocPath link) { DocLink dl = new DocLink(link, path.getPath(), null); - Content framesContent = getHyperLink(dl, contents.framesLabel, "", "_top"); + Content framesContent = Links.createLink(dl, contents.framesLabel, "", "_top"); Content li = HtmlTree.LI(framesContent); return li; } @@ -768,7 +772,7 @@ * @return a content tree for the link */ protected Content getNavHideLists(DocPath link) { - Content noFramesContent = getHyperLink(link, contents.noFramesLabel, "", "_top"); + Content noFramesContent = Links.createLink(link, contents.noFramesLabel, "", "_top"); Content li = HtmlTree.LI(noFramesContent); return li; } @@ -786,7 +790,7 @@ DocPath docPath = packages.size() == 1 && configuration.getSpecifiedTypeElements().isEmpty() ? pathString(packages.get(0), DocPaths.PACKAGE_TREE) : pathToRoot.resolve(DocPaths.OVERVIEW_TREE); - return HtmlTree.LI(getHyperLink(docPath, contents.treeLabel, "", "")); + return HtmlTree.LI(Links.createLink(docPath, contents.treeLabel, "", "")); } /** @@ -796,7 +800,7 @@ * @return a content tree for the link */ protected Content getNavLinkMainTree(String label) { - Content mainTreeContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), + Content mainTreeContent = Links.createLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), new StringContent(label)); Content li = HtmlTree.LI(mainTreeContent); return li; @@ -818,7 +822,7 @@ * @return a content tree for the link */ protected Content getNavLinkDeprecated() { - Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.DEPRECATED_LIST), + Content linkContent = Links.createLink(pathToRoot.resolve(DocPaths.DEPRECATED_LIST), contents.deprecatedLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; @@ -832,7 +836,7 @@ * @return a content tree for the link */ protected Content getNavLinkClassIndex() { - Content allClassesContent = getHyperLink(pathToRoot.resolve( + Content allClassesContent = Links.createLink(pathToRoot.resolve( DocPaths.AllClasses(configuration.frames)), contents.allClassesLabel, "", ""); Content li = HtmlTree.LI(allClassesContent); @@ -845,7 +849,7 @@ * @return a content tree for the link */ protected Content getNavLinkIndex() { - Content linkContent = getHyperLink(pathToRoot.resolve( + Content linkContent = Links.createLink(pathToRoot.resolve( (configuration.splitindex ? DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)) : DocPaths.INDEX_ALL)), @@ -870,7 +874,7 @@ DocFile file = DocFile.createFileForInput(configuration, helpfile); helpfilenm = DocPath.create(file.getName()); } - Content linkContent = getHyperLink(pathToRoot.resolve(helpfilenm), + Content linkContent = Links.createLink(pathToRoot.resolve(helpfilenm), contents.helpLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; @@ -903,51 +907,6 @@ } /** - * Get the marker anchor which will be added to the documentation tree. - * - * @param anchorName the anchor name attribute - * @return a content tree for the marker anchor - */ - public Content getMarkerAnchor(String anchorName) { - return getMarkerAnchor(getName(anchorName), null); - } - - /** - * Get the marker anchor which will be added to the documentation tree. - * - * @param sectionName the section name anchor attribute for page - * @return a content tree for the marker anchor - */ - public Content getMarkerAnchor(SectionName sectionName) { - return getMarkerAnchor(sectionName.getName(), null); - } - - /** - * Get the marker anchor which will be added to the documentation tree. - * - * @param sectionName the section name anchor attribute for page - * @param anchorName the anchor name combined with section name attribute for the page - * @return a content tree for the marker anchor - */ - public Content getMarkerAnchor(SectionName sectionName, String anchorName) { - return getMarkerAnchor(sectionName.getName() + getName(anchorName), null); - } - - /** - * Get the marker anchor which will be added to the documentation tree. - * - * @param anchorName the anchor name or id attribute - * @param anchorContent the content that should be added to the anchor - * @return a content tree for the marker anchor - */ - public Content getMarkerAnchor(String anchorName, Content anchorContent) { - if (anchorContent == null) - anchorContent = new Comment(" "); - Content markerAnchor = HtmlTree.A(configuration.htmlVersion, anchorName, anchorContent); - return markerAnchor; - } - - /** * Returns a packagename content. * * @param packageElement the package to check @@ -1039,12 +998,12 @@ } } if (included || packageElement == null) { - return getHyperLink(pathString(packageElement, DocPaths.PACKAGE_SUMMARY), + return Links.createLink(pathString(packageElement, DocPaths.PACKAGE_SUMMARY), label); } else { DocLink crossPkgLink = getCrossPackageLink(utils.getPackageName(packageElement)); if (crossPkgLink != null) { - return getHyperLink(crossPkgLink, label); + return Links.createLink(crossPkgLink, label); } else { return label; } @@ -1061,7 +1020,7 @@ public Content getModuleLink(ModuleElement mdle, Content label) { boolean included = utils.isIncluded(mdle); return (included) - ? getHyperLink(pathToRoot.resolve(DocPaths.moduleSummary(mdle)), label, "", "") + ? Links.createLink(pathToRoot.resolve(DocPaths.moduleSummary(mdle)), label, "", "") : label; } @@ -1091,7 +1050,7 @@ DocPath href = pathToRoot .resolve(DocPaths.SOURCE_OUTPUT) .resolve(DocPath.forClass(utils, te)); - Content linkContent = getHyperLink(href + Content linkContent = Links.createLink(href .fragment(SourceToHTMLConverter.getAnchorName(utils, typeElement)), label, "", ""); htmltree.addContent(linkContent); } @@ -1156,7 +1115,7 @@ */ DocLink link = configuration.extern.getExternalLink(packageName, pathToRoot, className + ".html", refMemName); - return getHyperLink(link, + return Links.createLink(link, (label == null) || label.isEmpty() ? defaultLabel : label, strong, style, configuration.getText("doclet.Href_Class_Or_Interface_Title", packageName), @@ -1340,12 +1299,12 @@ ExecutableElement ee = (ExecutableElement)element; return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) - .where(getName(getAnchor(ee, isProperty))) + .where(links.getName(getAnchor(ee, isProperty))) .strong(strong)); } else if (utils.isVariableElement(element) || utils.isTypeElement(element)) { return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) - .where(getName(element.getSimpleName().toString())) + .where(links.getName(element.getSimpleName().toString())) .strong(strong)); } else { return label; @@ -1371,10 +1330,10 @@ ExecutableElement emd = (ExecutableElement) element; return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) - .where(getName(getAnchor(emd)))); + .where(links.getName(getAnchor(emd)))); } else if (utils.isVariableElement(element) || utils.isTypeElement(element)) { return getLink(new LinkInfoImpl(configuration, context, typeElement) - .label(label).where(getName(element.getSimpleName().toString()))); + .label(label).where(links.getName(element.getSimpleName().toString()))); } else { return label; } @@ -1445,7 +1404,7 @@ DocLink packageCrossLink = getCrossPackageLink(refClassName); if (packageCrossLink != null) { // Package cross link found - return getHyperLink(packageCrossLink, + return Links.createLink(packageCrossLink, (label.isEmpty() ? text : label)); } else if ((classCrossLink = getCrossClassLink(refClassName, refMemName, label, false, "", !isLinkPlain)) != null) { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -33,6 +33,7 @@ import javax.lang.model.type.TypeMirror; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; @@ -92,11 +93,13 @@ DocPath filename = getPath(classLinkInfo); if (linkInfo.linkToSelf || !(DocPath.forName(utils, typeElement)).equals(m_writer.filename)) { - link.addContent(m_writer.getHyperLink( + link.addContent(Links.createLink( filename.fragment(classLinkInfo.where), - label, - classLinkInfo.isStrong, classLinkInfo.styleName, - title, classLinkInfo.target)); + label, + classLinkInfo.isStrong, + classLinkInfo.styleName, + title, + classLinkInfo.target)); if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.addContent(getTypeParameterLinks(linkInfo)); } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -40,6 +40,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; @@ -108,8 +109,7 @@ public Content getMethodDetailsTreeHeader(TypeElement typeElement, Content memberDetailsTree) { memberDetailsTree.addContent(HtmlConstants.START_OF_METHOD_DETAILS); Content methodDetailsTree = writer.getMemberTreeHeader(); - methodDetailsTree.addContent(writer.getMarkerAnchor( - SectionName.METHOD_DETAIL)); + methodDetailsTree.addContent(links.createAnchor(SectionName.METHOD_DETAIL)); Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, contents.methodDetailLabel); methodDetailsTree.addContent(heading); @@ -123,10 +123,9 @@ public Content getMethodDocTreeHeader(ExecutableElement method, Content methodDetailsTree) { String erasureAnchor; if ((erasureAnchor = getErasureAnchor(method)) != null) { - methodDetailsTree.addContent(writer.getMarkerAnchor((erasureAnchor))); + methodDetailsTree.addContent(links.createAnchor((erasureAnchor))); } - methodDetailsTree.addContent( - writer.getMarkerAnchor(writer.getAnchor(method))); + methodDetailsTree.addContent(links.createAnchor(writer.getAnchor(method))); Content methodDocTree = writer.getMemberTreeHeader(); Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); heading.addContent(name(method)); @@ -280,8 +279,7 @@ */ @Override public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( - SectionName.METHOD_SUMMARY)); + memberTree.addContent(links.createAnchor(SectionName.METHOD_SUMMARY)); } /** @@ -289,7 +287,7 @@ */ @Override public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { - inheritedTree.addContent(writer.getMarkerAnchor( + inheritedTree.addContent(links.createAnchor( SectionName.METHODS_INHERITANCE, configuration.getClassName(typeElement))); } @@ -365,7 +363,7 @@ Content methlink = writer.getLink( new LinkInfoImpl(writer.configuration, LinkInfoImpl.Kind.MEMBER, holder) - .where(writer.getName(writer.getAnchor(method))).label(method.getSimpleName())); + .where(writer.links.getName(writer.getAnchor(method))).label(method.getSimpleName())); Content codeMethLink = HtmlTree.CODE(methlink); Content dd = HtmlTree.DD(codeMethLink); dd.addContent(Contents.SPACE); @@ -435,11 +433,11 @@ protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { if (typeElement == null) { - return writer.getHyperLink( + return Links.createLink( SectionName.METHOD_SUMMARY, contents.navMethod); } else { - return writer.getHyperLink( + return links.createLink( SectionName.METHODS_INHERITANCE, configuration.getClassName(typeElement), contents.navMethod); } @@ -454,7 +452,7 @@ @Override protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink( + liNav.addContent(Links.createLink( SectionName.METHOD_DETAIL, contents.navMethod)); } else { liNav.addContent(contents.navMethod); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleFrameWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleFrameWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleFrameWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -36,6 +36,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; @@ -100,7 +101,7 @@ ? HtmlTree.MAIN() : body; Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, HtmlStyle.bar, - mdlgen.getHyperLink(DocPaths.moduleSummary(moduleElement), mdlLabel, "", "classFrame")); + Links.createLink(DocPaths.moduleSummary(moduleElement), mdlLabel, "", "classFrame")); htmlTree.addContent(heading); HtmlTree div = new HtmlTree(HtmlTag.DIV); div.setStyle(HtmlStyle.indexContainer); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexFrameWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexFrameWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexFrameWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -35,6 +35,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -138,7 +139,7 @@ * @param ul the Content object to which the all classes link should be added */ protected void addAllClassesLink(Content ul) { - Content linkContent = getHyperLink(DocPaths.ALLCLASSES_FRAME, + Content linkContent = Links.createLink(DocPaths.ALLCLASSES_FRAME, contents.allClassesLabel, "", "packageFrame"); Content li = HtmlTree.LI(linkContent); ul.addContent(li); @@ -151,7 +152,7 @@ * @param ul the Content object to which the all packages link should be added */ protected void addAllPackagesLink(Content ul) { - Content linkContent = getHyperLink(DocPaths.OVERVIEW_FRAME, + Content linkContent = Links.createLink(DocPaths.OVERVIEW_FRAME, contents.allPackagesLabel, "", "packageListFrame"); Content li = HtmlTree.LI(linkContent); ul.addContent(li); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModulePackageIndexFrameWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModulePackageIndexFrameWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModulePackageIndexFrameWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -37,6 +37,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -142,12 +143,12 @@ Content pkgLabel; if (!pkg.isUnnamed()) { pkgLabel = getPackageLabel(utils.getPackageName(pkg)); - packageLinkContent = getHyperLink(pathString(pkg, + packageLinkContent = Links.createLink(pathString(pkg, DocPaths.PACKAGE_FRAME), pkgLabel, "", "packageFrame"); } else { pkgLabel = new StringContent(""); - packageLinkContent = getHyperLink(DocPaths.PACKAGE_FRAME, + packageLinkContent = Links.createLink(DocPaths.PACKAGE_FRAME, pkgLabel, "", "packageFrame"); } Content li = HtmlTree.LI(packageLinkContent); @@ -188,7 +189,7 @@ * @param ul the Content object to which the all classes link should be added */ protected void addAllClassesLink(Content ul) { - Content linkContent = getHyperLink(DocPaths.ALLCLASSES_FRAME, + Content linkContent = Links.createLink(DocPaths.ALLCLASSES_FRAME, contents.allClassesLabel, "", "packageFrame"); Content li = HtmlTree.LI(linkContent); ul.addContent(li); @@ -201,7 +202,7 @@ * @param ul the Content object to which the all packages link should be added */ protected void addAllPackagesLink(Content ul) { - Content linkContent = getHyperLink(DocPaths.OVERVIEW_FRAME, + Content linkContent = Links.createLink(DocPaths.OVERVIEW_FRAME, contents.allPackagesLabel, "", "packageListFrame"); Content li = HtmlTree.LI(linkContent); ul.addContent(li); @@ -214,7 +215,7 @@ * @param ul the Content object to which the all modules link should be added */ protected void addAllModulesLink(Content ul) { - Content linkContent = getHyperLink(DocPaths.MODULE_OVERVIEW_FRAME, + Content linkContent = Links.createLink(DocPaths.MODULE_OVERVIEW_FRAME, contents.allModulesLabel, "", "packageListFrame"); Content li = HtmlTree.LI(linkContent); ul.addContent(li); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -50,6 +50,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -455,7 +456,7 @@ public void addSummaryHeader(Content startMarker, SectionName markerAnchor, Content heading, Content htmltree) { htmltree.addContent(startMarker); - htmltree.addContent(getMarkerAnchor(markerAnchor)); + htmltree.addContent(links.createAnchor(markerAnchor)); htmltree.addContent(HtmlTree.HEADING(HtmlTag.H3, heading)); } @@ -846,7 +847,7 @@ Content tree = configuration.allowTag(HtmlTag.SECTION) ? HtmlTree.SECTION() : moduleContentTree; addDeprecationInfo(tree); tree.addContent(HtmlConstants.START_OF_MODULE_DESCRIPTION); - tree.addContent(getMarkerAnchor(SectionName.MODULE_DESCRIPTION)); + tree.addContent(links.createAnchor(SectionName.MODULE_DESCRIPTION)); addInlineComment(mdle, tree); if (configuration.allowTag(HtmlTag.SECTION)) { moduleContentTree.addContent(tree); @@ -890,20 +891,20 @@ Content ulNav = HtmlTree.UL(HtmlStyle.subNavList, li); Content liNav = new HtmlTree(HtmlTag.LI); liNav.addContent(!utils.getFullBody(mdle).isEmpty() && !configuration.nocomment - ? getHyperLink(SectionName.MODULE_DESCRIPTION, contents.navModuleDescription) + ? Links.createLink(SectionName.MODULE_DESCRIPTION, contents.navModuleDescription) : contents.navModuleDescription); addNavGap(liNav); liNav.addContent((display(requires) || display(indirectModules)) - ? getHyperLink(SectionName.MODULES, contents.navModules) + ? Links.createLink(SectionName.MODULES, contents.navModules) : contents.navModules); addNavGap(liNav); liNav.addContent((display(exportedPackages) || display(openedPackages) || display(concealedPackages) || display(indirectPackages) || display(indirectOpenPackages)) - ? getHyperLink(SectionName.PACKAGES, contents.navPackages) + ? Links.createLink(SectionName.PACKAGES, contents.navPackages) : contents.navPackages); addNavGap(liNav); liNav.addContent((displayServices(uses, usesTrees) || displayServices(provides.keySet(), providesTrees)) - ? getHyperLink(SectionName.SERVICES, contents.navServices) + ? Links.createLink(SectionName.SERVICES, contents.navServices) : contents.navServices); ulNav.addContent(liNav); return ulNav; @@ -995,7 +996,7 @@ if (prevModule == null) { li = HtmlTree.LI(contents.prevModuleLabel); } else { - li = HtmlTree.LI(getHyperLink(pathToRoot.resolve(DocPaths.moduleSummary( + li = HtmlTree.LI(Links.createLink(pathToRoot.resolve(DocPaths.moduleSummary( prevModule)), contents.prevModuleLabel, "", "")); } return li; @@ -1012,7 +1013,7 @@ if (nextModule == null) { li = HtmlTree.LI(contents.nextModuleLabel); } else { - li = HtmlTree.LI(getHyperLink(pathToRoot.resolve(DocPaths.moduleSummary( + li = HtmlTree.LI(Links.createLink(pathToRoot.resolve(DocPaths.moduleSummary( nextModule)), contents.nextModuleLabel, "", "")); } return li; diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -37,6 +37,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; @@ -129,7 +130,7 @@ */ @Override public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( + memberTree.addContent(links.createAnchor( SectionName.NESTED_CLASS_SUMMARY)); } @@ -138,7 +139,7 @@ */ @Override public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { - inheritedTree.addContent(writer.getMarkerAnchor( + inheritedTree.addContent(links.createAnchor( SectionName.NESTED_CLASSES_INHERITANCE, utils.getFullyQualifiedName(typeElement))); } @@ -212,11 +213,11 @@ protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { if (typeElement == null) { - return writer.getHyperLink( + return Links.createLink( SectionName.NESTED_CLASS_SUMMARY, contents.navNested); } else { - return writer.getHyperLink( + return links.createLink( SectionName.NESTED_CLASSES_INHERITANCE, utils.getFullyQualifiedName(typeElement), contents.navNested); } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexFrameWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexFrameWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexFrameWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -33,6 +33,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -109,11 +110,11 @@ Content packageLabel; if (pe.isUnnamed()) { packageLabel = new StringContent(""); - packageLinkContent = getHyperLink(DocPaths.PACKAGE_FRAME, + packageLinkContent = Links.createLink(DocPaths.PACKAGE_FRAME, packageLabel, "", "packageFrame"); } else { packageLabel = getPackageLabel(pe.getQualifiedName()); - packageLinkContent = getHyperLink(pathString(pe, + packageLinkContent = Links.createLink(pathString(pe, DocPaths.PACKAGE_FRAME), packageLabel, "", "packageFrame"); } @@ -152,7 +153,7 @@ */ @Override protected void addAllClassesLink(Content ul) { - Content linkContent = getHyperLink(DocPaths.ALLCLASSES_FRAME, + Content linkContent = Links.createLink(DocPaths.ALLCLASSES_FRAME, contents.allClassesLabel, "", "packageFrame"); Content li = HtmlTree.LI(linkContent); ul.addContent(li); @@ -166,7 +167,7 @@ */ @Override protected void addAllModulesLink(Content ul) { - Content linkContent = getHyperLink(DocPaths.MODULE_OVERVIEW_FRAME, + Content linkContent = Links.createLink(DocPaths.MODULE_OVERVIEW_FRAME, contents.allModulesLabel, "", "packageListFrame"); Content li = HtmlTree.LI(linkContent); ul.addContent(li); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageTreeWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageTreeWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageTreeWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -31,6 +31,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; @@ -231,7 +232,7 @@ */ @Override protected Content getNavLinkPackage() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, + Content linkContent = Links.createLink(DocPaths.PACKAGE_SUMMARY, contents.packageLabel); Content li = HtmlTree.LI(linkContent); return li; diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -38,6 +38,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.ClassUseMapper; @@ -178,7 +179,7 @@ .setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast); for (String pkgname: usingPackageToUsedClasses.keySet()) { PackageElement pkg = utils.elementUtils.getPackageElement(pkgname); - Content packageLink = getHyperLink(utils.getPackageName(pkg), + Content packageLink = links.createLink(utils.getPackageName(pkg), new StringContent(utils.getPackageName(pkg))); Content summary = new ContentBuilder(); if (pkg != null && !pkg.isUnnamed()) { @@ -205,7 +206,7 @@ HtmlTree li = new HtmlTree(HtmlTag.LI); li.setStyle(HtmlStyle.blockList); if (usingPackage != null) { - li.addContent(getMarkerAnchor(utils.getPackageName(usingPackage))); + li.addContent(links.createAnchor(utils.getPackageName(usingPackage))); } String tableSummary = resources.getText("doclet.Use_Table_Summary", resources.getText("doclet.classes")); @@ -222,7 +223,7 @@ DocPath dp = pathString(te, DocPaths.CLASS_USE.resolve(DocPath.forName(utils, te))); Content stringContent = new StringContent(utils.getSimpleName(te)); - Content typeContent = getHyperLink(dp.fragment(getPackageAnchorName(usingPackage)), + Content typeContent = Links.createLink(dp.fragment(getPackageAnchorName(usingPackage)), stringContent); Content summary = new ContentBuilder(); addIndexComment(te, summary); @@ -287,7 +288,7 @@ */ @Override protected Content getNavLinkPackage() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, + Content linkContent = Links.createLink(DocPaths.PACKAGE_SUMMARY, contents.packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -311,7 +312,7 @@ */ @Override protected Content getNavLinkTree() { - Content linkContent = getHyperLink(DocPaths.PACKAGE_TREE, + Content linkContent = Links.createLink(DocPaths.PACKAGE_TREE, contents.treeLabel); Content li = HtmlTree.LI(linkContent); return li; diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -40,6 +40,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.PackageSummaryWriter; @@ -320,7 +321,7 @@ public void addPackageDescription(Content packageContentTree) { if (!utils.getBody(packageElement).isEmpty()) { Content tree = configuration.allowTag(HtmlTag.SECTION) ? sectionTree : packageContentTree; - tree.addContent(getMarkerAnchor(SectionName.PACKAGE_DESCRIPTION)); + tree.addContent(links.createAnchor(SectionName.PACKAGE_DESCRIPTION)); addDeprecationInfo(tree); addInlineComment(packageElement, tree); } @@ -384,7 +385,7 @@ */ @Override protected Content getNavLinkClassUse() { - Content useLink = getHyperLink(DocPaths.PACKAGE_USE, + Content useLink = Links.createLink(DocPaths.PACKAGE_USE, contents.useLabel, "", ""); Content li = HtmlTree.LI(useLink); return li; @@ -402,7 +403,7 @@ li = HtmlTree.LI(contents.prevPackageLabel); } else { DocPath p = DocPath.relativePath(packageElement, prev); - li = HtmlTree.LI(getHyperLink(p.resolve(DocPaths.PACKAGE_SUMMARY), + li = HtmlTree.LI(Links.createLink(p.resolve(DocPaths.PACKAGE_SUMMARY), contents.prevPackageLabel, "", "")); } return li; @@ -420,7 +421,7 @@ li = HtmlTree.LI(contents.nextPackageLabel); } else { DocPath p = DocPath.relativePath(packageElement, next); - li = HtmlTree.LI(getHyperLink(p.resolve(DocPaths.PACKAGE_SUMMARY), + li = HtmlTree.LI(Links.createLink(p.resolve(DocPaths.PACKAGE_SUMMARY), contents.nextPackageLabel, "", "")); } return li; @@ -434,7 +435,7 @@ */ @Override protected Content getNavLinkTree() { - Content useLink = getHyperLink(DocPaths.PACKAGE_TREE, + Content useLink = Links.createLink(DocPaths.PACKAGE_TREE, contents.treeLabel, "", ""); Content li = HtmlTree.LI(useLink); return li; diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -37,6 +37,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; @@ -90,8 +91,7 @@ Content memberDetailsTree) { memberDetailsTree.addContent(HtmlConstants.START_OF_PROPERTY_DETAILS); Content propertyDetailsTree = writer.getMemberTreeHeader(); - propertyDetailsTree.addContent(writer.getMarkerAnchor( - SectionName.PROPERTY_DETAIL)); + propertyDetailsTree.addContent(links.createAnchor(SectionName.PROPERTY_DETAIL)); Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, contents.propertyDetailsLabel); propertyDetailsTree.addContent(heading); @@ -104,8 +104,7 @@ @Override public Content getPropertyDocTreeHeader(ExecutableElement property, Content propertyDetailsTree) { - propertyDetailsTree.addContent( - writer.getMarkerAnchor(name(property))); + propertyDetailsTree.addContent(links.createAnchor(name(property))); Content propertyDocTree = writer.getMemberTreeHeader(); Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); heading.addContent(utils.getPropertyLabel(name(property))); @@ -243,8 +242,7 @@ */ @Override public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { - memberTree.addContent(writer.getMarkerAnchor( - SectionName.PROPERTY_SUMMARY)); + memberTree.addContent(links.createAnchor(SectionName.PROPERTY_SUMMARY)); } /** @@ -252,7 +250,7 @@ */ @Override public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { - inheritedTree.addContent(writer.getMarkerAnchor( + inheritedTree.addContent(links.createAnchor( SectionName.PROPERTIES_INHERITANCE, configuration.getClassName(typeElement))); } @@ -334,13 +332,13 @@ protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { if (link) { if (typeElement == null) { - return writer.getHyperLink( - SectionName.PROPERTY_SUMMARY, - contents.navProperty); + return Links.createLink( + SectionName.PROPERTY_SUMMARY, + contents.navProperty); } else { - return writer.getHyperLink( - SectionName.PROPERTIES_INHERITANCE, - configuration.getClassName(typeElement), contents.navProperty); + return links.createLink( + SectionName.PROPERTIES_INHERITANCE, + configuration.getClassName(typeElement), contents.navProperty); } } else { return contents.navProperty; @@ -353,7 +351,7 @@ @Override protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink( + liNav.addContent(Links.createLink( SectionName.PROPERTY_DETAIL, contents.navProperty)); } else { diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -168,7 +168,7 @@ ? getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.DEFAULT, typeElement) .label(configuration.getClassName(typeElement))) : new StringContent(utils.getFullyQualifiedName(typeElement)); - Content li = HtmlTree.LI(HtmlStyle.blockList, getMarkerAnchor( + Content li = HtmlTree.LI(HtmlStyle.blockList, links.createAnchor( utils.getFullyQualifiedName(typeElement))); Content superClassLink = typeElement.getSuperclass() != null ? getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.SERIALIZED_FORM, diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SingleIndexWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SingleIndexWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SingleIndexWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -141,7 +141,7 @@ for (Object ch : elements) { String unicode = ch.toString(); contentTree.addContent( - getHyperLink(getNameForIndex(unicode), + links.createLink(getNameForIndex(unicode), new StringContent(unicode))); contentTree.addContent(Contents.SPACE); } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SplitIndexWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SplitIndexWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SplitIndexWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -35,6 +35,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; @@ -176,7 +177,7 @@ protected void addLinksForIndexes(Content contentTree) { for (int i = 0; i < indexElements.size(); i++) { int j = i + 1; - contentTree.addContent(getHyperLink(DocPaths.indexN(j), + contentTree.addContent(Links.createLink(DocPaths.indexN(j), new StringContent(indexElements.get(i).toString()))); contentTree.addContent(Contents.SPACE); } @@ -194,7 +195,7 @@ return HtmlTree.LI(prevletterLabel); } else { - Content prevLink = getHyperLink(DocPaths.indexN(prev), + Content prevLink = Links.createLink(DocPaths.indexN(prev), prevletterLabel); return HtmlTree.LI(prevLink); } @@ -212,7 +213,7 @@ return HtmlTree.LI(nextletterLabel); } else { - Content nextLink = getHyperLink(DocPaths.indexN(next), + Content nextLink = Links.createLink(DocPaths.indexN(next), nextletterLabel); return HtmlTree.LI(nextLink); } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java Thu Nov 16 15:16:21 2017 -0800 @@ -40,6 +40,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; @@ -105,7 +106,7 @@ } String desc = ch.getText(itt.getDescription()); - String anchorName = htmlWriter.getName(tagText); + String anchorName = configuration.links.getName(tagText); Content result = HtmlTree.A_ID(HtmlStyle.searchTagResult, anchorName, new StringContent(tagText)); if (configuration.createindex && !tagText.isEmpty()) { SearchIndexItem si = new SearchIndexItem(); @@ -287,7 +288,7 @@ ((ClassWriterImpl) htmlWriter).getTypeElement().getQualifiedName() + "." + utils.getSimpleName(holder); DocLink link = constantsPath.fragment(whichConstant); - body.addContent(htmlWriter.getHyperLink(link, + body.addContent(Links.createLink(link, new StringContent(configuration.getText("doclet.Constants_Summary")))); } if (utils.isClass(holder) && utils.isSerializable((TypeElement)holder)) { @@ -297,7 +298,7 @@ appendSeparatorIfNotEmpty(body); DocPath serialPath = htmlWriter.pathToRoot.resolve(DocPaths.SERIALIZED_FORM); DocLink link = serialPath.fragment(utils.getFullyQualifiedName(holder)); - body.addContent(htmlWriter.getHyperLink(link, + body.addContent(Links.createLink(link, new StringContent(configuration.getText("doclet.Serialized_Form")))); } } diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TreeWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TreeWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TreeWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -33,6 +33,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Links; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; @@ -161,7 +162,7 @@ continue; } DocPath link = pathString(pkg, DocPaths.PACKAGE_TREE); - Content li = HtmlTree.LI(getHyperLink(link, + Content li = HtmlTree.LI(Links.createLink(link, new StringContent(utils.getPackageName(pkg)))); if (i < packages.size() - 1) { li.addContent(", "); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlDocWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlDocWriter.java Thu Nov 16 15:13:44 2017 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlDocWriter.java Thu Nov 16 15:16:21 2017 -0800 @@ -30,7 +30,6 @@ import javax.lang.model.element.TypeElement; import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration; -import jdk.javadoc.internal.doclets.formats.html.SectionName; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.Messages; import jdk.javadoc.internal.doclets.toolkit.util.DocFile; @@ -69,213 +68,6 @@ DocFile.createFileForOutput(configuration, filename).getPath()); } - public Content getHyperLink(DocPath link, String label) { - return getHyperLink(link, new StringContent(label), false, "", "", ""); - } - - /** - * Get Html Hyper Link Content. - * - * @param where Position of the link in the file. Character '#' is not - * needed. - * @param label Tag for the link. - * @return a content tree for the hyper link - */ - public Content getHyperLink(String where, - Content label) { - return getHyperLink(getDocLink(where), label, "", ""); - } - - /** - * Get Html Hyper Link Content. - * - * @param sectionName The section name to which the link will be created. - * @param label Tag for the link. - * @return a content tree for the hyper link - */ - public Content getHyperLink(SectionName sectionName, - Content label) { - return getHyperLink(getDocLink(sectionName), label, "", ""); - } - - /** - * Get Html Hyper Link Content. - * - * @param sectionName The section name combined with where to which the link - * will be created. - * @param where The fragment combined with sectionName to which the link - * will be created. - * @param label Tag for the link. - * @return a content tree for the hyper link - */ - public Content getHyperLink(SectionName sectionName, String where, - Content label) { - return getHyperLink(getDocLink(sectionName, where), label, "", ""); - } - - /** - * Get the link. - * - * @param where Position of the link in the file. - * @return a DocLink object for the hyper link - */ - public DocLink getDocLink(String where) { - return DocLink.fragment(getName(where)); - } - - /** - * Get the link. - * - * @param sectionName The section name to which the link will be created. - * @return a DocLink object for the hyper link - */ - public DocLink getDocLink(SectionName sectionName) { - return DocLink.fragment(sectionName.getName()); - } - - /** - * Get the link. - * - * @param sectionName The section name combined with where to which the link - * will be created. - * @param where The fragment combined with sectionName to which the link - * will be created. - * @return a DocLink object for the hyper link - */ - public DocLink getDocLink(SectionName sectionName, String where) { - return DocLink.fragment(sectionName.getName() + getName(where)); - } - - /** - * Convert the name to a valid HTML name. - * - * @param name the name that needs to be converted to valid HTML name. - * @return a valid HTML name string. - */ - public String getName(String name) { - /* The HTML 4 spec at http://www.w3.org/TR/html4/types.html#h-6.2 mentions - * that the name/id should begin with a letter followed by other valid characters. - * The HTML 5 spec (draft) is more permissive on names/ids where the only restriction - * is that it should be at least one character long and should not contain spaces. - * The spec draft is @ http://www.w3.org/html/wg/drafts/html/master/dom.html#the-id-attribute. - * - * For HTML 4, we need to check for non-characters at the beginning of the name and - * substitute it accordingly, "_" and "$" can appear at the beginning of a member name. - * The method substitutes "$" with "Z:Z:D" and will prefix "_" with "Z:Z". - */ - - if (configuration.isOutputHtml5()) { - return name.replaceAll(" +", ""); - } - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < name.length(); i++) { - char ch = name.charAt(i); - switch (ch) { - case '(': - case ')': - case '<': - case '>': - case ',': - sb.append('-'); - break; - case ' ': - case '[': - break; - case ']': - sb.append(":A"); - break; - // Any appearance of $ needs to be substituted with ":D" and not with hyphen - // since a field name "P$$ and a method P(), both valid member names, can end - // up as "P--". A member name beginning with $ needs to be substituted with - // "Z:Z:D". - case '$': - if (i == 0) - sb.append("Z:Z"); - sb.append(":D"); - break; - // A member name beginning with _ needs to be prefixed with "Z:Z" since valid anchor - // names can only begin with a letter. - case '_': - if (i == 0) - sb.append("Z:Z"); - sb.append(ch); - break; - default: - sb.append(ch); - } - } - return sb.toString(); - } - - /** - * Get Html hyperlink. - * - * @param link path of the file. - * @param label Tag for the link. - * @return a content tree for the hyper link - */ - public Content getHyperLink(DocPath link, Content label) { - return getHyperLink(link, label, "", ""); - } - - public Content getHyperLink(DocLink link, Content label) { - return getHyperLink(link, label, "", ""); - } - - public Content getHyperLink(DocPath link, - Content label, boolean strong, - String stylename, String title, String target) { - return getHyperLink(new DocLink(link), label, strong, - stylename, title, target); - } - - public Content getHyperLink(DocLink link, - Content label, boolean strong, - String stylename, String title, String target) { - Content body = label; - if (strong) { - body = HtmlTree.SPAN(HtmlStyle.typeNameLink, body); - } - if (stylename != null && stylename.length() != 0) { - HtmlTree t = new HtmlTree(HtmlTag.FONT, body); - t.addAttr(HtmlAttr.CLASS, stylename); - body = t; - } - HtmlTree l = HtmlTree.A(link.toString(), body); - if (title != null && title.length() != 0) { - l.addAttr(HtmlAttr.TITLE, title); - } - if (target != null && target.length() != 0) { - l.addAttr(HtmlAttr.TARGET, target); - } - return l; - } - - /** - * Get Html Hyper Link. - * - * @param link String name of the file. - * @param label Tag for the link. - * @param title String that describes the link's content for accessibility. - * @param target Target frame. - * @return a content tree for the hyper link. - */ - public Content getHyperLink(DocPath link, Content label, String title, String target) { - return getHyperLink(new DocLink(link), label, title, target); - } - - public Content getHyperLink(DocLink link, Content label, String title, String target) { - HtmlTree anchor = HtmlTree.A(link.toString(), label); - if (title != null && title.length() != 0) { - anchor.addAttr(HtmlAttr.TITLE, title); - } - if (target != null && target.length() != 0) { - anchor.addAttr(HtmlAttr.TARGET, target); - } - return anchor; - } - public Content getModuleFramesHyperLink(ModuleElement mdle, Content label, String target) { DocLink mdlLink = new DocLink(DocPaths.moduleFrame(mdle)); DocLink mtFrameLink = new DocLink(DocPaths.moduleTypeFrame(mdle)); diff -r 0e38db7cf1cc -r 4a28dc8a86c2 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Links.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Links.java Thu Nov 16 15:16:21 2017 -0800 @@ -0,0 +1,347 @@ +/* + * Copyright (c) 1997, 2017, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package jdk.javadoc.internal.doclets.formats.html.markup; + +import jdk.javadoc.internal.doclets.formats.html.SectionName; +import jdk.javadoc.internal.doclets.toolkit.Content; +import jdk.javadoc.internal.doclets.toolkit.util.DocLink; +import jdk.javadoc.internal.doclets.toolkit.util.DocPath; + +/** + * Factory for HTML A elements, both links (with a {@code href} attribute) + * and anchors (with an {@code id} or {@code name} attribute). + * + * Most methods in this class are static factory methods. + * The exceptions are those methods that directly or indirectly depend on the HTML version + * being used, when determining valid HTML names (ids), + * and those methods that generate anchors. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class Links { + + private final HtmlVersion version; + + /** + * Creates a {@code Links} object for a specific HTML version. + * The version is used by the {@link #getName(String) getName} method + * to help determine valid HTML names (ids), and to determine whether + * to use an {@code id} or {@code name} attribute when creating anchors. + * + * @param version the HTML version + */ + public Links(HtmlVersion version) { + this.version = version; + } + + /** + * Creates an anchor of the form {@code }. + * In HTML4, a {@code name} attribute will be generated instead of an {@code id} attribute. + * + * @param name the value for the {@code id} or {@code name} attribute + * @return a content tree for the anchor + */ + public Content createAnchor(String name) { + return createAnchor(getName(name), null); + } + + /** + * Creates an anchor of the form {@code }. + * In HTML4, a {@code name} attribute will be generated instead of an {@code id} attribute. + * + * @param sectionName the value for the {@code id} or {@code name} attribute + * @return a content tree for the anchor + */ + public Content createAnchor(SectionName sectionName) { + return createAnchor(sectionName.getName(), null); + } + + /** + * Creates an anchor of the form {@code }. + * In HTML4, a {@code name} attribute will be generated instead of an {@code id} attribute. + * + * @param sectionName the first part of the value for the {@code id} or {@code name} attribute + * @param name the second part of the value for the {@code id} or {@code name} attribute + * @return a content tree for the anchor + */ + public Content createAnchor(SectionName sectionName, String name) { + return createAnchor(sectionName.getName() + getName(name), null); + } + + /** + * Creates an anchor of the form {@code content}. + * In HTML4, a {@code name} attribute will be generated instead of an {@code id} attribute. + * + * @param name the value for the {@code id} or {@code name} attribute + * @param content the content that should be added to the anchor, + * or null, to use an empty comment + * @return a content tree for the marker anchor + */ + public Content createAnchor(String name, Content content) { + return HtmlTree.A(version, name, (content == null ? EMPTY_COMMENT : content)); + } + + private static final Content EMPTY_COMMENT = new Comment(" "); + + /** + * Creates a link of the form {@code label}. + * + * @param where the position of the link in the file + * @param label the content for the link + * @return a content tree for the link + */ + public Content createLink(String where, Content label) { + DocLink l = DocLink.fragment(getName(where)); + return Links.createLink(l, label, "", ""); + } + + /** + * Creates a link of the form {@code label}. + * + * @param sectionName the section name to which the link will be created + * @param label the content for the link + * @return a content tree for the link + */ + public static Content createLink(SectionName sectionName, Content label) { + DocLink l = DocLink.fragment(sectionName.getName()); + return Links.createLink(l, label, "", ""); + } + + /** + * Creates a link of the form {@code label}. + * + * @param sectionName the section name combined with where to which the link + * will be created + * @param where the fragment combined with sectionName to which the link + * will be created + * @param label the content for the link + * @return a content tree for the link + */ + public Content createLink(SectionName sectionName, String where, Content label) { + DocLink l = DocLink.fragment(sectionName.getName() + getName(where)); + return Links.createLink(l, label, "", ""); + } + + /** + * Creates a link of the form {@code label}. + * + * @param sectionName the section name to which the link will be created + * @param label the content for the link + * @param title the title for the link + * @param target the target for the link, or null + * @return a content tree for the link + */ + public static Content createLink(SectionName sectionName, Content label, String title, String target) { + DocLink l = DocLink.fragment(sectionName.getName()); + return createLink(l, label, title, target); + } + + /** + * Creates a link of the form {@code label}. + * + * @param path the path for the link + * @param label the content for the link + * @return a content tree for the link + */ + public static Content createLink(DocPath path, String label) { + return Links.createLink(path, new StringContent(label), false, "", "", ""); + } + + /** + * Creates a link of the form {@code label}. + * + * @param path the path for the link + * @param label the content for the link + * @return a content tree for the link + */ + public static Content createLink(DocPath path, Content label) { + return Links.createLink(path, label, "", ""); + } + + /** + * Creates a link of the form {@code label}. + * If {@code strong} is set, the label will be wrapped in + * {@code ...}. + * + * @param path the path for the link + * @param label the content for the link + * @param strong whether to wrap the {@code label} in a SPAN element + * @param stylename (deprecated) + * @param title the title for the link + * @param target the target for the link, or null + * @return a content tree for the link + */ + public static Content createLink(DocPath path, Content label, boolean strong, String stylename, + String title, String target) { + return createLink(new DocLink(path), label, strong, stylename, title, target); + } + + /** + * Creates a link of the form {@code label}. + * + * @param path the path for the link + * @param label the content for the link + * @param title the title for the link + * @param target the target for the link, or null + * @return a content tree for the link + */ + public static Content createLink(DocPath path, Content label, String title, String target) { + return Links.createLink(new DocLink(path), label, title, target); + } + + /** + * Creates a link of the form {@code label}. + * + * @param link the details for the link + * @param label the content for the link + * @return a content tree for the link + */ + public static Content createLink(DocLink link, Content label) { + return Links.createLink(link, label, "", ""); + } + + /** + * Creates a link of the form {@code label}. + * + * @param link the details for the link + * @param label the content for the link + * @param title the title for the link + * @param target the target for the link, or null + * @return a content tree for the link + */ + public static Content createLink(DocLink link, Content label, String title, String target) { + HtmlTree anchor = HtmlTree.A(link.toString(), label); + if (title != null && title.length() != 0) { + anchor.addAttr(HtmlAttr.TITLE, title); + } + if (target != null && target.length() != 0) { + anchor.addAttr(HtmlAttr.TARGET, target); + } + return anchor; + } + + /** + * Creates a link of the form {@code label}. + * If {@code strong} is set, the label will be wrapped in + * {@code ...}. + * + * @param link the details for the link + * @param label the content for the link + * @param strong whether to wrap the {@code label} in a SPAN element + * @param stylename (deprecated) + * @param title the title for the link + * @param target the target for the link, or null + * @return a content tree for the link + */ + public static Content createLink(DocLink link, Content label, boolean strong, String stylename, + String title, String target) { + Content body = label; + if (strong) { + body = HtmlTree.SPAN(HtmlStyle.typeNameLink, body); + } + if (stylename != null && stylename.length() != 0) { + HtmlTree t = new HtmlTree(HtmlTag.FONT, body); + t.addAttr(HtmlAttr.CLASS, stylename); + body = t; + } + HtmlTree l = HtmlTree.A(link.toString(), body); + if (title != null && title.length() != 0) { + l.addAttr(HtmlAttr.TITLE, title); + } + if (target != null && target.length() != 0) { + l.addAttr(HtmlAttr.TARGET, target); + } + return l; + } + + + /** + * Converts a name to a valid HTML name (id). + * This depends on the HTML version specified when the {@code Links} object was created. + * + * @param name the string that needs to be converted to a valid HTML name + * @return a valid HTML name + */ + public String getName(String name) { + /* The HTML 4 spec at http://www.w3.org/TR/html4/types.html#h-6.2 mentions + * that the name/id should begin with a letter followed by other valid characters. + * The HTML 5 spec (draft) is more permissive on names/ids where the only restriction + * is that it should be at least one character long and should not contain spaces. + * The spec draft is @ http://www.w3.org/html/wg/drafts/html/master/dom.html#the-id-attribute. + * + * For HTML 4, we need to check for non-characters at the beginning of the name and + * substitute it accordingly, "_" and "$" can appear at the beginning of a member name. + * The method substitutes "$" with "Z:Z:D" and will prefix "_" with "Z:Z". + */ + + if (version == HtmlVersion.HTML5) { + return name.replaceAll(" +", ""); + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < name.length(); i++) { + char ch = name.charAt(i); + switch (ch) { + case '(': + case ')': + case '<': + case '>': + case ',': + sb.append('-'); + break; + case ' ': + case '[': + break; + case ']': + sb.append(":A"); + break; + // Any appearance of $ needs to be substituted with ":D" and not with hyphen + // since a field name "P$$ and a method P(), both valid member names, can end + // up as "P--". A member name beginning with $ needs to be substituted with + // "Z:Z:D". + case '$': + if (i == 0) + sb.append("Z:Z"); + sb.append(":D"); + break; + // A member name beginning with _ needs to be prefixed with "Z:Z" since valid anchor + // names can only begin with a letter. + case '_': + if (i == 0) + sb.append("Z:Z"); + sb.append(ch); + break; + default: + sb.append(ch); + } + } + return sb.toString(); + } + +}