# HG changeset patch # User jjg # Date 1556130404 25200 # Node ID a9ab154b13844fdce5979b1a4f5e093e57ad1460 # Parent 04857e2cd5095e3b76eabb031bb00318916b3e69 8222669: Create and use new html.Entity class Reviewed-by: hannesw diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java Wed Apr 24 11:26:44 2019 -0700 @@ -40,12 +40,16 @@ import javax.lang.model.util.SimpleTypeVisitor9; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; -import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.*; +import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.EXECUTABLE_MEMBER_PARAM; +import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.MEMBER; +import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.MEMBER_TYPE_PARAMS; +import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.RECEIVER_TYPE; /** * Print method and constructor info. @@ -79,7 +83,7 @@ Content typeParameters = getTypeParameters(member); if (!typeParameters.isEmpty()) { htmltree.add(typeParameters); - htmltree.add(Contents.SPACE); + htmltree.add(Entity.NO_BREAK_SPACE); } } @@ -107,7 +111,7 @@ } String signature = utils.flatSignature((ExecutableElement) member); if (signature.length() > 2) { - deprecatedLinkContent.add(Contents.ZERO_WIDTH_SPACE); + deprecatedLinkContent.add(Entity.ZERO_WIDTH_SPACE); } deprecatedLinkContent.add(signature); @@ -160,7 +164,7 @@ param.asType()).varargs(isVarArg)); tree.add(link); if(name(param).length() > 0) { - tree.add(Contents.SPACE); + tree.add(Entity.NO_BREAK_SPACE); tree.add(name(param)); } } @@ -176,11 +180,11 @@ protected void addReceiverAnnotations(ExecutableElement member, TypeMirror rcvrType, List annotationMirrors, Content tree) { writer.addReceiverAnnotationInfo(member, rcvrType, annotationMirrors, tree); - tree.add(Contents.SPACE); + tree.add(Entity.NO_BREAK_SPACE); tree.add(utils.getTypeName(rcvrType, false)); LinkInfoImpl linkInfo = new LinkInfoImpl(configuration, RECEIVER_TYPE, rcvrType); tree.add(writer.getTypeParameterLinks(linkInfo)); - tree.add(Contents.SPACE); + tree.add(Entity.NO_BREAK_SPACE); tree.add("this"); } @@ -254,7 +258,7 @@ if (paramTree.isEmpty()) { htmltree.add("()"); } else { - htmltree.add(Contents.ZERO_WIDTH_SPACE); + htmltree.add(Entity.ZERO_WIDTH_SPACE); htmltree.add("("); htmltree.add(paramTree); paramTree.add(")"); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,9 +25,13 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; -import java.util.*; -import java.util.zip.*; +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; +import java.util.Collection; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; @@ -37,6 +41,7 @@ import javax.lang.model.util.SimpleElementVisitor9; import com.sun.source.doctree.DocTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -338,7 +343,7 @@ dlTree.add(dt); Content dd = new HtmlTree(HtmlTag.DD); if (sii.getDescription().isEmpty()) { - dd.add(Contents.SPACE); + dd.add(Entity.NO_BREAK_SPACE); } else { dd.add(sii.getDescription()); } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,10 +25,10 @@ package jdk.javadoc.internal.doclets.formats.html; -import jdk.javadoc.internal.doclets.formats.html.markup.Table; -import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; - -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; import java.util.stream.Collectors; import javax.lang.model.element.Element; @@ -39,18 +39,26 @@ import javax.lang.model.type.TypeMirror; import com.sun.source.doctree.DocTree; + import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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.Table; +import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.taglets.DeprecatedTaglet; import jdk.javadoc.internal.doclets.toolkit.util.Utils; -import static javax.lang.model.element.Modifier.*; +import static javax.lang.model.element.Modifier.ABSTRACT; +import static javax.lang.model.element.Modifier.NATIVE; +import static javax.lang.model.element.Modifier.PUBLIC; +import static javax.lang.model.element.Modifier.STRICTFP; +import static javax.lang.model.element.Modifier.SYNCHRONIZED; /** * The base class for member writers. @@ -256,7 +264,7 @@ if (!set.isEmpty()) { String mods = set.stream().map(Modifier::toString).collect(Collectors.joining(" ")); htmltree.add(mods); - htmltree.add(Contents.SPACE); + htmltree.add(Entity.NO_BREAK_SPACE); } } @@ -284,7 +292,7 @@ addModifier(member, code); if (type == null) { code.add(utils.isClass(member) ? "class" : "interface"); - code.add(Contents.SPACE); + code.add(Entity.NO_BREAK_SPACE); } else { List list = utils.isExecutableElement(member) ? ((ExecutableElement)member).getTypeParameters() @@ -297,7 +305,7 @@ if (typeParameters.charCount() > 10) { code.add(new HtmlTree(HtmlTag.BR)); } else { - code.add(Contents.SPACE); + code.add(Entity.NO_BREAK_SPACE); } code.add( writer.getLink(new LinkInfoImpl(configuration, diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -31,6 +31,7 @@ import javax.lang.model.type.TypeMirror; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -138,7 +139,7 @@ writer.getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.MEMBER, getType(member))); pre.add(link); - pre.add(Contents.SPACE); + pre.add(Entity.NO_BREAK_SPACE); if (configuration.linksource) { Content memberName = new StringContent(name(member)); writer.addSrcLink(member, memberName, pre); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -31,6 +31,7 @@ import javax.lang.model.type.TypeMirror; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -142,7 +143,7 @@ writer.getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.MEMBER, getType(member))); pre.add(link); - pre.add(Contents.SPACE); + pre.add(Entity.NO_BREAK_SPACE); if (configuration.linksource) { Content memberName = new StringContent(name(member)); writer.addSrcLink(member, memberName, pre); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -32,6 +32,7 @@ import javax.lang.model.element.TypeElement; import com.sun.source.doctree.DocTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -101,7 +102,7 @@ ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(annotationType); Content typeModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInType, contents.moduleLabel); Content moduleNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, typeModuleLabel); - moduleNameDiv.add(Contents.SPACE); + moduleNameDiv.add(Entity.NO_BREAK_SPACE); moduleNameDiv.add(getModuleLink(mdle, new StringContent(mdle.getQualifiedName()))); div.add(moduleNameDiv); } @@ -109,7 +110,7 @@ if (!pkg.isUnnamed()) { Content typePackageLabel = HtmlTree.SPAN(HtmlStyle.packageLabelInType, contents.packageLabel); Content pkgNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, typePackageLabel); - pkgNameDiv.add(Contents.SPACE); + pkgNameDiv.add(Entity.NO_BREAK_SPACE); Content pkgNameContent = getPackageLink(pkg, new StringContent(utils.getPackageName(pkg))); pkgNameDiv.add(pkgNameContent); div.add(pkgNameDiv); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,7 +25,11 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; @@ -36,6 +40,7 @@ import javax.lang.model.util.SimpleElementVisitor8; import com.sun.source.doctree.DocTree; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -122,7 +127,7 @@ ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(typeElement); Content classModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInType, contents.moduleLabel); Content moduleNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, classModuleLabel); - moduleNameDiv.add(Contents.SPACE); + moduleNameDiv.add(Entity.NO_BREAK_SPACE); moduleNameDiv.add(getModuleLink(mdle, new StringContent(mdle.getQualifiedName()))); div.add(moduleNameDiv); @@ -131,7 +136,7 @@ if (!pkg.isUnnamed()) { Content classPackageLabel = HtmlTree.SPAN(HtmlStyle.packageLabelInType, contents.packageLabel); Content pkgNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, classPackageLabel); - pkgNameDiv.add(Contents.SPACE); + pkgNameDiv.add(Entity.NO_BREAK_SPACE); Content pkgNameContent = getPackageLink(pkg, new StringContent(utils.getPackageName(pkg))); pkgNameDiv.add(pkgNameContent); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,10 +25,8 @@ package jdk.javadoc.internal.doclets.formats.html; -import jdk.javadoc.internal.doclets.formats.html.markup.Table; -import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; - -import java.util.*; +import java.util.Collection; +import java.util.Set; import javax.lang.model.element.Modifier; import javax.lang.model.element.PackageElement; @@ -36,12 +34,15 @@ import javax.lang.model.element.VariableElement; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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.Navigation; import jdk.javadoc.internal.doclets.formats.html.markup.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; +import jdk.javadoc.internal.doclets.formats.html.markup.Table; +import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; import jdk.javadoc.internal.doclets.toolkit.ConstantsSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; @@ -265,7 +266,7 @@ for (Modifier mod : member.getModifiers()) { Content modifier = new StringContent(mod.toString()); code.add(modifier); - code.add(Contents.SPACE); + code.add(Entity.NO_BREAK_SPACE); } Content type = getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CONSTANT_SUMMARY, member.asType())); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -33,6 +33,7 @@ import javax.lang.model.element.TypeElement; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -297,7 +298,7 @@ } else if (utils.isPrivate(member)) { code.add("private "); } else if (utils.isPublic(member)) { - code.add(Contents.SPACE); + code.add(Entity.NO_BREAK_SPACE); } else { code.add( resources.getText("doclet.Package_private")); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java Wed Apr 24 11:26:44 2019 -0700 @@ -32,8 +32,8 @@ import jdk.javadoc.internal.doclets.formats.html.markup.Comment; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; import jdk.javadoc.internal.doclets.formats.html.markup.FixedStringContent; -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; import jdk.javadoc.internal.doclets.toolkit.Resources; @@ -52,8 +52,6 @@ * only created once per doclet-instance, instead of once per generated page. */ public class Contents { - public static final Content SPACE = RawHtml.nbsp; - public static final Content ZERO_WIDTH_SPACE = RawHtml.zws; public final Content allClassesLabel; public final Content allImplementedInterfacesLabel; @@ -400,7 +398,7 @@ int p; while ((p = text.indexOf(" ", start)) != -1) { c.add(text.substring(start, p)); - c.add(RawHtml.nbsp); + c.add(Entity.NO_BREAK_SPACE); start = p + 1; } c.add(text.substring(start)); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -33,6 +33,7 @@ import javax.lang.model.element.VariableElement; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -248,7 +249,7 @@ } Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING, label); - labelHeading.add(Contents.SPACE); + labelHeading.add(Entity.NO_BREAK_SPACE); labelHeading.add(classLink); inheritedTree.add(labelHeading); } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,11 +25,13 @@ package jdk.javadoc.internal.doclets.formats.html; -import jdk.javadoc.internal.doclets.formats.html.markup.Head; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; -import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; - -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Locale; +import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -69,8 +71,10 @@ import com.sun.source.doctree.SystemPropertyTree; import com.sun.source.doctree.TextTree; import com.sun.source.util.SimpleDocTreeVisitor; - import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; +import jdk.javadoc.internal.doclets.formats.html.markup.Head; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; 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; @@ -79,6 +83,7 @@ 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; +import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; import jdk.javadoc.internal.doclets.toolkit.AnnotationTypeWriter; import jdk.javadoc.internal.doclets.toolkit.ClassWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -97,7 +102,12 @@ import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; -import static com.sun.source.doctree.DocTree.Kind.*; +import static com.sun.source.doctree.DocTree.Kind.CODE; +import static com.sun.source.doctree.DocTree.Kind.COMMENT; +import static com.sun.source.doctree.DocTree.Kind.LINK; +import static com.sun.source.doctree.DocTree.Kind.LINK_PLAIN; +import static com.sun.source.doctree.DocTree.Kind.SEE; +import static com.sun.source.doctree.DocTree.Kind.TEXT; import static jdk.javadoc.internal.doclets.toolkit.util.CommentHelper.SPACER; @@ -502,7 +512,7 @@ */ public Content getTableCaption(Content title) { Content captionSpan = HtmlTree.SPAN(title); - Content space = Contents.SPACE; + Content space = Entity.NO_BREAK_SPACE; Content tabSpan = HtmlTree.SPAN(HtmlStyle.tabEnd, space); Content caption = HtmlTree.CAPTION(captionSpan); caption.add(tabSpan); @@ -1226,7 +1236,7 @@ htmltree.add(div); } if (tags.isEmpty()) { - htmltree.add(Contents.SPACE); + htmltree.add(Entity.NO_BREAK_SPACE); } } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -35,6 +35,7 @@ import javax.lang.model.type.TypeMirror; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.Resources; @@ -162,7 +163,7 @@ for (TypeMirror t : vars) { if (many) { links.add(","); - links.add(Contents.ZERO_WIDTH_SPACE); + links.add(Entity.ZERO_WIDTH_SPACE); } links.add(getTypeParameterLink(linkInfo, t)); many = true; diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -34,6 +34,7 @@ import javax.lang.model.type.TypeMirror; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -190,7 +191,7 @@ utils.isClass(holder) ? contents.descfrmClassLabel : contents.descfrmInterfaceLabel); - descfrmLabel.add(Contents.SPACE); + descfrmLabel.add(Entity.NO_BREAK_SPACE); descfrmLabel.add(codelLink); methodDocTree.add(HtmlTree.DIV(HtmlStyle.block, descfrmLabel)); writer.addInlineComment(method, methodDocTree); @@ -297,7 +298,7 @@ } Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING, label); - labelHeading.add(Contents.SPACE); + labelHeading.add(Entity.NO_BREAK_SPACE); labelHeading.add(classLink); inheritedTree.add(labelHeading); } @@ -353,9 +354,9 @@ .where(writer.links.getName(writer.getAnchor(method))).label(method.getSimpleName())); Content codeMethLink = HtmlTree.CODE(methlink); Content dd = HtmlTree.DD(codeMethLink); - dd.add(Contents.SPACE); + dd.add(Entity.NO_BREAK_SPACE); dd.add(writer.contents.inClass); - dd.add(Contents.SPACE); + dd.add(Entity.NO_BREAK_SPACE); dd.add(codeOverridenTypeLink); dl.add(dd); } @@ -389,9 +390,9 @@ implementedMeth.getSimpleName(), false); Content codeMethLink = HtmlTree.CODE(methlink); Content dd = HtmlTree.DD(codeMethLink); - dd.add(Contents.SPACE); + dd.add(Entity.NO_BREAK_SPACE); dd.add(contents.inInterface); - dd.add(Contents.SPACE); + dd.add(Entity.NO_BREAK_SPACE); dd.add(codeIntfacLink); dl.add(dd); } @@ -409,7 +410,7 @@ Content linkContent = writer.getLink( new LinkInfoImpl(configuration, LinkInfoImpl.Kind.RETURN_TYPE, type)); htmltree.add(linkContent); - htmltree.add(Contents.SPACE); + htmltree.add(Entity.NO_BREAK_SPACE); } } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,9 +25,6 @@ package jdk.javadoc.internal.doclets.formats.html; -import jdk.javadoc.internal.doclets.formats.html.markup.Table; -import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -46,6 +43,7 @@ import com.sun.source.doctree.DocTree; import jdk.javadoc.doclet.DocletEnvironment.ModuleMode; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -53,6 +51,8 @@ import jdk.javadoc.internal.doclets.formats.html.markup.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; +import jdk.javadoc.internal.doclets.formats.html.markup.Table; +import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.ModuleSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; @@ -209,7 +209,7 @@ ? contents.openModuleLabel : contents.moduleLabel; Content tHeading = HtmlTree.HEADING(Headings.PAGE_TITLE_HEADING, true, HtmlStyle.title, label); - tHeading.add(Contents.SPACE); + tHeading.add(Entity.NO_BREAK_SPACE); Content moduleHead = new RawHtml(heading); tHeading.add(moduleHead); div.add(tHeading); @@ -534,7 +534,7 @@ * Add the list of modules. * * @param mdleMap map of modules and modifiers - * @param tbody the content tree to which the list will be added + * @param table the table to which the list will be added */ private void addModulesList(Map mdleMap, Table table) { for (ModuleElement m : mdleMap.keySet()) { @@ -776,7 +776,7 @@ addSummaryComment(t, summary); } } else { - summary.add(Contents.SPACE); + summary.add(Entity.NO_BREAK_SPACE); } table.addRow(typeLinkContent, summary); } @@ -802,9 +802,9 @@ description = providesTrees.get(srv); desc.add((description != null && !description.isEmpty()) ? HtmlTree.DIV(HtmlStyle.block, description) - : Contents.SPACE); + : Entity.NO_BREAK_SPACE); } else { - desc.add(Contents.SPACE); + desc.add(Entity.NO_BREAK_SPACE); } // Only display the implementation details in the "all" mode. if (moduleMode == ModuleMode.ALL && !implSet.isEmpty()) { @@ -812,7 +812,7 @@ desc.add("("); HtmlTree implSpan = HtmlTree.SPAN(HtmlStyle.implementationLabel, contents.implementation); desc.add(implSpan); - desc.add(Contents.SPACE); + desc.add(Entity.NO_BREAK_SPACE); String sep = ""; for (TypeElement impl : implSet) { desc.add(sep); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -32,6 +32,7 @@ import javax.lang.model.element.TypeElement; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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.StringContent; @@ -154,7 +155,7 @@ : resources.getText("doclet.Nested_Classes_Interfaces_Inherited_From_Class")); } Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, label); - labelHeading.add(Contents.SPACE); + labelHeading.add(Entity.NO_BREAK_SPACE); labelHeading.add(classLink); inheritedTree.add(labelHeading); } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,21 +25,24 @@ package jdk.javadoc.internal.doclets.formats.html; -import jdk.javadoc.internal.doclets.formats.html.markup.Table; -import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; - -import java.util.*; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.TreeSet; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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.Navigation; import jdk.javadoc.internal.doclets.formats.html.markup.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; +import jdk.javadoc.internal.doclets.formats.html.markup.Table; +import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.ClassUseMapper; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; @@ -180,7 +183,7 @@ if (pkg != null && !pkg.isUnnamed()) { addSummaryComment(pkg, summary); } else { - summary.add(Contents.SPACE); + summary.add(Entity.NO_BREAK_SPACE); } table.addRow(packageLink, summary); } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,10 +25,8 @@ package jdk.javadoc.internal.doclets.formats.html; -import jdk.javadoc.internal.doclets.formats.html.markup.Table; -import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; - -import java.util.*; +import java.util.List; +import java.util.SortedSet; import javax.lang.model.element.ModuleElement; import javax.lang.model.element.PackageElement; @@ -36,12 +34,15 @@ import com.sun.source.doctree.DocTree; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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.Navigation; import jdk.javadoc.internal.doclets.formats.html.markup.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; +import jdk.javadoc.internal.doclets.formats.html.markup.Table; +import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.PackageSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; @@ -120,7 +121,7 @@ ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(packageElement); Content classModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInPackage, contents.moduleLabel); Content moduleNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, classModuleLabel); - moduleNameDiv.add(Contents.SPACE); + moduleNameDiv.add(Entity.NO_BREAK_SPACE); moduleNameDiv.add(getModuleLink(mdle, new StringContent(mdle.getQualifiedName().toString()))); div.add(moduleNameDiv); @@ -130,7 +131,7 @@ div.add(annotationContent); Content tHeading = HtmlTree.HEADING(Headings.PAGE_TITLE_HEADING, true, HtmlStyle.title, contents.packageLabel); - tHeading.add(Contents.SPACE); + tHeading.add(Entity.NO_BREAK_SPACE); Content packageHead = new StringContent(heading); tHeading.add(packageHead); div.add(tHeading); diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,12 +25,12 @@ package jdk.javadoc.internal.doclets.formats.html; - import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -41,7 +41,6 @@ import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.PropertyWriter; - /** * Writes property documentation in HTML format. * @@ -161,7 +160,7 @@ utils.isClass(holder) ? contents.descfrmClassLabel : contents.descfrmInterfaceLabel); - descfrmLabel.add(Contents.SPACE); + descfrmLabel.add(Entity.NO_BREAK_SPACE); descfrmLabel.add(codeLink); propertyDocTree.add(HtmlTree.DIV(HtmlStyle.block, descfrmLabel)); writer.addInlineComment(property, propertyDocTree); @@ -263,7 +262,7 @@ } Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING, label); - labelHeading.add(Contents.SPACE); + labelHeading.add(Entity.NO_BREAK_SPACE); labelHeading.add(classLink); inheritedTree.add(labelHeading); } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,10 +25,11 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.util.*; +import java.util.Set; import javax.lang.model.element.TypeElement; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -121,7 +122,7 @@ public Content getPackageHeader(String packageName) { Content heading = HtmlTree.HEADING(Headings.SerializedForm.PACKAGE_HEADING, true, contents.packageLabel); - heading.add(Contents.SPACE); + heading.add(Entity.NO_BREAK_SPACE); heading.add(packageName); return heading; } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SingleIndexWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SingleIndexWriter.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SingleIndexWriter.java Wed Apr 24 11:26:44 2019 -0700 @@ -25,8 +25,10 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.util.*; +import java.util.Set; +import java.util.TreeSet; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -140,13 +142,13 @@ contentTree.add( links.createLink(getNameForIndex(unicode), new StringContent(unicode))); - contentTree.add(Contents.SPACE); + contentTree.add(Entity.NO_BREAK_SPACE); } contentTree.add(new HtmlTree(HtmlTag.BR)); contentTree.add(links.createLink(DocPaths.ALLCLASSES_INDEX, contents.allClassesLabel)); if (!configuration.packages.isEmpty()) { - contentTree.add(Contents.SPACE); + contentTree.add(Entity.NO_BREAK_SPACE); contentTree.add(links.createLink(DocPaths.ALLPACKAGES_INDEX, contents.allPackagesLabel)); } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SplitIndexWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SplitIndexWriter.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SplitIndexWriter.java Wed Apr 24 11:26:44 2019 -0700 @@ -32,6 +32,7 @@ import java.util.Set; import java.util.TreeSet; +import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 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; @@ -163,13 +164,13 @@ int j = i + 1; contentTree.add(links.createLink(DocPaths.indexN(j), new StringContent(indexElements.get(i).toString()))); - contentTree.add(Contents.SPACE); + contentTree.add(Entity.NO_BREAK_SPACE); } contentTree.add(new HtmlTree(HtmlTag.BR)); contentTree.add(links.createLink(pathToRoot.resolve(DocPaths.ALLCLASSES_INDEX), contents.allClassesLabel)); if (!configuration.packages.isEmpty()) { - contentTree.add(Contents.SPACE); + contentTree.add(Entity.NO_BREAK_SPACE); contentTree.add(links.createLink(pathToRoot.resolve(DocPaths.ALLPACKAGES_INDEX), contents.allPackagesLabel)); } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Entity.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Entity.java Wed Apr 24 11:26:44 2019 -0700 @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. 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.toolkit.Content; + +import java.io.IOException; +import java.io.Writer; + +/** + * A representation of HTML entities. + */ +public class Entity extends Content { + public static final Entity LESS_THAN = new Entity("<"); + public static final Entity GREATER_THAN = new Entity(">"); + public static final Entity AMPERSAND = new Entity("&"); + public static final Entity NO_BREAK_SPACE = new Entity(" "); + public static final Entity ZERO_WIDTH_SPACE = new Entity("​") { + @Override + public int charCount() { + return 0; + } + }; + + public final String text; + + private Entity(String text) { + this.text = text; + } + + @Override + public void add(Content content) { + throw new UnsupportedOperationException(); + } + + @Override + public void add(CharSequence stringContent) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean write(Writer writer, boolean atNewline) throws IOException { + writer.write(text); + return false; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public int charCount() { + return 1; + } + + + /** + * Escapes the special HTML characters in a given string using the appropriate + * entities. + * + * @param s the string to escape + * @return the string with all of the HTML characters escaped + */ + static String escapeHtmlChars(CharSequence s) { + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + switch (ch) { + // only start building a new string if we need to + case '<': case '>': case '&': + StringBuilder sb = new StringBuilder(s.subSequence(0, i)); + escapeHtmlChars(s, i, sb); + return sb.toString(); + } + } + return s.toString(); + } + + /** + * Escapes the special HTML characters in a given string using the appropriate + * entities, appending the results into a string builder. + * + * @param s the string + * @param sb the string builder + */ + static void escapeHtmlChars(CharSequence s, StringBuilder sb) { + escapeHtmlChars(s, 0, sb); + } + + private static void escapeHtmlChars(CharSequence s, int start, StringBuilder sb) { + for (int i = start ; i < s.length(); i++) { + char ch = s.charAt(i); + switch (ch) { + case '<': sb.append(Entity.LESS_THAN.text); break; + case '>': sb.append(Entity.GREATER_THAN.text); break; + case '&': sb.append(Entity.AMPERSAND.text); break; + default: sb.append(ch); break; + } + } + } + +} diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/FixedStringContent.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/FixedStringContent.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/FixedStringContent.java Wed Apr 24 11:26:44 2019 -0700 @@ -47,9 +47,7 @@ * @param content content for the object */ public FixedStringContent(CharSequence content) { - string = needEscape(content) - ? escape(content) - : content.toString(); + string = Entity.escapeHtmlChars(content); } /** @@ -105,29 +103,4 @@ return string.endsWith(DocletConstants.NL); } - private boolean needEscape(CharSequence cs) { - for (int i = 0; i < cs.length(); i++) { - switch (cs.charAt(i)) { - case '<': - case '>': - case '&': - return true; - } - } - return false; - } - private String escape(CharSequence s) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < s.length(); i++) { - char ch = s.charAt(i); - switch (ch) { - case '<': sb.append("<"); break; - case '>': sb.append(">"); break; - case '&': sb.append("&"); break; - default: sb.append(ch); break; - } - } - return sb.toString(); - } - } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java Wed Apr 24 11:26:44 2019 -0700 @@ -100,7 +100,7 @@ public HtmlTree put(HtmlAttr attrName, String attrValue) { if (attrs.isEmpty()) attrs = new LinkedHashMap<>(3); - attrs.put(nullCheck(attrName), escapeHtmlChars(attrValue)); + attrs.put(nullCheck(attrName), Entity.escapeHtmlChars(attrValue)); return this; } @@ -188,35 +188,6 @@ return n; } - /** - * Given a string, escape all special HTML characters and - * return the result. - * - * @param s The string to check. - * @return the original string with all of the HTML characters escaped. - */ - private static String escapeHtmlChars(String s) { - for (int i = 0; i < s.length(); i++) { - char ch = s.charAt(i); - switch (ch) { - // only start building a new string if we need to - case '<': case '>': case '&': - StringBuilder sb = new StringBuilder(s.substring(0, i)); - for ( ; i < s.length(); i++) { - ch = s.charAt(i); - switch (ch) { - case '<': sb.append("<"); break; - case '>': sb.append(">"); break; - case '&': sb.append("&"); break; - default: sb.append(ch); break; - } - } - return sb.toString(); - } - } - return s; - } - /* * The sets of ASCII URI characters to be left unencoded. * See "Uniform Resource Identifier (URI): Generic Syntax" diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Navigation.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Navigation.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Navigation.java Wed Apr 24 11:26:44 2019 -0700 @@ -429,7 +429,7 @@ } if (!listContents.isEmpty()) { Content li = HtmlTree.LI(contents.summaryLabel); - li.add(Contents.SPACE); + li.add(Entity.NO_BREAK_SPACE); tree.add(li); addListToNav(listContents, tree); } @@ -461,7 +461,7 @@ } if (!listContents.isEmpty()) { Content li = HtmlTree.LI(contents.moduleSubNavLabel); - li.add(Contents.SPACE); + li.add(Entity.NO_BREAK_SPACE); tree.add(li); addListToNav(listContents, tree); } @@ -665,7 +665,7 @@ } if (!listContents.isEmpty()) { Content li = HtmlTree.LI(contents.detailLabel); - li.add(Contents.SPACE); + li.add(Entity.NO_BREAK_SPACE); tree.add(li); addListToNav(listContents, tree); } @@ -801,9 +801,9 @@ int count = 0; for (Content liContent : listContents) { if (count < listContents.size() - 1) { - liContent.add(Contents.SPACE); + liContent.add(Entity.NO_BREAK_SPACE); liContent.add("|"); - liContent.add(Contents.SPACE); + liContent.add(Entity.NO_BREAK_SPACE); } tree.add(liContent); count++; @@ -1005,7 +1005,7 @@ fixedNavDiv.add(queue.poll()); fixedNavDiv.add(Position.TOP.endOfNav()); tree.add(fixedNavDiv); - HtmlTree paddingDiv = HtmlTree.DIV(HtmlStyle.navPadding, Contents.SPACE); + HtmlTree paddingDiv = HtmlTree.DIV(HtmlStyle.navPadding, Entity.NO_BREAK_SPACE); tree.add(paddingDiv); addFixedNavScript(tree); } else { diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/RawHtml.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/RawHtml.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/RawHtml.java Wed Apr 24 11:26:44 2019 -0700 @@ -45,10 +45,6 @@ private final String rawHtmlContent; - public static final Content nbsp = new RawHtml(" "); - - public static final Content zws = new RawHtml("​"); - /** * Constructor to construct a RawHtml object. * diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/StringContent.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/StringContent.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/StringContent.java Wed Apr 24 11:26:44 2019 -0700 @@ -59,7 +59,7 @@ */ public StringContent(CharSequence initialContent) { stringContent = new StringBuilder(); - appendChars(initialContent); + Entity.escapeHtmlChars(initialContent, stringContent); } /** @@ -81,7 +81,7 @@ */ @Override public void add(CharSequence strContent) { - appendChars(strContent); + Entity.escapeHtmlChars(strContent, stringContent); } /** @@ -114,16 +114,4 @@ out.write(s); return s.endsWith(DocletConstants.NL); } - - private void appendChars(CharSequence s) { - for (int i = 0; i < s.length(); i++) { - char ch = s.charAt(i); - switch (ch) { - case '<': stringContent.append("<"); break; - case '>': stringContent.append(">"); break; - case '&': stringContent.append("&"); break; - default: stringContent.append(ch); break; - } - } - } } diff -r 04857e2cd509 -r a9ab154b1384 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java Wed Apr 24 10:20:25 2019 -0400 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java Wed Apr 24 11:26:44 2019 -0700 @@ -531,6 +531,6 @@ private HtmlTree getCaption(Content title) { return new HtmlTree(HtmlTag.CAPTION, HtmlTree.SPAN(title), - HtmlTree.SPAN(tabEnd, Contents.SPACE)); + HtmlTree.SPAN(tabEnd, Entity.NO_BREAK_SPACE)); } }