lib/solid/parser/base_tag.ex

defmodule Solid.Parser.BaseTag do
  import NimbleParsec

  defp space(), do: Solid.Parser.Literal.whitespace(min: 0)

  def opening_tag() do
    string("{%")
    |> concat(optional(string("-")))
    |> concat(space())
  end

  def closing_tag() do
    closing_wc_tag = string("-%}")

    closing_wc_tag_and_whitespace =
      closing_wc_tag
      |> concat(space())
      |> ignore()

    space()
    |> concat(choice([closing_wc_tag_and_whitespace, string("%}")]))
  end

  def else_tag(parser) do
    ignore(opening_tag())
    |> ignore(string("else"))
    |> ignore(closing_tag())
    |> tag(parsec({parser, :liquid_entry}), :result)
  end
end