grammar Tumblr

rule root
  (block / tag / orphan / literal)* <Tumblargh::Node::Root>
end

rule block
  block_start
  (block / tag / orphan / literal)*
  block_end
  <Tumblargh::Node::Block>
end

rule block_start
  '{block:' block_name space? block_arguments? '}' space? <Tumblargh::Node::BlockStart>
end

rule block_end
  '{/block:' block_name '}' space? <Tumblargh::Node::BlockEnd>
end

rule block_name
  [^\s}:;]+
end

rule block_arguments
  block_argument+
end

rule block_argument
  (([a-zA-Z0-9]+) '=' '"' ([a-zA-Z0-9]+) '"') space?
end

rule tag
  '{' tag_name '}' <Tumblargh::Node::Tag>
end

rule tag_name
  ([a-zA-Z0-9]+ ':'? [^\n:/{};\[\]\(\)]*)
end

rule orphan
  '{' !'/' <Tumblargh::Node::Literal>
end

rule literal
  [^{]+ <Tumblargh::Node::Literal>
end

rule space
  [\s]+
end

end