8190821: Introduce a new Links builder class

Reviewed-by: bpatel, ksrini
This commit is contained in:
Jonathan Gibbons 2017-11-16 15:16:21 -08:00
parent 7f0a1c7e36
commit 29cd769953
36 changed files with 569 additions and 436 deletions

View File

@ -358,6 +358,6 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite
}
}
buf.append(")");
return foundTypeVariable ? writer.getName(buf.toString()) : null;
return foundTypeVariable ? configuration.links.getName(buf.toString()) : null;
}
}

View File

@ -222,6 +222,7 @@ public class AbstractIndexWriter extends HtmlDocletWriter {
*
* @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 @@ public class AbstractIndexWriter extends HtmlDocletWriter {
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 @@ public class AbstractIndexWriter extends HtmlDocletWriter {
* @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 @@ public class AbstractIndexWriter extends HtmlDocletWriter {
* @return a valid HTML name string.
*/
public String getNameForIndex(String unicode) {
return "I:" + getName(unicode);
return "I:" + links.getName(unicode);
}
/**
@ -452,6 +453,13 @@ public class AbstractIndexWriter extends HtmlDocletWriter {
}
/**
* 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,

View File

@ -44,6 +44,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.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 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
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 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
this.utils = configuration.utils;
this.contents = configuration.contents;
this.resources = configuration.resources;
this.links = configuration.links;
}
public AbstractMemberWriter(SubWriterHolderWriter writer) {
@ -519,6 +522,7 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
* @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<? extends DocTree> firstSentenceTags) {
if (tElement != typeElement) {

View File

@ -39,6 +39,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.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 class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
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 class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
*/
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 @@ public class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
/**
* {@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 @@ public class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
*/
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 @@ public class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
*/
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 {

View File

@ -35,6 +35,7 @@ import javax.lang.model.element.TypeElement;
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 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
*/
@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 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
@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 {

View File

@ -40,6 +40,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.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 class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter
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 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter
/**
* {@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 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter
* {@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 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter
*/
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 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter
*/
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 {

View File

@ -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.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 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter
*/
@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 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter
*/
@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 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter
*/
@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;

View File

@ -47,6 +47,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.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 @@ public class ClassUseWriter extends SubWriterHolderWriter {
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 @@ public class ClassUseWriter extends SubWriterHolderWriter {
*/
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 @@ public class ClassUseWriter extends SubWriterHolderWriter {
*/
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 @@ public class ClassUseWriter extends SubWriterHolderWriter {
*/
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;
}

View File

@ -40,6 +40,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.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 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite
*/
@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 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite
*/
@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 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite
*/
@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;

View File

@ -40,6 +40,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.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 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
//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 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
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 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
* @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);

View File

@ -38,6 +38,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.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 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
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 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
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 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
*/
@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 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
@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 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
@Override
protected void addNavDetailLink(boolean link, Content liNav) {
if (link) {
liNav.addContent(writer.getHyperLink(
liNav.addContent(Links.createLink(
SectionName.CONSTRUCTOR_DETAIL,
contents.navConstructor));
} else {

View File

@ -325,7 +325,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
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 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
*/
private void addAnchor(DeprecatedAPIListBuilder builder, DeprElementKind kind, Content htmlTree) {
if (builder.hasDocumentation(kind)) {
htmlTree.addContent(getMarkerAnchor(getAnchorName(kind)));
htmlTree.addContent(links.createAnchor(getAnchorName(kind)));
}
}

View File

@ -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.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 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
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 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
@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 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
*/
@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 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
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 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
@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 {

View File

@ -39,6 +39,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.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 class FieldWriterImpl extends AbstractMemberWriter
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 @@ public class FieldWriterImpl extends AbstractMemberWriter
*/
@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 @@ public class FieldWriterImpl extends AbstractMemberWriter
*/
@Override
public void addSummaryAnchor(TypeElement typeElement, Content memberTree) {
memberTree.addContent(writer.getMarkerAnchor(
memberTree.addContent(links.createAnchor(
SectionName.FIELD_SUMMARY));
}
@ -235,7 +236,7 @@ public class FieldWriterImpl extends AbstractMemberWriter
*/
@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 @@ public class FieldWriterImpl extends AbstractMemberWriter
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 @@ public class FieldWriterImpl extends AbstractMemberWriter
@Override
protected void addNavDetailLink(boolean link, Content liNav) {
if (link) {
liNav.addContent(writer.getHyperLink(
liNav.addContent(Links.createLink(
SectionName.FIELD_DETAIL,
contents.navField));
} else {

View File

@ -29,6 +29,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.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 @@ public class HelpWriter extends HtmlDocletWriter {
? 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 @@ public class HelpWriter extends HtmlDocletWriter {
? 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 @@ public class HelpWriter extends HtmlDocletWriter {
? 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 @@ public class HelpWriter extends HtmlDocletWriter {
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 @@ public class HelpWriter extends HtmlDocletWriter {
? 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 @@ public class HelpWriter extends HtmlDocletWriter {
? 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);

View File

@ -44,6 +44,7 @@ import jdk.javadoc.doclet.DocletEnvironment;
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 @@ public class HtmlConfiguration extends BaseConfiguration {
protected Set<Character> 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 @@ public class HtmlConfiguration extends BaseConfiguration {
setTopFile(docEnv);
workArounds.initDocLint(doclintOpts.values(), tagletManager.getCustomTagNames(),
Utils.toLowerCase(htmlVersion.name()));
links = new Links(htmlVersion);
return true;
}

View File

@ -77,6 +77,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlDocument;
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
protected final Resources resources;
protected final Links links;
/**
* To check whether annotation heading is printed or not.
*/
@ -196,6 +199,7 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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 class HtmlDocletWriter extends HtmlDocWriter {
*/
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 class HtmlDocletWriter extends HtmlDocWriter {
*/
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
* @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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
+ "//-->\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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
* @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 class HtmlDocletWriter extends HtmlDocWriter {
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 class HtmlDocletWriter extends HtmlDocWriter {
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
*/
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
* @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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
* @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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
* @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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
* @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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
* @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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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;
@ -902,51 +906,6 @@ public class HtmlDocletWriter extends HtmlDocWriter {
return caption;
}
/**
* 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.
*
@ -1039,12 +998,12 @@ public class HtmlDocletWriter extends HtmlDocWriter {
}
}
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 class HtmlDocletWriter extends HtmlDocWriter {
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
*/
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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 @@ public class HtmlDocletWriter extends HtmlDocWriter {
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) {

View File

@ -33,6 +33,7 @@ import javax.lang.model.element.TypeElement;
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 @@ public class LinkFactoryImpl extends LinkFactory {
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));
}

View File

@ -40,6 +40,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.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 class MethodWriterImpl extends AbstractExecutableMemberWriter
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 class MethodWriterImpl extends AbstractExecutableMemberWriter
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 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
*/
@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 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
*/
@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 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
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 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
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 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
@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);

View File

@ -36,6 +36,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.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 @@ public class ModuleFrameWriter extends HtmlDocletWriter {
? 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);

View File

@ -35,6 +35,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.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 @@ public class ModuleIndexFrameWriter extends AbstractModuleIndexWriter {
* @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 @@ public class ModuleIndexFrameWriter extends AbstractModuleIndexWriter {
* @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);

View File

@ -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.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 @@ public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
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("<unnamed package>");
packageLinkContent = getHyperLink(DocPaths.PACKAGE_FRAME,
packageLinkContent = Links.createLink(DocPaths.PACKAGE_FRAME,
pkgLabel, "", "packageFrame");
}
Content li = HtmlTree.LI(packageLinkContent);
@ -188,7 +189,7 @@ public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
* @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 @@ public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
* @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 @@ public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
* @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);

View File

@ -50,6 +50,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.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 class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
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 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
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 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
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 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
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 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
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;

View File

@ -37,6 +37,7 @@ import javax.lang.model.element.TypeElement;
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 @@ public class NestedClassWriterImpl extends AbstractMemberWriter
*/
@Override
public void addSummaryAnchor(TypeElement typeElement, Content memberTree) {
memberTree.addContent(writer.getMarkerAnchor(
memberTree.addContent(links.createAnchor(
SectionName.NESTED_CLASS_SUMMARY));
}
@ -138,7 +139,7 @@ public class NestedClassWriterImpl extends AbstractMemberWriter
*/
@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 @@ public class NestedClassWriterImpl extends AbstractMemberWriter
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);
}

View File

@ -33,6 +33,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.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 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter {
Content packageLabel;
if (pe.isUnnamed()) {
packageLabel = new StringContent("<unnamed package>");
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 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter {
*/
@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 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter {
*/
@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);

View File

@ -31,6 +31,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.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 @@ public class PackageTreeWriter extends AbstractTreeWriter {
*/
@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;

View File

@ -38,6 +38,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.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 @@ public class PackageUseWriter extends SubWriterHolderWriter {
.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 @@ public class PackageUseWriter extends SubWriterHolderWriter {
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 @@ public class PackageUseWriter extends SubWriterHolderWriter {
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 @@ public class PackageUseWriter extends SubWriterHolderWriter {
*/
@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 @@ public class PackageUseWriter extends SubWriterHolderWriter {
*/
@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;

View File

@ -40,6 +40,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.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 class PackageWriterImpl extends HtmlDocletWriter
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 @@ public class PackageWriterImpl extends HtmlDocletWriter
*/
@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 @@ public class PackageWriterImpl extends HtmlDocletWriter
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 @@ public class PackageWriterImpl extends HtmlDocletWriter
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 @@ public class PackageWriterImpl extends HtmlDocletWriter
*/
@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;

View File

@ -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.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 @@ public class PropertyWriterImpl extends AbstractMemberWriter
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 @@ public class PropertyWriterImpl extends AbstractMemberWriter
@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 @@ public class PropertyWriterImpl extends AbstractMemberWriter
*/
@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 @@ public class PropertyWriterImpl extends AbstractMemberWriter
*/
@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 @@ public class PropertyWriterImpl extends AbstractMemberWriter
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 @@ public class PropertyWriterImpl extends AbstractMemberWriter
@Override
protected void addNavDetailLink(boolean link, Content liNav) {
if (link) {
liNav.addContent(writer.getHyperLink(
liNav.addContent(Links.createLink(
SectionName.PROPERTY_DETAIL,
contents.navProperty));
} else {

View File

@ -168,7 +168,7 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter
? 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,

View File

@ -141,7 +141,7 @@ public class SingleIndexWriter extends AbstractIndexWriter {
for (Object ch : elements) {
String unicode = ch.toString();
contentTree.addContent(
getHyperLink(getNameForIndex(unicode),
links.createLink(getNameForIndex(unicode),
new StringContent(unicode)));
contentTree.addContent(Contents.SPACE);
}

View File

@ -35,6 +35,7 @@ import java.util.TreeSet;
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 @@ public class SplitIndexWriter extends AbstractIndexWriter {
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 @@ public class SplitIndexWriter extends AbstractIndexWriter {
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 @@ public class SplitIndexWriter extends AbstractIndexWriter {
return HtmlTree.LI(nextletterLabel);
}
else {
Content nextLink = getHyperLink(DocPaths.indexN(next),
Content nextLink = Links.createLink(DocPaths.indexN(next),
nextletterLabel);
return HtmlTree.LI(nextLink);
}

View File

@ -40,6 +40,7 @@ import com.sun.source.doctree.IndexTree;
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 @@ public class TagletWriterImpl extends TagletWriter {
}
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 @@ public class TagletWriterImpl extends TagletWriter {
((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 @@ public class TagletWriterImpl extends TagletWriter {
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"))));
}
}

View File

@ -33,6 +33,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.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 @@ public class TreeWriter extends AbstractTreeWriter {
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(", ");

View File

@ -30,7 +30,6 @@ import javax.lang.model.element.PackageElement;
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 @@ public abstract class HtmlDocWriter {
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));

View File

@ -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.
*
* <p><b>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.</b>
*/
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 <a id="name"><!-- --></a>}.
* 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 <a id="sectionName"><!-- --></a>}.
* 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 <a id="sectionNameName"><!-- --></a>}.
* 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 <a id="anchorName">content</a>}.
* 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 <a href="#where">label</a>}.
*
* @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 <a href="#sectionName">label</a>}.
*
* @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 <a href="#sectionNameWhere">label</a>}.
*
* @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 <a href="#stylename" title="title" target="target">label</a>}.
*
* @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 <a href="path">label</a>}.
*
* @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 <a href="path">label</a>}.
*
* @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 <a href="path" title="title" target="target">label</a>}.
* If {@code strong} is set, the label will be wrapped in
* {@code <span style="typeNameLink">...</span>}.
*
* @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 <a href="path" title="title" target="target">label</a>}.
*
* @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 <a href="link">label</a>}.
*
* @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 <a href="path" title="title" target="target">label</a>}.
*
* @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 <a href="link" title="title" target="target">label</a>}.
* If {@code strong} is set, the label will be wrapped in
* {@code <span style="typeNameLink">...</span>}.
*
* @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();
}
}