package ca.uhn.fhir.narrative.template.tags; import ca.uhn.fhir.narrative.template.LValue; import java.util.HashMap; import java.util.Map; import ca.uhn.fhir.narrative.template.nodes.LNode; /** * Tags are used for the logic in a template. */ public abstract class Tag extends LValue { public enum Statement { BREAK, CONTINUE; @Override public String toString() { return ""; } } /** * A map holding all tags. */ private static final Map<String, Tag> TAGS = new HashMap<String, Tag>(); static { // Register all standard tags. registerTag(new Assign()); registerTag(new Case()); registerTag(new Capture()); registerTag(new Comment()); registerTag(new Cycle()); registerTag(new For()); registerTag(new If()); registerTag(new Include()); registerTag(new Raw()); registerTag(new Tablerow()); registerTag(new Unless()); } /** * The name of this tag. */ public final String name; /** * Used for all package protected tags in the ca.uhn.fhir.narrative.template.tags-package * whose name is their class name lower cased. */ protected Tag() { this.name = this.getClass().getSimpleName().toLowerCase(); } /** * Creates a new instance of a Tag. * * @param name * the name of the tag. */ public Tag(String name) { this.name = name; } /** * Retrieves a filter with a specific name. * * @param name * the name of the filter to retrieve. * * @return a filter with a specific name. */ public static Tag getTag(String name) { Tag tag = TAGS.get(name); if (tag == null) { throw new RuntimeException("unknown tag: " + name); } return tag; } /** * Returns all default tags. * * @return all default tags. */ public static Map<String, Tag> getTags() { return new HashMap<String, Tag>(TAGS); } /** * Registers a new tag. * * @param tag * the tag to be registered. */ public static void registerTag(Tag tag) { TAGS.put(tag.name, tag); } /** * Renders this tag. * * @param context * the context (variables) with which this * node should be rendered. * @param nodes * the nodes of this tag is created with. See * the file `src/grammar/LiquidWalker.g` to see * how each of the tags is created. * * @return an Object denoting the rendered AST. */ public abstract Object render(Map<String, Object> context, LNode... nodes); }