diff --git a/lib/hologram/template/parser.ex b/lib/hologram/template/parser.ex index b39996c73e..32920c85ff 100644 --- a/lib/hologram/template/parser.ex +++ b/lib/hologram/template/parser.ex @@ -266,6 +266,23 @@ defmodule Hologram.Template.Parser do |> parse_tokens(:end_tag, rest) end + def parse_tokens(context, :end_tag, [ + {:symbol, "-"} = token1 | [{:string, str} = token2 | rest] + ]) do + context + |> set_tag_name(context.tag_name <> "-" <> str) + |> add_processed_token(token1) + |> add_processed_token(token2) + |> parse_tokens(:end_tag, rest) + end + + def parse_tokens(context, :end_tag, [{:symbol, "-"} = token | rest]) do + context + |> set_tag_name(context.tag_name <> "-") + |> add_processed_token(token) + |> parse_tokens(:end_tag, rest) + end + def parse_tokens(context, :end_tag, [{:symbol, ">"} = token | rest]) do context |> add_end_tag() @@ -435,7 +452,6 @@ defmodule Hologram.Template.Parser do context |> reset_attributes() |> set_tag_name(tag_name) - |> maybe_enable_script_mode(tag_name) |> add_processed_token(token) |> set_prev_status(:start_tag_name) |> parse_tokens(:start_tag, rest) @@ -476,11 +492,36 @@ defmodule Hologram.Template.Parser do end def parse_tokens(context, :start_tag, [{:symbol, "/>"} = token | rest]) do - parse_start_tag_end(context, token, rest, true) + context + |> maybe_enable_script_mode(context.tag_name) + |> parse_start_tag_end(token, rest, true) end def parse_tokens(context, :start_tag, [{:symbol, ">"} = token | rest]) do - parse_start_tag_end(context, token, rest, false) + context + |> maybe_enable_script_mode(context.tag_name) + |> parse_start_tag_end(token, rest, false) + end + + def parse_tokens(%{prev_status: :start_tag_name} = context, :start_tag, [ + {:symbol, "-"} = token1 | [{:string, str} = token2 | rest] + ]) do + context + |> set_tag_name(context.tag_name <> "-" <> str) + |> add_processed_token(token1) + |> add_processed_token(token2) + |> set_prev_status(:start_tag_name) + |> parse_tokens(:start_tag, rest) + end + + def parse_tokens(%{prev_status: :start_tag_name} = context, :start_tag, [ + {:symbol, "-"} = token | rest + ]) do + context + |> set_tag_name(context.tag_name <> "-") + |> add_processed_token(token) + |> set_prev_status(:start_tag_name) + |> parse_tokens(:start_tag, rest) end def parse_tokens(context, :start_tag, [{:string, _str} = token | rest]) do diff --git a/test/elixir/hologram/template/parser_test.exs b/test/elixir/hologram/template/parser_test.exs index 4410dde428..8392dfe1e8 100644 --- a/test/elixir/hologram/template/parser_test.exs +++ b/test/elixir/hologram/template/parser_test.exs @@ -111,6 +111,66 @@ defmodule Hologram.Template.ParserTest do test "whitespaces after end tag name" do assert parse_markup("") == [end_tag: "div"] end + + test "hyphenated element start tag" do + assert parse_markup("") == [start_tag: {"foo-bar", []}] + end + + test "multi-hyphenated element start tag" do + assert parse_markup("") == [start_tag: {"foo-bar-baz", []}] + end + + test "hyphenated ending element start tag" do + assert parse_markup("") == [start_tag: {"foo-bar-", []}] + end + + test "element name cannot start with a hyphen" do + assert_raise TemplateSyntaxError, fn -> + parse_markup("<-foo>") + end + end + + test "multiple simultaneous hyphenated element start tag" do + assert parse_markup("") == [start_tag: {"foo--bar", []}] + end + + test "hyphenated element start tag with attributes" do + assert parse_markup(~s'') == [ + start_tag: {"foo-bar", [{"class", [text: "x"]}]} + ] + end + + test "hyphenated element self-closed start tag" do + assert parse_markup("") == [self_closing_tag: {"foo-bar", []}] + end + + test "multi-hyphenated element self-closed start tag" do + assert parse_markup("") == [self_closing_tag: {"foo-bar-baz", []}] + end + + test "hyphenated ending element self-closed start tag" do + assert parse_markup("") == [self_closing_tag: {"foo-bar-", []}] + end + + test "multiple consecutive hyphenated element self-closed start tag" do + assert parse_markup("") == [self_closing_tag: {"foo--bar", []}] + end + + test "hyphenated element end tag" do + assert parse_markup("") == [end_tag: "foo-bar"] + end + + test "multi-hyphenated element end tag" do + assert parse_markup("") == [end_tag: "foo-bar-baz"] + end + + test "hyphenated ending element end tag" do + assert parse_markup("") == [end_tag: "foo-bar-"] + end + + test "multiple simultaneous hyphenated element end tag" do + assert parse_markup("") == [end_tag: "foo--bar"] + end end describe "component tags" do