diff --git a/org.hl7.fhir.dstu2/src/main/java/org/hl7/fhir/dstu2/utils/ProfileUtilities.java b/org.hl7.fhir.dstu2/src/main/java/org/hl7/fhir/dstu2/utils/ProfileUtilities.java index fa7f79cb2..88e32acb1 100644 --- a/org.hl7.fhir.dstu2/src/main/java/org/hl7/fhir/dstu2/utils/ProfileUtilities.java +++ b/org.hl7.fhir.dstu2/src/main/java/org/hl7/fhir/dstu2/utils/ProfileUtilities.java @@ -79,6 +79,7 @@ import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row; +import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableGenerationMode; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableModel; import org.hl7.fhir.utilities.xhtml.XhtmlNode; import org.hl7.fhir.utilities.xml.SchematronWriter; @@ -1183,7 +1184,7 @@ public class ProfileUtilities { public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, boolean inlineGraphics, boolean full, String corePath, Set outputTracker) throws IOException, FHIRException { HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); - TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false); + TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML); boolean deep = false; boolean vdeep = false; @@ -1447,7 +1448,7 @@ public class ProfileUtilities { public XhtmlNode generateTable(String defFile, StructureDefinition profile, boolean diff, String imageFolder, boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, Set outputTracker) throws IOException, FHIRException { assert(diff != snapshot);// check it's ok to get rid of one of these HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); - TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false); + TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false, TableGenerationMode.XML); List list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); List profiles = new ArrayList(); profiles.add(profile); diff --git a/org.hl7.fhir.dstu2016may/src/main/java/org/hl7/fhir/dstu2016may/utils/ProfileUtilities.java b/org.hl7.fhir.dstu2016may/src/main/java/org/hl7/fhir/dstu2016may/utils/ProfileUtilities.java index 29a087deb..52d515fd8 100644 --- a/org.hl7.fhir.dstu2016may/src/main/java/org/hl7/fhir/dstu2016may/utils/ProfileUtilities.java +++ b/org.hl7.fhir.dstu2016may/src/main/java/org/hl7/fhir/dstu2016may/utils/ProfileUtilities.java @@ -80,6 +80,7 @@ import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row; +import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableGenerationMode; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableModel; import org.hl7.fhir.utilities.xhtml.XhtmlNode; import org.hl7.fhir.utilities.xml.SchematronWriter; @@ -1184,7 +1185,7 @@ public class ProfileUtilities { public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, boolean inlineGraphics, boolean full, String corePath, Set outputTracker) throws IOException, FHIRException { HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); - TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false); + TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML); boolean deep = false; boolean vdeep = false; @@ -1446,7 +1447,7 @@ public class ProfileUtilities { public XhtmlNode generateTable(String defFile, StructureDefinition profile, boolean diff, String imageFolder, boolean inlineGraphics, String profileBaseFileName, boolean snapshot, String corePath, boolean logicalModel, Set outputTracker) throws IOException, FHIRException { assert(diff != snapshot);// check it's ok to get rid of one of these HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); - TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false); + TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false, TableGenerationMode.XML); List list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); List profiles = new ArrayList(); profiles.add(profile); diff --git a/org.hl7.fhir.dstu3/src/main/java/org/hl7/fhir/dstu3/conformance/ProfileUtilities.java b/org.hl7.fhir.dstu3/src/main/java/org/hl7/fhir/dstu3/conformance/ProfileUtilities.java index eb7ad438f..428ae8d96 100644 --- a/org.hl7.fhir.dstu3/src/main/java/org/hl7/fhir/dstu3/conformance/ProfileUtilities.java +++ b/org.hl7.fhir.dstu3/src/main/java/org/hl7/fhir/dstu3/conformance/ProfileUtilities.java @@ -102,6 +102,7 @@ import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row; +import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableGenerationMode; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableModel; import org.hl7.fhir.utilities.xhtml.XhtmlNode; import org.hl7.fhir.utilities.xml.SchematronWriter; @@ -1621,7 +1622,7 @@ public class ProfileUtilities extends TranslatingUtilities { public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, boolean inlineGraphics, boolean full, String corePath, String imagePath, Set outputTracker) throws IOException, FHIRException { HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); gen.setTranslator(getTranslator()); - TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false); + TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML); boolean deep = false; String m = ""; @@ -1990,7 +1991,7 @@ public class ProfileUtilities extends TranslatingUtilities { assert(diff != snapshot);// check it's ok to get rid of one of these HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics); gen.setTranslator(getTranslator()); - TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false); + TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false, TableGenerationMode.XML); List list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); List profiles = new ArrayList(); profiles.add(profile); diff --git a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/conformance/ProfileUtilities.java b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/conformance/ProfileUtilities.java index 8f4ed5a52..72e18c208 100644 --- a/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/conformance/ProfileUtilities.java +++ b/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/conformance/ProfileUtilities.java @@ -110,6 +110,7 @@ import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row; +import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableGenerationMode; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableModel; import org.hl7.fhir.utilities.xhtml.XhtmlNode; import org.hl7.fhir.utilities.xml.SchematronWriter; @@ -2149,7 +2150,7 @@ public class ProfileUtilities extends TranslatingUtilities { public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, boolean inlineGraphics, boolean full, String corePath, String imagePath, Set outputTracker) throws IOException, FHIRException { HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); gen.setTranslator(getTranslator()); - TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false); + TableModel model = gen.initNormalTable(corePath, false, true, ed.getId(), false, TableGenerationMode.XML); boolean deep = false; String m = ""; @@ -2519,7 +2520,7 @@ public class ProfileUtilities extends TranslatingUtilities { assert(diff != snapshot);// check it's ok to get rid of one of these HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); gen.setTranslator(getTranslator()); - TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false); + TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), false, TableGenerationMode.XML); List list = diff ? profile.getDifferential().getElement() : profile.getSnapshot().getElement(); List profiles = new ArrayList(); profiles.add(profile); diff --git a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/conformance/ProfileUtilities.java b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/conformance/ProfileUtilities.java index 3a54442ad..b8629da9a 100644 --- a/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/conformance/ProfileUtilities.java +++ b/org.hl7.fhir.r4b/src/main/java/org/hl7/fhir/r4b/conformance/ProfileUtilities.java @@ -130,6 +130,7 @@ import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row; +import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableGenerationMode; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableModel; import org.hl7.fhir.utilities.xhtml.XhtmlNode; import org.hl7.fhir.utilities.xml.SchematronWriter; @@ -3471,7 +3472,7 @@ public class ProfileUtilities extends TranslatingUtilities { public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, boolean inlineGraphics, boolean full, String corePath, String imagePath, Set outputTracker, RenderingContext rc) throws IOException, FHIRException { HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); gen.setTranslator(getTranslator()); - TableModel model = gen.initNormalTable(corePath, false, true, ed.getId()+(full ? "f" : "n"), true); + TableModel model = gen.initNormalTable(corePath, false, true, ed.getId()+(full ? "f" : "n"), true, TableGenerationMode.XHTML); boolean deep = false; String m = ""; @@ -3988,7 +3989,7 @@ public class ProfileUtilities extends TranslatingUtilities { assert(diff != snapshot);// check it's ok to get rid of one of these HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); gen.setTranslator(getTranslator()); - TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), active); + TableModel model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), active, active ? TableGenerationMode.XHTML : TableGenerationMode.XML); List list = new ArrayList<>(); if (diff) list.addAll(profile.getDifferential().getElement()); 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 32125968a..08d868ca7 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 @@ -77,6 +77,7 @@ import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Cell; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Piece; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Row; +import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableGenerationMode; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableModel; import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.Title; import org.hl7.fhir.utilities.xhtml.NodeType; @@ -324,7 +325,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer { model = initCustomTable(gen, corePath, false, true, profile.getId()+(diff ? "d" : "s"), rc.getRules() == GenerationRules.IG_PUBLISHER, columns); break; case SUMMARY: - model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), rc.getRules() == GenerationRules.IG_PUBLISHER); + model = gen.initNormalTable(corePath, false, true, profile.getId()+(diff ? "d" : "s"), rc.getRules() == GenerationRules.IG_PUBLISHER, rc.getRules() == GenerationRules.IG_PUBLISHER ? TableGenerationMode.XHTML : TableGenerationMode.XML); break; default: throw new Error("Unknown structure mode"); @@ -2667,7 +2668,7 @@ public class StructureDefinitionRenderer extends ResourceRenderer { public XhtmlNode generateExtensionTable(String defFile, StructureDefinition ed, String imageFolder, boolean inlineGraphics, boolean full, String corePath, String imagePath, Set outputTracker, RenderingContext rc) throws IOException, FHIRException { HierarchicalTableGenerator gen = new HierarchicalTableGenerator(imageFolder, inlineGraphics, true); gen.setTranslator(getTranslator()); - TableModel model = gen.initNormalTable(corePath, false, true, ed.getId()+(full ? "f" : "n"), true); + TableModel model = gen.initNormalTable(corePath, false, true, ed.getId()+(full ? "f" : "n"), true, TableGenerationMode.XHTML); boolean deep = false; String m = ""; diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/HierarchicalTableGenerator.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/HierarchicalTableGenerator.java index 42a7e44f9..ddccd0ad5 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/HierarchicalTableGenerator.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/xhtml/HierarchicalTableGenerator.java @@ -83,9 +83,14 @@ import org.commonmark.renderer.html.HtmlRenderer; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.utilities.TranslatingUtilities; import org.hl7.fhir.utilities.Utilities; +import org.hl7.fhir.utilities.xhtml.HierarchicalTableGenerator.TableGenerationMode; public class HierarchicalTableGenerator extends TranslatingUtilities { + public enum TableGenerationMode { + XML, XHTML + } + public static final String TEXT_ICON_REFERENCE = "Reference to another Resource"; public static final String TEXT_ICON_PRIMITIVE = "Primitive Data Type"; public static final String TEXT_ICON_KEY = "JSON Key Value"; @@ -599,6 +604,8 @@ public class HierarchicalTableGenerator extends TranslatingUtilities { */ private boolean inLineGraphics; + private TableGenerationMode mode; + public HierarchicalTableGenerator() { super(); } @@ -626,7 +633,9 @@ public class HierarchicalTableGenerator extends TranslatingUtilities { checkSetup(); } - public TableModel initNormalTable(String prefix, boolean isLogical, boolean alternating, String id, boolean isActive) { + public TableModel initNormalTable(String prefix, boolean isLogical, boolean alternating, String id, boolean isActive, TableGenerationMode mode) { + this.mode = mode; + TableModel model = new TableModel(id, isActive); model.setAlternating(alternating); @@ -686,12 +695,16 @@ public class HierarchicalTableGenerator extends TranslatingUtilities { tr.setAttribute("style", "border: " + Integer.toString(1 + border) + "px #F0F0F0 solid; font-size: 11px; font-family: verdana; vertical-align: top"); XhtmlNode tc = null; for (Title t : model.getTitles()) { - tc = renderCell(tr, t, "th", null, null, null, false, null, "white", 0, imagePath, border, outputTracker, model, null); + tc = renderCell(tr, t, "th", null, null, null, false, null, "white", 0, imagePath, border, outputTracker, model, null, true); if (t.width != 0) tc.setAttribute("style", "width: "+Integer.toString(t.width)+"px"); } if (tc != null && model.getDocoRef() != null) { - XhtmlNode img = tc.addTag("span").setAttribute("style", "float: right").addTag("a").setAttribute("title", "Legend for this format").setAttribute("href", model.getDocoRef()).addTag("img"); + XhtmlNode a = tc.addTag("span").setAttribute("style", "float: right").addTag("a").setAttribute("title", "Legend for this format").setAttribute("href", model.getDocoRef()); + if (mode == TableGenerationMode.XHTML) { + a.setAttribute("no-external", "true"); + } + XhtmlNode img = a.addTag("img"); img.setAttribute("alt", "doco").setAttribute("style", "background-color: inherit").setAttribute("src", model.getDocoImg()); if (model.isActive()) { img.setAttribute("onLoad", "fhirTableInit(this)"); @@ -732,7 +745,7 @@ public class HierarchicalTableGenerator extends TranslatingUtilities { } boolean first = true; for (Cell t : r.getCells()) { - renderCell(tr, t, "td", first ? r.getIcon() : null, first ? r.getHint() : null, first ? indents : null, !r.getSubRows().isEmpty(), first ? r.getAnchor() : null, color, r.getLineColor(), imagePath, border, outputTracker, model, r); + renderCell(tr, t, "td", first ? r.getIcon() : null, first ? r.getHint() : null, first ? indents : null, !r.getSubRows().isEmpty(), first ? r.getAnchor() : null, color, r.getLineColor(), imagePath, border, outputTracker, model, r, first); first = false; } table.addText("\r\n"); @@ -751,7 +764,7 @@ public class HierarchicalTableGenerator extends TranslatingUtilities { } - private XhtmlNode renderCell(XhtmlNode tr, Cell c, String name, String icon, String hint, List indents, boolean hasChildren, String anchor, String color, int lineColor, String imagePath, int border, Set outputTracker, TableModel table, Row row) throws IOException { + private XhtmlNode renderCell(XhtmlNode tr, Cell c, String name, String icon, String hint, List indents, boolean hasChildren, String anchor, String color, int lineColor, String imagePath, int border, Set outputTracker, TableModel table, Row row, boolean suppressExternals) throws IOException { XhtmlNode tc = tr.addTag(name); tc.setAttribute("class", "hierarchy"); if (c.span > 1) { @@ -837,6 +850,9 @@ public class HierarchicalTableGenerator extends TranslatingUtilities { } else if (!Utilities.noString(p.getReference())) { XhtmlNode a = addStyle(tc.addTag("a"), p); a.setAttribute("href", p.getReference()); + if (mode == TableGenerationMode.XHTML && suppressExternals) { + a.setAttribute("no-external", "true"); + } if (!Utilities.noString(p.getHint())) a.setAttribute("title", p.getHint()); if (p.getText() != null) {