diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ResourceRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ResourceRenderer.java index 53dab1568..576dddf49 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ResourceRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ResourceRenderer.java @@ -92,6 +92,12 @@ public abstract class ResourceRenderer extends DataRenderer { XhtmlNode x = new XhtmlNode(NodeType.Element, "div"); boolean hasExtensions; hasExtensions = render(x, r); + String an = r.fhirType()+"_"+r.getId(); + if (context.isAddName()) { + if (!hasAnchorName(x, an)) { + injectAnchorName(x, an); + } + } inject(r, x, hasExtensions ? NarrativeStatus.EXTENSIONS : NarrativeStatus.GENERATED); } @@ -99,12 +105,53 @@ public abstract class ResourceRenderer extends DataRenderer { assert r.getContext() == context; XhtmlNode x = new XhtmlNode(NodeType.Element, "div"); boolean hasExtensions = render(x, r); + + String an = r.fhirType()+"_"+r.getId(); + if (context.isAddName()) { + if (!hasAnchorName(x, an)) { + injectAnchorName(x, an); + } + } if (r.hasNarrative()) { r.injectNarrative(x, hasExtensions ? NarrativeStatus.EXTENSIONS : NarrativeStatus.GENERATED); } return x; } + public XhtmlNode checkNarrative(ResourceWrapper r) throws IOException, FHIRException, EOperationOutcome { + assert r.getContext() == context; + XhtmlNode x = r.getNarrative(); + String an = r.fhirType()+"_"+r.getId(); + if (context.isAddName()) { + if (!hasAnchorName(x, an)) { + injectAnchorName(x, an); + } + } + return x; + } + + private void injectAnchorName(XhtmlNode x, String an) { + XhtmlNode ip = x; + while (ip.hasChildren() && "div".equals(ip.getChildNodes().get(0).getName())) { + ip = ip.getChildNodes().get(0); + } + ip.addTag(0, "a").setAttribute("name", an).tx(" "); + } + + protected boolean hasAnchorName(XhtmlNode x, String an) { + if ("a".equals(x.getName()) && an.equals(x.getAttribute("name"))) { + return true; + } + if (x.hasChildren()) { + for (XhtmlNode c : x.getChildNodes()) { + if (hasAnchorName(c, an)) { + return true; + } + } + } + return false; + } + public abstract boolean render(XhtmlNode x, Resource r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome; public boolean render(XhtmlNode x, ResourceWrapper r) throws FHIRFormatError, DefinitionException, IOException, FHIRException, EOperationOutcome { @@ -438,7 +485,11 @@ public abstract class ResourceRenderer extends DataRenderer { String bundleUrl = null; Element br = bundleElement.getNamedChild("resource", false); if (br.getChildValue("id") != null) { - bundleUrl = "#" + br.fhirType() + "_" + br.getChildValue("id"); + if ("Bundle".equals(br.fhirType())) { + bundleUrl = "#"; + } else { + bundleUrl = "#" + br.fhirType() + "_" + br.getChildValue("id"); + } } else { bundleUrl = "#" +fullUrlToAnchor(bundleElement.getChildValue("fullUrl")); } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java index 55be947f4..9c8a65411 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/StructureDefinitionRenderer.java @@ -792,8 +792,9 @@ public class StructureDefinitionRenderer extends ResourceRenderer { UnusedTracker used = new UnusedTracker(); String ref = defPath == null ? null : defPath + anchorPrefix + element.getId(); String sName = tail(element.getPath()); - if (element.hasSliceName()) + if (element.hasSliceName()) { sName = sName +":"+element.getSliceName(); + } used.used = true; if (logicalModel) { if (element.hasRepresentation(PropertyRepresentation.XMLATTR)) { @@ -1331,10 +1332,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer { String ref2 = null; String fixedUrl = null; if (ed != null) { - String p = ed.getWebPath(); - if (p != null) { - ref = p.startsWith("http:") || context.getRules() == GenerationRules.IG_PUBLISHER ? p : Utilities.pathURL(corePath, p); - } + String p = ed.getWebPath(); fixedUrl = getFixedUrl(ed); if (fixedUrl != null) {// if its null, we guess that it's not a profiled extension? if (fixedUrl.equals(url)) @@ -3315,6 +3313,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer { if (!tl.contains(tc)) { aliases.add(name.replace("[x]", Utilities.capitalize(tc))); aliases.add(name+":"+name.replace("[x]", Utilities.capitalize(tc))); + aliases.add(name.replace("[x]", Utilities.capitalize(tc))+":"+name.replace("[x]", Utilities.capitalize(tc))); tl.add(tc); } } @@ -3334,7 +3333,6 @@ public class StructureDefinitionRenderer extends ResourceRenderer { list.addAll(generated); } ElementDefinition ed = stack.get(stack.size()-1); - // now we have all the possible names, but some of them might be inappropriate if we've // already generated a type slicer. On the other hand, if we've already done that, we're // going to steal any type specific ones off it.