Haml : 텍스트 주위의 공백 제어


97

내 Rails 템플릿에서 HAML을 사용하여이 효과에 대한 최종 HTML을 완성하고 싶습니다.

I will first <a href="http://example.com">link somewhere</a>, then render this half of the sentence if a condition is met

가까이 오는 템플릿 :

I will first
= link_to 'link somewhere', 'http://example.com'
- if @condition
  , then render this half of the sentence if a condition is met

그러나이 경우 링크와 쉼표 사이에 공백이 생깁니다. 이 공백을 피할 수있는 실용적인 방법이 있습니까? 태그 주위의 공백을 제거하는 구문이 있다는 것을 알고 있지만 동일한 구문을 텍스트에만 적용 할 수 있습니까? 이 작업을 수행하기위한 추가 마크 업 솔루션이 정말 마음에 들지 않습니다.

답변:


210

이를 수행하는 더 좋은 방법은 Haml의 도우미를 통해 소개되었습니다.

둘러 싸다

= surround '(', ')' do
  %a{:href => "food"} chicken
생성 :
(<a href='food'>chicken</a>)

성공 :

click
= succeed '.' do
  %a{:href=>"thing"} here
생성 :
click
<a href='thing'>here</a>.

선행 :

= precede '*' do
  %span.small Not really
생성 :
*<span class='small'>Not really</span>

원래 질문에 답하려면 :

I will first
= succeed ',' do
  = link_to 'link somewhere', 'http://example.com'
- if @condition
  then render this half of the sentence if a condition is met
생성 :
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met

1
좋은 타이밍, 방금 Haml의 소스를 읽음으로써 이것에 대해 알아 냈습니다. 분명히 그들은 한동안 주변에 있었다. 그들이 기본 참조 페이지에 문서화하지 않은 것이 이상합니다 ...
Groxx

1
답변을 확장하고 이러한 도우미 (아마 succeed구체적으로) 를 사용하여 OP의 예를 표현할 수 있습니까? 나에게 그것은 여전히 ​​분명하지 않고 약간 못생긴 것처럼 보인다 : gist.github.com/1665374
John

16
나는 (upvotes count를 보면서) 무언가를 놓치고 있다고 생각하지만 성공 변형은 원래 변형과 동일하지 않습니다 @condition == false.
Nash Bridges

2
성공보다는 선행을 사용하여 올바른 결과를 얻을 수있었습니다. 건배!
Cam

40

Haml의 "trim whitespace"수정자를 사용하여이 작업을 수행 할 수도 있습니다. >Haml 선언 뒤에 삽입 하면 공백이 추가되지 않습니다.

I will first
%a{:href => 'http://example.com'}> link somewhere
- if @condition
  , then render this half of the sentence if a condition is met

생성 :

I will first<a href='http://example.com'>link somewhere</a>, then render this half of the sentence if a condition is met

그러나 보시 >다시피 수정자는 링크 앞의 공백을 제거하여 단어와 링크 사이의 원하는 공백을 제거합니다. &nbsp;"I will first"의 끝에 다음과 같이 추가 하는 것을 제외하고는 아직이 문제를 해결할 방법을 찾지 못했습니다 .

I will first&nbsp;
%a{:href => 'http://example.com'}> link somewhere
- if @condition
  , then render this half of the sentence if a condition is met

마지막으로 읽기 어려운 보간없이 원하는 출력을 생성합니다.

I will first&nbsp;<span><a href="http://example.com">link somewhere</a></span>, then render this half of the sentence if a condition is met

1
내가 Haml 치트 시트에서 얻은 것을 언급하는 것을 잊었다. 이것은 매우 유용하다. cheat.errtheblog.com/s/haml
Ryan Crispin Heneise

3
태그에서는 작동하지만 표현식에서는 작동하지 않습니다. 귀하의 예에서 그의 표현을 태그로 변경했습니다. 나는 같은 문제가 있으며 불행히도 이것은 해결책이 아닙니다.
Teflon Ted

1
나는 &nbsp;그것에 특별한 의미를 가지고 있다는 것에 주목하고 싶습니다 . 그것은 평범한 공백이 아닙니다. 그것은 깨지지 않는 공백입니다. 즉, 단어 줄 바꿈 중에 브라우저가 단어를 &nbsp;함께 묶어 유지하기 위해 모든 것을 할 것이고 이것이 항상 원하는 것은 아닙니다.
Andrew

1
Andrew의 의견 외에도 일반 공백 &#032;대신 사용하십시오 &nbsp;.
Daniel AR Werner

12

좋아, 내가 정착하고있는 해결책은 다음과 같다.

돕는 사람

def one_line(&block)
  haml_concat capture_haml(&block).gsub("\n", '').gsub('\\n', "\n")
end

전망

I will first
- one_line do
  = link_to 'link somewhere', 'http://example.com'
  - if @condition
    , then render this half of the sentence
    \\n
    if a condition is met

이렇게하면 공백이 기본적으로 제외되지만 "\ n"줄로 명시 적으로 포함 할 수 있습니다. (그렇지 않으면 HAML이 실제 개행으로 해석하기 때문에 이중 백 슬래시가 필요합니다.) 더 나은 옵션이 있는지 알려주세요!


세계에 대한 참고 사항 : 나는 결국
깨어나서 이것을

세계에 대한 또 다른 메모 : 요즘 Groxx의 솔루션을 사용합니다. :)
Matchu

이것은 텍스트 파일을 생성하는 haml과 관련하여 매우 유용합니다! 제 경우에는 "if"에 의해 일부가 결정된 한 줄이 있었는데, mysamillidea의 솔루션으로는 줄 바꿈을 제거하지 않기 때문에 수정할 수 없었습니다. 단지 쉼표를 줄 바꿈 앞에 이동합니다. (원래 질문에 대한 답변은 mysmallidea가 최고라는 데 동의합니다.)
cesoid

6

HAML의 '악어 구문'을 사용할 수 있습니다.

공백 제거 :> 및 <

및 <태그 근처의 공백을 더 잘 제어 할 수 있습니다. >는 태그 주변의 모든 공백을 제거하고 <는 태그 내의 모든 공백을 즉시 제거합니다. 공백을 먹는 악어라고 생각할 수 있습니다.>는 태그 바깥 쪽을 향하고 바깥 쪽의 공백을 먹고, <얼굴을 태그 안쪽에 있고 안쪽의 공백을 먹습니다. 태그 정의의 끝, 클래스, ID 및 속성 선언 뒤, / 또는 = 앞에 배치됩니다.

http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_


5

이런 종류의 접근 방식을 취하면 문자열 보간을 사용하는 것입니다.

I will first #{link_to 'Link somewhere'}#{', then render this half of the sentence if a condition is met' if condition}

보간에서 리터럴 문자열의 모양이 마음에 들지 않지만 이전에 선언 된 문자열이나 동적으로 생성 된 문자열과 함께 사용했습니다.


음. 그것이 저의 일반적인 접근 방식이지만, 조건문을 사용할 생각은 없었습니다. 제가 사용한 실제 템플릿이 문장의 후반부보다 조금 더 복잡한 것으로 판명되었다는 것이 아쉽습니다 ...하지만 확실히 기억할 가치가 있습니다. 감사합니다!
Matchu

5

이렇게하면 선행 공백을 유지할 수 있습니다.

%a{:href => 'http://example.com'}>= ' link somewhere'

공백은 따옴표 안에 있습니다.


3

잘 문서화되어 있지는 않지만 HAML 공백 보존 (>)과 ASCII 공백 (& # 32;)을 사용하여 명확하게 달성되며 도우미는 사용하지 않습니다.

%a{:href=>'/home'}> Home link
,&#32; 
%a{:href=>'/page'} Next link

이렇게하면 원하는 것이 생성됩니다.

<a href='/home'>Anchor text</a>,&#32;
<a href='/page'>More text</a>

그러나 저는 동의합니다. HAML은 불필요한 ASCII 문자를 페이지에 추가하기 때문에 더 나은 방법을 찾아야합니다 (하지만 헬퍼를 사용하는 것보다 여전히 더 효율적입니다).


1

꺾쇠 괄호 "whitespace munching"구문이 있습니다. 그렇지 않으면 도우미 메서드를 작성하십시오.


도우미가 정확히 어떻게 작동할까요? Meh, 내가 무엇을 할 수 있는지 볼게요 ...
Matchu

공백 뭉침에 관해서는 어떤 종류의 태그 정의에 있지 않으면 구문이 작동하도록 만드는 방법을 찾을 수 없습니다. 내가 잘못하고 있습니까, 아니면 태그 없이는 구문이 작동하지 않습니까?
Matchu

1

나는 비슷한 문제를 발견하고 이것을 발견했기 때문에 도우미 방법이 필요하지 않은 다른 솔루션을 게시 할 것이라고 생각했습니다. Ruby 보간 # {}을 사용하여 링크와 if 문을 래핑합니다.

I will first 
#{link_to 'link somewhere', 'http://example.com'}#{if true : ", then render this half of the sentence if a condition is met" end}

3.0.18에서 작동하며 이전 릴리스에서도 작동 할 수 있습니다.


물론 Haml은 콘텐츠 용으로 설계되지 않았습니다. 그러나 이것은 우리가 여기서 이야기하는 내용이 아닙니다. 템플릿입니다. 그 블로그 게시물의 저자는 Haml에서 전체 정적 웹 페이지를 작성하는 것과 같은 것을 언급하고 있는데, 이것은 제가하는 일이 아닙니다. 내가 제공 한 코드 조각은 거의 전체 .haml파일입니다. 링크와 쉼표가 포함되어 있다는 사실은 실제로 어떤 방식으로도 표시하지 않습니다.
Matchu

1
아, 알겠습니다. 내 대답을 편집하여 솔루션을 독자적으로 유지했습니다.
비스킷

이것이 작동 할 수 있지만 마크 업을 읽기가 어렵게 만드는 것 같습니다. 대신 HAML을 깨끗하고 읽기 쉽게 유지하는 다른 사람들이 언급했듯이 HAML 공백 수정 자 <및>를 사용하십시오.
ToddH 2011 년

1

내가 과거에 사용한 또 다른 옵션 :

- if @condition
  %span> , then some more text after the link.

0

또한 항상 다음을 수행 할 수 있습니다.

= link_to url_path do 
  = ["part_1", "part_2"].join(", ")

0

내가 일한 해결책은 다음과 같습니다.

I will first
= link_to 'link somewhere', 'http://example.com'
- if @condition
  = ", then render this half of the sentence if a condition is met"

를 사용할 수 =있지만 =Rails 코드의 결과를 출력하는 데 사용되지만 여기서는 목적을 서버에 제공합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.