Haml: पाठ के आसपास व्हाट्सएप को नियंत्रित करें


97

अपने रेल टेम्पलेट में, मैं एचएएमएल का उपयोग करके इस प्रभाव को अंतिम एचटीएमएल पूरा करना चाहता हूं:

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

ऐसा करने का एक बेहतर तरीका हैमल के सहायकों के माध्यम से पेश किया गया है:

चारों ओर से घेरना

= 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 विशेष रूप से) ? मेरे लिए यह अभी भी गैर-स्पष्ट है और थोड़ा बदसूरत लगता है: gist.github.com/1665374
जॉन

16
मुझे ऐसा लगता है कि मुझे कुछ याद आ रहा है (जबकि गिनती को देखते हुए), लेकिन सफल संस्करण मूल के बराबर नहीं है, क्योंकि अनुगामी अल्पविराम का प्रतिपादन किया जाएगा भले ही @condition == false, जो इस अल्पविराम से पहले अंतरिक्ष की तुलना में अधिक बदसूरत हो।
नैश ब्रिजेस

2
मैं पूर्ववर्ती का उपयोग करके सही परिणाम प्राप्त करने में कामयाब रहा, बजाय सफल होने के। चीयर्स!
कैम

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
यह उल्लेख करना भूल गया कि मुझे यह हामल
रयान क्रिस्पिन हेनीज़

3
यह टैग के साथ काम करता है लेकिन अभिव्यक्ति नहीं; आपके उदाहरण में आपने उसकी अभिव्यक्ति को टैग में बदल दिया है। मेरे पास एक ही मुद्दा है और दुर्भाग्य से यह कोई समाधान नहीं है।
टेफ्लॉन टेड

1
मैं टिप्पणी करता हूं कि &nbsp;इसका एक विशेष अर्थ है, यह एक सामान्य व्हाट्सएप नहीं है - यह गैर-ब्रेकिंग व्हाट्सएप है, जिसका अर्थ है कि शब्द-लपेटने के दौरान ब्राउज़र शब्दों को &nbsp;एक साथ बांधे रखने के लिए सब कुछ करेगा और यह हमेशा वह नहीं है जो आप चाहते हैं।
एंड्रयू

1
एंड्रयू की टिप्पणी के अलावा, केवल एक सादे व्हाट्सएप के &#032;बजाय का उपयोग करें &nbsp;
डेनियल एआर वर्नर

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 की बात आती है! मेरे मामले में मेरे पास एक पंक्ति थी, जहां इसका एक हिस्सा "अगर" द्वारा तय किया गया था, जिसे मैं mysamillidea के समाधान के साथ ठीक नहीं कर सकता था क्योंकि यह newlines से छुटकारा नहीं देता है, यह सिर्फ newline से पहले अल्पविराम को स्थानांतरित करता है। (हालांकि मैं इस बात से सहमत हूं कि मूल प्रश्न के उत्तर के लिए mysmallidea's सबसे अच्छा है।)
cesoid

6

आप HAML के 'एलीगेटर सिंटेक्स' का उपयोग कर सकते हैं

व्हॉट्सएप निष्कासन:> और <

और <आपको एक टैग के पास व्हॉट्सएप पर अधिक नियंत्रण दें। > एक टैग के आसपास के सभी व्हाट्सएप को हटा देगा, जबकि <एक टैग के भीतर सभी व्हाट्सएप को तुरंत हटा देगा। आप उन्हें व्हाट्सएप खाने वाले एलिगेटर्स के रूप में सोच सकते हैं:> टैग से बाहर का चेहरा और बाहर की तरफ व्हॉट्सएप खाता है, और <टैग में अंकित होता है और अंदर के व्हाट्सएप को खाता है। वे कक्षा, आईडी और विशेषता घोषणाओं के बाद, लेकिन / या = के बाद एक टैग परिभाषा के अंत में रखे जाते हैं।

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}

मुझे प्रक्षेप में शाब्दिक स्ट्रिंग का रूप पसंद नहीं है, लेकिन मैंने इसे पहले घोषित स्ट्रिंग या गतिशील रूप से पहले उत्पन्न तार के साथ उपयोग किया है।


Mhm। इस तरह की चीजों के लिए मेरा सामान्य दृष्टिकोण है, लेकिन मैंने वहां सशर्त का उपयोग करने के बारे में कभी नहीं सोचा था। यह शर्म की बात है कि मैं जिस वास्तविक टेम्प्लेट का उपयोग कर रहा था, वह वाक्य के दूसरे भाग की तुलना में थोड़ा अधिक जटिल था ... लेकिन यह निश्चित रूप से याद रखने योग्य है - धन्यवाद!
मैचू

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>

लेकिन मैं मानता हूं, एचएएमएल को ऐसा करने का बेहतर तरीका आना चाहिए, क्योंकि यह पृष्ठ पर अनावश्यक ASCII वर्ण जोड़ता है (लेकिन यह सहायकों का उपयोग करने की तुलना में अभी भी अधिक कुशल है)।


1

वहाँ कोण ब्रैकेट "व्हॉट्सएप मंचिंग" सिंटैक्स है, अन्यथा इसके लिए एक सहायक विधि लिखें।


उस काम के लिए वास्तव में एक सहायक कैसे होगा? मेह, मैं देखूंगा कि मैं क्या कर सकता हूं ...
माचू

व्हॉट्सएप कुतरने के लिए के रूप में, मैं उस वाक्य रचना को कैसे काम कर सकता हूं अगर यह किसी प्रकार की टैग परिभाषा पर नहीं है। क्या मैं सिर्फ गलत कर रहा हूं, या क्या यह वाक्य रचना बिना टैग के काम नहीं करती है?
माचिस

1

मुझे एक समान समस्या आई और मैंने पाया कि मुझे लगा कि मैं एक और समाधान पोस्ट करूंगा जिसके लिए एक सहायक विधि की आवश्यकता नहीं है। लिंक लपेटने के लिए रूबी प्रक्षेप # {} का प्रयोग करें और यदि कथन:

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फ़ाइल है - तथ्य यह है कि इसमें एक लिंक शामिल है और एक अल्पविराम वास्तव में किसी भी तरह से संकेत नहीं करता है।
माचिस

1
ओह समझा। मैंने अपना उत्तर संपादित कर लिया है, समाधान को अपने दम पर छोड़ने के लिए।
बिस्कुट 4

हालांकि यह काम कर सकता है मुझे लगता है कि यह मार्कअप को पढ़ने के लिए कठिन बनाता है। इसके बजाय बस एचएएमएल व्हाट्सएप मॉडिफायर्स का उपयोग करें <और> जैसा कि अन्य लोगों ने उल्लेख किया है जो आपके एचएएमएल को साफ और पठनीय रखता है।
टोड्डा

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"

आप उपयोग कर सकते हैं =, हालांकि =इसका उपयोग रेल कोड के परिणाम को उत्पन्न करने के लिए किया जाता है, लेकिन यहां इसका उद्देश्य होगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.