blob: f40f370a93093066cd088f1dd26a6ee9a583c716 [file] [log] [blame]
#ifndef IMAGE_IO_XML_XML_ELEMENT_RULES_H_ // NOLINT
#define IMAGE_IO_XML_XML_ELEMENT_RULES_H_ // NOLINT
#include "image_io/xml/xml_rule.h"
namespace photos_editing_formats {
namespace image_io {
/// The XmlElementRule parses the following syntax:
/// Element ::= EmptyElemTag | STag content ETag
/// EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
/// STag ::= '<' Name (S Attribute)* S? '>'
/// ETag ::= '</' Name S? '>'
/// The Attribute syntax is parsed by XmlAttributeRule, which this rule
/// delegates to as a child rule. The EmptyElemTag type syntax is handled by
/// this rule. The STag part of the syntax is handled by this rule, but the
/// element contents and the ETag syntax is handled by the XmlElementContentRule
/// that is chained to by this rule.
class XmlElementRule : public XmlRule {
public:
XmlElementRule();
explicit XmlElementRule(StartPoint start_point);
private:
/// Builds an XmlTokenContext from the XmlActionContext and calls the
/// handler's StartElement() function.
/// @param context The action context from the rule's terminal.
/// @return The result value from the handler's function.
DataMatchResult HandleName(const XmlActionContext& context);
/// Handles the book keeping after parsing the whitespace following the name
/// of the element, basically looking ahead to see if an XmlAttributeRule has
/// to be delegated to as a child rule, or if the element ends.
/// @param context The action context from the rule's terminal.
/// @return The result value action context.
DataMatchResult HandlePostWhitespaceChar(const XmlActionContext& context);
/// Builds an XmlTokenContext from the XmlActionContext and calls the
/// handler's FinishElement() function in response to the final literal in
/// the EmptyElemTag type sytax. As written in the comment for the XmlHandler
/// FinishElement() function, the token context passed to the handler in this
/// case will have an invalid range and a XmlPortion value of kNone - i.e.,
/// the element name is not available tfor this form of the element syntax.
/// @param context The action context from the rule's terminal.
/// @return The result value from the handler's function.
DataMatchResult HandleEmptyElemTagEnd(const XmlActionContext& context);
/// Handles the book keeping after parsing the final ">" literal of the STag
/// syntax of the rule, creating an XmlElementContentRule for use as a chained
/// to rule.
/// @param context The action context from the rule's terminal.
/// @return The result value action context.
DataMatchResult HandleSTagEnd(const XmlActionContext& context);
};
/// The XmlElementContentRule parses the following syntax:
/// (c? Element | PI | CDATA | Comment )+ ETag
/// The "c?" syntax represents the character data passed to the XmlHandler's
/// ElementContent() function. The syntax for Element, PI, CDATA and Comment
/// all cause a child rule to be created and delegated to. The ETag syntax will
/// cause this element to be finished with a DataMatchResult type of kFull.
class XmlElementContentRule : public XmlRule {
public:
XmlElementContentRule();
private:
/// Builds an XmlTokenContext from the XmlActionContext and calls the
/// handler's ElementContent() function.
/// @param context The action context from the rule's terminal.
/// @return The result value from the handler's function.
DataMatchResult HandleContent(const XmlActionContext& context);
/// Handles the book keeping after parsing the element's content characters,
/// and the first character literal ("<") of the Element, PI, CDATA or Comment
/// syntax, creating an appropriate child rule to delegate the processing to.
/// @param context The action context from the rule's terminal.
/// @return The result value action context.
DataMatchResult HandlePostOpenChar(const XmlActionContext& context);
/// Builds an XmlTokenContext from the XmlActionContext and calls the
/// handler's FinishElement() function. No check is done by the rule to verify
/// that the element name matches the one that was passed to the handler's
/// StartElement.
/// @param context The action context from the rule's terminal.
/// @return The result value from the handler's function.
DataMatchResult HandleEndTag(const XmlActionContext& context);
};
} // namespace image_io
} // namespace photos_editing_formats
#endif // IMAGE_IO_XML_XML_ELEMENT_RULES_H_ // NOLINT