2011-09-23 3 views
6

yesod와 함께 제공되는 hamlet templating 언어를 사용하면 쉼표로 구분 된 목록을 인쇄하는 가장 좋은 방법은 무엇입니까?햄릿과 쉼표로 구분 된 목록을 인쇄하는 방법은 무엇입니까?

예. 하나의 엔트리를 인쇄하는이 코드를 가정 해 봅시다. 쉼표를 요소 사이에 어떻게 삽입합니까? 같은 Template Toolkit 같은

The values in the list are 
$ forall entry <- list 
    #{entry} 
and that is it. 

일부 템플릿 언어가 첫 번째 또는 마지막 반복을 감지하는 지침을 제공합니다 아니면 심지어는 "와"마지막 항목 앞에 추가합니다.

답변

5

그런 식으로 내장 된 것이 없다고 생각합니다. 다행히 Hamlet에서 도우미 함수를 사용하는 것은 쉽습니다. 예를 들어 항목이 일반 문자열 인 경우 Data.List.intercalate을 사용하여 쉼표를 추가 할 수 있습니다.

The values in the list are 
#{intercalate ", " list} 
and that is it. 

멋진 것들을하고 싶다면, 햄릿 값으로 작업 할 수있는 기능을 작성할 수 있습니다. 예를 들어, 다음은 쉼표를 추가하고 목록에서 햄릿 값 사이에 "and"를 추가하는 함수입니다.

commaify [x] = x 
commaify [x, y] = [hamlet|^{x} and ^{y}|] 
commaify (x:xs) = [hamlet|^{x}, ^{commaify xs}|] 

이 다른 하나 개에 햄릿 값을 삽입 ^{...} 문법을 사용한다. 이제 이것을 사용하여 쉼표로 구분 된 밑줄 친 단어 목록을 작성할 수 있습니다. 여기

The values in the list are 
^{commaify (map underline list)} 
and that is it. 

underline는 일반 텍스트보다 더 흥미로운 무언가를 생산하는 작은 도우미 함수입니다.

underline word = [hamlet|<u>#{word}|] 

렌더링 할 때 다음과 같은 결과가 나타납니다.

The values in the list are <u>foo</u>, <u>bar</u> and <u>baz</u> and that is it. 
+0

감사합니다. 솔루션 하스켈 (Template Haskell)이 제공하는 것만 큼 만족 스러울 지 모르지만, 솔루션의 훌륭한 컬렉션이라고 생각합니다. 어쩌면 특별한''loop'' 변수에 대한 패치를 hamlet에 제출해야합니다. –

관련 문제