More validation for HTML structure
This commit is contained in:
parent
4dd89160dd
commit
41d40e7f94
|
@ -41,7 +41,10 @@ import java.util.Map;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
import org.hl7.fhir.exceptions.FHIRException;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseXhtml;
|
import org.hl7.fhir.instance.model.api.IBaseXhtml;
|
||||||
import org.hl7.fhir.utilities.Utilities;
|
import org.hl7.fhir.utilities.Utilities;
|
||||||
|
import org.hl7.fhir.utilities.i18n.I18nConstants;
|
||||||
|
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.model.api.annotation.ChildOrder;
|
||||||
import ca.uhn.fhir.model.primitive.XhtmlDt;
|
import ca.uhn.fhir.model.primitive.XhtmlDt;
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
@ -137,11 +140,53 @@ public class XhtmlNode implements IBaseXhtml {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void validate(List<String> errors, String path, boolean inResource, boolean inPara) {
|
||||||
|
if (nodeType == NodeType.Element || nodeType == NodeType.Document) {
|
||||||
|
path = Utilities.noString(path) ? name : path+"/"+name;
|
||||||
|
if (inResource) {
|
||||||
|
if (!Utilities.existsInList(name, "p", "br", "div", "h1", "h2", "h3", "h4", "h5", "h6", "a", "span", "b", "em", "i", "strong",
|
||||||
|
"small", "big", "tt", "small", "dfn", "q", "var", "abbr", "acronym", "cite", "blockquote", "hr", "address", "bdo", "kbd", "q", "sub", "sup",
|
||||||
|
"ul", "ol", "li", "dl", "dt", "dd", "pre", "table", "caption", "colgroup", "col", "thead", "tr", "tfoot", "tbody", "th", "td",
|
||||||
|
"code", "samp", "img", "map", "area")) {
|
||||||
|
errors.add("Error at "+path+": Found "+name+" in a resource");
|
||||||
|
}
|
||||||
|
for (String an : attributes.keySet()) {
|
||||||
|
boolean ok = an.startsWith("xmlns") || Utilities.existsInList(an,
|
||||||
|
"title", "style", "class", "ID", "lang", "xml:lang", "dir", "accesskey", "tabindex",
|
||||||
|
// tables
|
||||||
|
"span", "width", "align", "valign", "char", "charoff", "abbr", "axis", "headers", "scope", "rowspan", "colspan") ||
|
||||||
|
Utilities.existsInList(name + "." + an, "a.href", "a.name", "img.src", "img.border", "div.xmlns", "blockquote.cite", "q.cite",
|
||||||
|
"a.charset", "a.type", "a.name", "a.href", "a.hreflang", "a.rel", "a.rev", "a.shape", "a.coords", "img.src",
|
||||||
|
"img.alt", "img.longdesc", "img.height", "img.width", "img.usemap", "img.ismap", "map.name", "area.shape",
|
||||||
|
"area.coords", "area.href", "area.nohref", "area.alt", "table.summary", "table.width", "table.border",
|
||||||
|
"table.frame", "table.rules", "table.cellspacing", "table.cellpadding", "pre.space", "td.nowrap"
|
||||||
|
);
|
||||||
|
if (!ok)
|
||||||
|
errors.add("Error at "+path+": Found attribute "+name+"."+an+" in a resource");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (inPara && Utilities.existsInList(name, "div", "blockquote", "table", "ol", "ul", "p")) {
|
||||||
|
errors.add("Error at "+path+": Found "+name+" inside an html paragraph");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (childNodes != null) {
|
||||||
|
if ("p".equals(name)) {
|
||||||
|
inPara = true;
|
||||||
|
}
|
||||||
|
for (XhtmlNode child : childNodes) {
|
||||||
|
child.validate(errors, path, inResource, inPara);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public XhtmlNode addTag(String name)
|
public XhtmlNode addTag(String name)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!(nodeType == NodeType.Element || nodeType == NodeType.Document))
|
if (!(nodeType == NodeType.Element || nodeType == NodeType.Document)) {
|
||||||
throw new Error("Wrong node type - node is "+nodeType.toString()+" ('"+getName()+"/"+getContent()+"')");
|
throw new Error("Wrong node type - node is "+nodeType.toString()+" ('"+getName()+"/"+getContent()+"')");
|
||||||
|
}
|
||||||
|
|
||||||
XhtmlNode node = new XhtmlNode(NodeType.Element);
|
XhtmlNode node = new XhtmlNode(NodeType.Element);
|
||||||
node.setName(name);
|
node.setName(name);
|
||||||
childNodes.add(node);
|
childNodes.add(node);
|
||||||
|
@ -188,7 +233,6 @@ public class XhtmlNode implements IBaseXhtml {
|
||||||
childNodes.add(node);
|
childNodes.add(node);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XhtmlNode addText(String content)
|
public XhtmlNode addText(String content)
|
||||||
{
|
{
|
||||||
if (!(nodeType == NodeType.Element || nodeType == NodeType.Document))
|
if (!(nodeType == NodeType.Element || nodeType == NodeType.Document))
|
||||||
|
@ -747,6 +791,11 @@ public class XhtmlNode implements IBaseXhtml {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isPara() {
|
||||||
|
return "p".equals(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue