Haml: ควบคุมช่องว่างรอบข้อความ


97

ในเทมเพลต Rails ของฉันฉันต้องการทำ HTML ขั้นสุดท้ายให้สำเร็จโดยใช้ HAML:

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

อย่างไรก็ตามคุณอาจสังเกตว่าสิ่งนี้ทำให้เกิดช่องว่างระหว่างลิงก์และลูกน้ำ มีวิธีใดในการหลีกเลี่ยงช่องว่างนี้หรือไม่? ฉันรู้ว่ามีไวยากรณ์สำหรับลบช่องว่างรอบ ๆ แท็ก แต่ไวยากรณ์เดียวกันนี้สามารถใช้กับข้อความได้หรือไม่ ฉันไม่ชอบวิธีแก้ปัญหาของมาร์กอัปพิเศษเพื่อทำสิ่งนี้ให้สำเร็จ

คำตอบ:


211

วิธีที่ดีกว่านี้ได้รับการแนะนำผ่านผู้ช่วยของ 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
คุณสามารถขยายคำตอบและแสดงตัวอย่างของ OP โดยใช้ตัวช่วยเหล่านี้ได้succeedหรือไม่( โดยเฉพาะอย่างยิ่ง) สำหรับฉันแล้วมันยังดูไม่ชัดเจนและน่าเกลียดเล็กน้อย: gist.github.com/1665374
John

16
ฉันรู้สึกว่าตัวเองขาดอะไรไป (ในขณะที่มองหาการนับคะแนนที่เพิ่มขึ้น) แต่ตัวแปรที่สำเร็จนั้นไม่เทียบเท่ากับตัวแปรดั้งเดิมเพราะจะแสดงเครื่องหมายจุลภาคต่อท้ายแม้ว่าจะมีการแสดงผล@condition == falseที่น่าเกลียดกว่าช่องว่างก่อนเครื่องหมายจุลภาคนี้ก็ตาม
Nash Bridges

2
ฉันจัดการเพื่อให้ได้ผลลัพธ์ที่ถูกต้องโดยใช้ precede แทนที่จะประสบความสำเร็จ ไชโย!
แคม

40

คุณสามารถทำได้โดยใช้ตัวปรับแต่ง "ตัดช่องว่าง" ของ Haml การแทรก>หลังการประกาศ 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&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
ใช้ได้กับแท็ก แต่ไม่ใช่นิพจน์ ในตัวอย่างของคุณคุณได้เปลี่ยนนิพจน์ของเขาเป็นแท็ก ฉันมีปัญหาเดียวกันและน่าเสียดายที่นี่ไม่ใช่วิธีแก้ปัญหา
เทฟลอน 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 จะตีความว่าเป็นบรรทัดใหม่จริง) แจ้งให้เราทราบหากมีตัวเลือกที่ดีกว่านี้


หมายเหตุสู่โลก: ในที่สุดฉันก็ตื่นขึ้นและย้ายสิ่งเหล่านี้ไปเป็นผู้ช่วย: P
Matchu

หมายเหตุอีกประการหนึ่งของโลก: ทุกวันนี้ฉันใช้โซลูชันของ Groxx :)
Matchu

สิ่งนี้มีประโยชน์มากเมื่อพูดถึง haml ที่สร้างไฟล์ข้อความ! ในกรณีของฉันฉันมีหนึ่งบรรทัดซึ่งส่วนหนึ่งของมันถูกตัดสินโดย "if" ซึ่งฉันไม่สามารถแก้ไขได้ด้วยโซลูชันของ mysamillidea เพราะมันไม่ได้กำจัดการขึ้นบรรทัดใหม่เพียงแค่เลื่อนคอมมาก่อนขึ้นบรรทัดใหม่ (แม้ว่าฉันจะยอมรับว่าสำหรับคำตอบของคำถามดั้งเดิม mysmallidea นั้นดีที่สุด)
cesoid

6

คุณสามารถใช้ 'aligator syntax' ของ 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" วงเล็บมุมหรือเขียนวิธีการช่วยเหลือสำหรับมัน


ผู้ช่วยจะทำงานนั้นได้อย่างไร? ฉันจะดูว่าฉันคิดอะไรได้บ้าง ...
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



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.