Haml: Kiểm soát khoảng trắng xung quanh văn bản


97

Trong mẫu Rails của tôi, tôi muốn hoàn thành HTML cuối cùng cho hiệu ứng này bằng cách sử dụng HAML:

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

Mẫu gần gũi:

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

Tuy nhiên, bạn có thể lưu ý rằng điều này tạo ra khoảng cách giữa liên kết và dấu phẩy. Có cách nào thực tế để tránh khoảng trắng này không? Tôi biết có cú pháp để loại bỏ khoảng trắng xung quanh thẻ, nhưng liệu cú pháp tương tự này có thể được áp dụng cho chỉ văn bản không? Tôi thực sự không thích giải pháp đánh dấu thêm để thực hiện điều này.

Câu trả lời:


210

Một cách tốt hơn để làm điều này đã được giới thiệu thông qua trình trợ giúp của Haml:

vây quanh

= surround '(', ')' do
  %a{:href => "food"} chicken
Sản xuất:
(<a href='food'>chicken</a>)

thành công :

click
= succeed '.' do
  %a{:href=>"thing"} here
Sản xuất:
click
<a href='thing'>here</a>.

trước :

= precede '*' do
  %span.small Not really
Sản xuất:
*<span class='small'>Not really</span>

Để trả lời câu hỏi ban đầu:

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
Sản xuất:
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met

1
Đúng lúc, tôi vừa tìm ra những điều này bằng cách đọc nguồn của Haml. Rõ ràng là họ đã tồn tại được một thời gian. Odd rằng họ không ghi lại chúng trong các trang tài liệu tham khảo chính ...
Groxx

1
Bạn có thể mở rộng câu trả lời của mình và thể hiện ví dụ của OP bằng cách sử dụng những trợ giúp này (có lẽ là succeedcụ thể) không? Đối với tôi nó vẫn có vẻ không rõ ràng và một chút xấu xí: gist.github.com/1665374
John

16
Tôi cảm thấy như mình đang thiếu thứ gì đó (trong khi xem xét số phiếu ủng hộ), nhưng biến thể thành công không tương đương với biến thể ban đầu, vì dấu phẩy ở cuối sẽ được hiển thị ngay cả khi @condition == false, cái này xấu hơn khoảng trắng trước dấu phẩy này.
Nash Bridges

2
Tôi quản lý để có được kết quả chính xác bằng cách sử dụng trước, thay vì thành công. Chúc mừng!
Cam

40

Bạn cũng có thể làm điều này bằng cách sử dụng công cụ sửa đổi "cắt khoảng trắng" của Haml. Việc chèn >sau khai báo Haml sẽ ngăn không cho khoảng trắng được thêm vào xung quanh nó:

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

sản xuất:

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

Tuy nhiên, như bạn có thể thấy, công cụ >sửa đổi cũng loại bỏ khoảng trắng phía trước liên kết, loại bỏ khoảng trống mong muốn giữa các từ và liên kết. Tôi vẫn chưa tìm ra cách nào tốt để giải quyết vấn đề này, ngoại trừ việc thêm &nbsp;vào cuối "Tôi sẽ là người đầu tiên", như sau:

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

Cuối cùng tạo ra đầu ra mong muốn mà không cần nhiều phép nội suy khó đọc:

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
Quên đề cập đến mà tôi nhận được điều này từ cheat sheet Haml, mà là rất hữu ích: cheat.errtheblog.com/s/haml
Ryan Crispin Heneise

3
Nó hoạt động với các thẻ nhưng không hoạt động với các biểu thức; trong ví dụ của bạn, bạn đã thay đổi biểu thức của anh ấy thành một thẻ. Tôi có cùng một vấn đề và rất tiếc đây không phải là một giải pháp.
Teflon Ted

1
Tôi sẽ nhận xét rằng nó &nbsp;có một ý nghĩa đặc biệt, đó không phải là một khoảng trắng thông thường - đó là khoảng trắng không ngắt, có nghĩa là trong trình duyệt gói từ sẽ làm mọi thứ để giữ các từ gắn với &nbsp;nhau và điều này không phải lúc nào cũng như bạn muốn.
Andrew

1
Ngoài nhận xét của Andrew, hãy sử dụng &#032;thay vì &nbsp;chỉ một khoảng trắng đơn thuần.
Daniel AR Werner

12

Được rồi, đây là giải pháp tôi đang giải quyết:

Người giúp đỡ

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

Lượt xem

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

Bằng cách đó, khoảng trắng bị loại trừ theo mặc định, nhưng tôi vẫn có thể bao gồm rõ ràng khoảng trắng bằng dòng "\ n". (Nó cần dấu gạch chéo ngược kép vì nếu không thì HAML hiểu nó như một dòng mới thực sự.) Hãy cho tôi biết nếu có một lựa chọn tốt hơn!


Lưu ý với thế giới: Tôi cuối cùng wised lên và di chuyển chúng để những người giúp đỡ: P
Matchu

Một lưu ý với thế giới: những ngày này, tôi sử dụng giải pháp Groxx của :)
Matchu

Điều này rất hữu ích khi nói đến haml tạo tệp văn bản! Trong trường hợp của tôi, tôi có một dòng trong đó một phần của nó được quyết định bởi "nếu", điều này tôi không thể sửa bằng giải pháp của mysamillidea vì nó không loại bỏ dòng mới, nó chỉ di chuyển dấu phẩy trước dòng mới. (Mặc dù tôi đồng ý rằng câu trả lời cho câu hỏi ban đầu của mysmallidea là tốt nhất.)
cesoid

6

Bạn có thể sử dụng 'cú pháp ký hiệu' của HAML

Xóa khoảng trắng:> và <

và <cung cấp cho bạn nhiều quyền kiểm soát hơn đối với khoảng trắng gần thẻ. > sẽ xóa tất cả khoảng trắng xung quanh thẻ, trong khi <sẽ xóa tất cả khoảng trắng ngay lập tức trong thẻ. Bạn có thể coi chúng như những con cá sấu ăn khoảng trắng:> quay mặt ra khỏi thẻ và ăn khoảng trắng ở bên ngoài và <quay mặt vào thẻ và ăn khoảng trắng ở bên trong. Chúng được đặt ở cuối định nghĩa thẻ, sau khai báo lớp, id và thuộc tính nhưng trước / hoặc =.

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


5

Sau khi tiếp cận, tôi đã thực hiện loại điều này là sử dụng nội suy chuỗi:

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

Tôi không thích giao diện của chuỗi chữ trong nội suy, nhưng tôi đã sử dụng nó với các chuỗi đã khai báo trước đó hoặc các chuỗi được tạo động trước đây.


Ừm. Đó là cách tiếp cận chung của tôi đối với những thứ như vậy, nhưng tôi chưa bao giờ nghĩ đến việc sử dụng điều kiện trong đó. Thật tiếc khi mẫu thực tế tôi đang sử dụng lại phức tạp hơn một chút so với chỉ một nửa sau của câu ... nhưng điều đó chắc chắn đáng nhớ - cảm ơn!
Matchu

5

Bạn có thể làm điều này để giữ khoảng trống hàng đầu:

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

Khoảng trống trong dấu ngoặc kép.


3

Mặc dù không được ghi chép đầy đủ, nhưng điều này đạt được một cách rõ ràng bằng cách sử dụng bảo toàn khoảng trắng HAML (>) kết hợp với một không gian ASCII (& # 32;), chứ không phải với trình trợ giúp:

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

Điều này sẽ tạo ra những gì bạn muốn:

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

Nhưng tôi đồng ý, HAML cần phải đưa ra một cách tốt hơn để làm điều này, vì nó thêm các ký tự ASCII không cần thiết vào trang (nhưng nó vẫn hiệu quả hơn so với sử dụng trình trợ giúp).


1

Có cú pháp ngoặc nhọn "phân nhánh khoảng trắng", nếu không, hãy viết một phương thức trợ giúp cho nó.


Làm thế nào chính xác sẽ là một người trợ giúp cho công việc đó? Meh, tôi sẽ thấy những gì tôi có thể đưa ra ...
Matchu

Đối với phân phối khoảng trắng, tôi không thể tìm ra cách làm cho cú pháp đó hoạt động nếu nó không nằm trên một số loại định nghĩa thẻ. Tôi chỉ làm sai hay cú pháp đó không hoạt động nếu không có thẻ?
Matchu

1

Tôi đã gặp một vấn đề tương tự và tìm thấy điều này nên tôi nghĩ tôi sẽ đăng một giải pháp khác không yêu cầu phương thức trợ giúp. Sử dụng nội suy Ruby # {} để bao bọc liên kết và câu lệnh 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}

Điều này hoạt động trong 3.0.18, nó cũng có thể hoạt động trong các bản phát hành trước đó.


Được, Haml không được thiết kế cho nội dung. Tuy nhiên, đây không phải là nội dung mà chúng ta đang nói về ở đó. Đó là một mẫu. Tác giả của bài đăng trên blog đó đang đề cập đến những thứ như viết một trang web tĩnh đầy đủ bằng Haml, đó không phải là điều tôi đang làm. Đoạn mã mà tôi cung cấp là khá nhiều .hamltệp đầy đủ - thực tế là nó bao gồm một liên kết và dấu phẩy không thực sự chỉ ra bất cứ điều gì theo cách này.
Matchu

1
Ah tôi thấy. Tôi đã chỉnh sửa câu trả lời của mình, để giải pháp tự tồn tại.
bánh quy

Mặc dù điều này có thể hiệu quả, tôi nghĩ rằng nó gây ra đánh dấu khó đọc. Thay vào đó, chỉ cần sử dụng các công cụ sửa đổi khoảng trắng HAML <và> như những người khác đã đề cập để giữ cho HAML của bạn sạch sẽ và dễ đọc.
ToddH

1

Tuy nhiên, một tùy chọn khác mà tôi đã sử dụng trong quá khứ:

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

0

Bạn cũng có thể luôn làm:

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

0

Giải pháp mà tôi đã làm việc là:

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

Bạn có thể sử dụng =, mặc dù =được sử dụng để xuất kết quả của mã Rails, nhưng ở đây nó sẽ phục vụ mục đích.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.