From ed673310fe9166fe960bebe8f195911111a2a2dd Mon Sep 17 00:00:00 2001 From: Timofey Martynov Date: Sat, 22 Apr 2017 17:29:23 +0300 Subject: [PATCH] Fix inline nesting --- lib/slime/parser.ex | 10 +++++----- test/parser_test.exs | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/lib/slime/parser.ex b/lib/slime/parser.ex index d1d71a6..f1ef64e 100644 --- a/lib/slime/parser.ex +++ b/lib/slime/parser.ex @@ -57,14 +57,14 @@ defmodule Slime.Parser do end end - @inline_tag_regex ~r/\A(?(?:[\.#]?[\w-]+)++):\W*(?.*)/ + @inline_tag_regex ~r/\A(?(?:[\.#]?[\w-]+)++):[^\w\.#]*(?.*)/ def parse_line(line) do case strip_line(line) do {_indentation, ""} -> if Application.get_env(:slime, :keep_lines), do: {:prev, ""}, else: nil {indentation, line} -> - [tag, inline_tag] = + [tag, rest] = case Regex.run(@inline_tag_regex, line, capture: :all_but_first) do nil -> [line, nil] match -> match @@ -72,10 +72,10 @@ defmodule Slime.Parser do parse_tag = fn (tag) -> tag |> String.first |> parse_line(tag) end tag = parse_tag.(tag) - tag = if inline_tag do - inline_tag = parse_tag.(inline_tag) + tag = if rest do + {0, rest} = parse_line(rest) {tag_name, attrs} = tag - {tag_name, [{:children, [inline_tag]} | attrs]} + {tag_name, Keyword.put(attrs, :children, [rest])} else tag end diff --git a/test/parser_test.exs b/test/parser_test.exs index 1f37646..6d5eada 100644 --- a/test/parser_test.exs +++ b/test/parser_test.exs @@ -18,6 +18,30 @@ defmodule ParserTest do ] end + test "parses inline nesting" do + parsed = [".row: .col-lg-12: p Hello World"] |> Parser.parse_lines + assert parsed == [ + {0, {"div", + children: [ + {"div", + children: [ + {"p", + attributes: [], + children: ["Hello World"], + spaces: %{}, + close: false} + ], + attributes: [class: "col-lg-12"], + spaces: %{}, + close: false} + ], + attributes: [class: "row"], + spaces: %{}, + close: false} + } + ] + end + test "parses css classes with dashes" do {_, {"div", opts}} = ".my-css-class test" |> Parser.parse_line