Автоматическое удаление всех новых строк из вывода Haml - PullRequest
4 голосов
/ 01 декабря 2010

Я использую Haml в приложении Rails 3, и его переводы строки сводят меня с ума!Например,

%span
  foo

отображается как

<span>
foo
</span>

Но я бы очень хотел

<span>foo</foo>

Причина (не считая чистого XML) заключается в том, чтодополнительные символы новой строки являются проблемой для моих тестов Selenium, потому что они портят возможность выполнять запросы XPath, такие как "//span[.='foo']".Поэтому я должен был бы написать '\nfoo\n' вместо этого (ew!) Или использовать //span[contains(text(), 'foo')], что соответствует слишком широко.

Я знаю, что мог бы использовать операторы аллигатора ("<" и ">")для удаления пробелов, но так как у меня никогда не было случая, когда я хочу, чтобы новые строки появлялись в выходных данных, я просто закончил бы механическим добавлением их в конце каждой строки.И это просто кажется очень неприятным.

Итак, теперь я вижу два решения:

  1. Заставить Хэмла никогда не испускать символы новой строки, если они не происходят из выражения Ruby.Я вижу некоторые nuke_inner_whitespace / nuke_outer_whitespace переменные, распространяющиеся по коду Haml, которые могут выполнять эту работу, но я не уверен, как их изменить, не прибегая к бесполезным мартышкам-патчам.

Любые указатели или другие предложения приветствуются!

Обновление: Я использовал приведенный ниже патч обезьяны Джейсона дляа сейчас и я начинаю думать, что оно того не стоит.Например, если я хочу получить <span>[del]</span> <span>foo</span>, трудно не иметь пробел между нюками.Даже следующее будет отображаться как [del]foo на странице:

%span
  = '[del] '
%span
  foo

Так что я думаю, что вернусь к добавлению операторов-аллигаторов вручную (см. Мой ответ ниже).Живи и учись.

Еще раз спасибо Джейсону!:)

Ответы [ 4 ]

11 голосов
/ 01 декабря 2010

Если поместить знак «меньше» в конце имени элемента, пробелы вокруг содержимого будут подавлены:

%span<
  foo

См. Удаление пробелов в ссылке Haml дляподробности.

Кажется, что нет никакого чистого способа принудительно включить эти флаги для всех тегов, но следующее исправление обезьяны прекрасно работает с Haml 3.0.24:

module Haml::Precompiler
  def parse_tag_with_nuked_whitespace(line)
    result = parse_tag_without_nuked_whitespace line
    unless result.size == 9 && [false,true].include?(result[4]) && [false,true].include?(result[5])
      raise "Unexpected parse_tag output: #{result.inspect}"
    end
    result[4] = true # nuke_outer_whitespace
    result[5] = true # nuke_inner_whitespace
    result
  end
  alias_method_chain :parse_tag, :nuked_whitespace
end

Itвероятно, было бы нетрудно раскошелиться на Haml и добавить опцию в Engine, чтобы всегда обнулять пробелы.Метод parse_tag может проверить эту опцию, если она включена, и установить для внутренних и внешних флагов значение true.Я оставлю это как упражнение для читателя.:)

2 голосов
/ 01 декабря 2010

Несколько способов сделать это:

%span foo

%span= "foo"

- foo = ["f", "o", "o"].join("")
%span= foo

%span #{"foo"}

- foo = ["f", "o", "o"].join("")
%span #{foo}
1 голос
/ 11 октября 2012

Подобно ответу @ yfeldblum, я решил просто разбить на новые строки и соединить пробелы, чтобы избежать новых строк в html, отображаемых в js.Например:

- content = capture_haml do
  %div
    %ul
      %li Stuff
# ...

, а затем -

:javascript
  var stuff = "#{content.split("\n").join(" ")}";
  // ...
0 голосов
/ 01 декабря 2010

Хорошо, я думаю, что я попытаюсь ответить на мой вопрос самостоятельно - вероятно, нет никакого чистого / разумного способа удалить все новые строки, но, возможно, мне это на самом деле не нужно.Чтобы обычные тестовые выражения XPath работали хорошо, достаточно, если у элементов inline нет символов новой строки вокруг них.

Так что, я полагаю, я просто помещу внутренний пробел-едок ("<") после любого тега, который содержит встроенные элементы (p, li, span, a и т. д.).Это, кажется, работает довольно хорошо до сих пор.Например, </p>

%div
  %ul
    %li<
      %span<
        stuff...

И все остальные (т.е. большинство) новых строк могут остаться и не причинят никакого вреда.

Извините всех за грязный вопрос!

...