Rendering for Binary Resources

This commit is contained in:
Grahame Grieve 2021-09-01 09:54:03 +10:00
parent 2845078c9e
commit 66fb0893ad
5 changed files with 174 additions and 2 deletions

View File

@ -0,0 +1,134 @@
package org.hl7.fhir.r5.renderers;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import org.hl7.fhir.r5.model.Binary;
import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.xhtml.NodeType;
import org.hl7.fhir.utilities.xhtml.XhtmlComposer;
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
public class BinaryRenderer {
private String folder;
private List<String> filenames = new ArrayList<String>();
public BinaryRenderer(String folder) {
super();
this.folder = folder;
}
public String getFolder() {
return folder;
}
public List<String> getFilenames() {
return filenames;
}
public static String getBinContentAsString(Binary bin) {
// for now, assume UTF8. To do: extract character encoding from mime type if possible (charset)
return new String(bin.getContent(), StandardCharsets.UTF_8);
}
public String display(Binary bin) throws IOException {
XhtmlNode div = new XhtmlNode(NodeType.Element, "div");
render(div, bin);
return new XhtmlComposer(false, true).compose(div);
}
public void render(XhtmlNode x, Binary bin) throws IOException {
filenames.clear();
if (!bin.hasContentType()) {
error(x, "No Content Type");
} else if (bin.getContentType().startsWith("image/")) {
image(x, bin);
} else if (isXml(bin.getContentType())) {
xml(x, bin);
} else if (isJson(bin.getContentType())) {
json(x, bin);
} else if (isTtl(bin.getContentType())) {
ttl(x, bin);
} else if (isText(bin.getContentType())) {
text(x, bin);
} else {
error(x, "The Content Type '"+bin.getContentType()+"' is not rendered in this context");
}
}
private void image(XhtmlNode x, Binary bin) throws IOException {
String ext = null;
if (bin.getContentType().startsWith("image/png")) {
ext = ".png";
} else if (bin.getContentType().startsWith("image/jpeg")) {
ext = ".jpg";
} else if (bin.getContentType().startsWith("image/gif")) {
ext = ".gif";
} else if (bin.getContentType().startsWith("image/svg")) {
ext = ".svg";
}
if (ext == null) {
error(x, "The Image Type '"+bin.getContentType()+"' is not rendered in this context");
} else {
String fn = "Binary-Native-"+bin.getId()+ext;
TextFile.bytesToFile(bin.getContent(), Utilities.path(folder, fn));
filenames.add(fn);
x.img("Binary-Native-"+bin.getId()+ext);
}
}
private void error(XhtmlNode x, String message) {
x.tx("["+message+"]");
}
private boolean isXml(String ct) {
return ct.startsWith("text/xml") || ct.startsWith("application/xml") || ct.contains("+xml");
}
private void xml(XhtmlNode x, Binary bin) {
String content = "\r\n"+getBinContentAsString(bin);
XhtmlNode pre = x.pre("xml");
pre.code(content);
}
private boolean isJson(String ct) {
return ct.startsWith("text/json") || ct.startsWith("application/json") || ct.contains("+json");
}
private void json(XhtmlNode x, Binary bin) {
String content = "\r\n"+getBinContentAsString(bin);
XhtmlNode pre = x.pre("json");
pre.code(content);
}
private boolean isTtl(String ct) {
return ct.startsWith("text/rdf") || ct.contains("+turtle");
}
private void ttl(XhtmlNode x, Binary bin) {
String content = "\r\n"+getBinContentAsString(bin);
XhtmlNode pre = x.pre("rdf language-turtle");
pre.code(content);
}
private boolean isText(String ct) {
return ct.startsWith("text/");
}
private void text(XhtmlNode x, Binary bin) {
String content = "\r\n"+getBinContentAsString(bin);
XhtmlNode pre = x.pre();
pre.code(content);
}
}

View File

@ -148,6 +148,37 @@ public class DataRenderer extends Renderer {
return system; return system;
} }
public String displaySystem(String system) {
if (system == null)
return "[not stated]";
if (system.equals("http://loinc.org"))
return "LOINC";
if (system.startsWith("http://snomed.info"))
return "SNOMED CT";
if (system.equals("http://www.nlm.nih.gov/research/umls/rxnorm"))
return "RxNorm";
if (system.equals("http://hl7.org/fhir/sid/icd-9"))
return "ICD-9";
if (system.equals("http://dicom.nema.org/resources/ontology/DCM"))
return "DICOM";
if (system.equals("http://unitsofmeasure.org"))
return "UCUM";
CodeSystem cs = context.getContext().fetchCodeSystem(system);
if (cs != null) {
return cs.present();
}
return tails(system);
}
private String tails(String system) {
if (system.contains("/")) {
return system.substring(system.lastIndexOf("/")+1);
} else {
return "unknown";
}
}
protected String makeAnchor(String codeSystem, String code) { protected String makeAnchor(String codeSystem, String code) {
String s = codeSystem+'-'+code; String s = codeSystem+'-'+code;
StringBuilder b = new StringBuilder(); StringBuilder b = new StringBuilder();

View File

@ -82,7 +82,7 @@ public class RenderingContext {
private boolean pretty; private boolean pretty;
private boolean header; private boolean header;
private ValidationOptions terminologyServiceOptions; private ValidationOptions terminologyServiceOptions = new ValidationOptions();
private boolean noSlowLookup; private boolean noSlowLookup;
private String tooCostlyNoteEmpty; private String tooCostlyNoteEmpty;
private String tooCostlyNoteNotEmpty; private String tooCostlyNoteNotEmpty;
@ -115,7 +115,9 @@ public class RenderingContext {
this.specificationLink = specLink; this.specificationLink = specLink;
this.localPrefix = localPrefix; this.localPrefix = localPrefix;
this.mode = mode; this.mode = mode;
if (terminologyServiceOptions != null) {
this.terminologyServiceOptions = terminologyServiceOptions; this.terminologyServiceOptions = terminologyServiceOptions;
}
profileUtilities = new ProfileUtilities(worker, null, null); profileUtilities = new ProfileUtilities(worker, null, null);
} }

View File

@ -191,6 +191,7 @@ public class ToolingExtensions {
public static final String EXT_XML_NAMESPACE = "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace"; public static final String EXT_XML_NAMESPACE = "http://hl7.org/fhir/StructureDefinition/elementdefinition-namespace";
public static final String EXT_XML_NAME = "http://hl7.org/fhir/StructureDefinition/elementdefinition-xml-name"; public static final String EXT_XML_NAME = "http://hl7.org/fhir/StructureDefinition/elementdefinition-xml-name";
public static final String EXT_BINDING_STYLE = "http://hl7.org/fhir/StructureDefinition/elementdefinition-binding-style"; public static final String EXT_BINDING_STYLE = "http://hl7.org/fhir/StructureDefinition/elementdefinition-binding-style";
public static final String EXT_BINARY_FORMAT = "http://hl7.org/fhir/StructureDefinition/implementationguide-resource-format";
// specific extension helpers // specific extension helpers

View File

@ -606,6 +606,10 @@ public class XhtmlNode implements IBaseXhtml {
return addTag("pre"); return addTag("pre");
} }
public XhtmlNode pre(String clss) {
return addTag("pre").setAttribute("class", clss);
}
public void br() { public void br() {
addTag("br"); addTag("br");
} }