Jade: links dentro de um parágrafo

118

Estou tentando escrever alguns parágrafos com Jade, mas acho difícil quando há links dentro de um parágrafo.

O melhor que posso propor, e estou me perguntando se há uma maneira de fazer isso com menos marcação:

p
  span.
   this is the start
   of the para.
  a(href="http://example.com") a link
  span.
    and this is the rest of
    the paragraph.
mahemoff
fonte

Respostas:

116

No jade 1.0 existe uma maneira mais fácil de lidar com isso, infelizmente não consigo encontrá-la em nenhum lugar da documentação oficial.

Você pode adicionar elementos embutidos com a seguinte sintaxe:

#[a.someClass A Link!]

Portanto, um exemplo sem entrar em várias linhas no ap, seria algo como:

p: #[span this is the start of the para] #[a(href="http://example.com") a link] #[span and this is the rest of the paragraph]

Você também pode fazer elementos embutidos aninhados:

p: This is a #[a(href="#") link with a nested #[span element]]
Clayton Gulick
fonte
6
Isso está documentado aqui: jade-lang.com/reference/interpolation em "Tag Interpolation".
olan,
94

Você pode usar um filtro de redução e usar a redução (e HTML permitido) para escrever seu parágrafo.

:markdown
  this is the start of the para.
  [a link](http://example.com)
  and this is the rest of the paragraph.

Como alternativa, parece que você pode simplesmente produzir HTML sem problemas:

p
  | this is the start of the para.
  | <a href="http://example.com">a link</a>
  | and this is he rest of the paragraph

Eu não estava ciente disso e apenas testei usando a ferramenta de linha de comando jade. Parece funcionar muito bem.

EDITAR: Parece que realmente pode ser feito inteiramente em Jade da seguinte maneira:

p
  | this is the start of the para  
  a(href='http://example.com;) a link
  |  and this is the rest of the paragraph

Não se esqueça um espaço extra no final do Pará (embora você não pode vê-lo. E entre | and. Caso contrário, ele será parecido com este para.a linkandnãopara a link and

Daniel Baulig
fonte
1
Obrigado. Markdown é perfeito para isso. Descobri que o pacote de desconto NPM não compilou e há um problema com o pacote NPM markdown (o JS puro) com 0,5 (ele está usando expressões regulares como funções, removidas do Chrome). Para qualquer pessoa que esteja lendo, uma solução é aparentemente "npm install markdown-js" e, em seguida, renomeie-o para "markdown". (Como descobri, Jade não olha para "markdown-js".) Funcionou para mim.
mahemoff de
9
Parece que isso pode ser resolvido em um futuro próximo com interpolação, para que você possa fazer p This is a paragraph #[a(href="#") with a link] in it. Veja github.com/visionmedia/jade/issues/936
Será
3
Se você usar a terceira opção, tenha cuidado com o editor que está usando, estou usando o Sublime e ele removerá o espaço no final do parágrafo por padrão. Por fim, escolhi a opção 2 acima porque era a menos dolorosa.
Ryan Eastabrook
Sublime só tira os espaços finais se você mandar. Sim, então uso um &nbsp;no final da primeira linha, mas estou debatendo minhas abordagens no futuro.
Dave Newton
1
Isso foi resolvido no Jade 1.0, consulte stackoverflow.com/questions/6989653#answer-23923895
Emilien
45

Outra maneira de fazer isso:

p
  | this is the start of the para
  a(href="http://example.com") a link
  | this is he rest of the paragraph.
pera
fonte
4
Esta é a solução mais elegante.
superluminário
3

Outra abordagem completamente diferente seria criar um filtro, que primeiro tenta substituir os links e, em seguida, renderiza com jade segundo

h1 happy days
:inline
  p this can have [a link](http://going-nowhere.com/) in it

Renderiza:

<h1>happy days</h1><p>this can have <a href='http://going-nowhere.com/'>a link</a> in it</p>

Exemplo completo de trabalho: index.js (executado com nodejs)

var f, jade;

jade = require('jade');

jade.filters.inline = function(txt) {
  // simple regex to match links, might be better as parser, but seems overkill
  txt = txt.replace(/\[(.+?)\]\((.+?)\)/, "<a href='$2'>$1</a>");
  return jade.compile(txt)();
};

jadestring = ""+ // p.s. I hate javascript's non-handling of multiline strings
  "h1 happy days\n"+
  ":inline\n"+
  "  p this can have [a link](http://going-nowhere.com/) in it"


f = jade.compile(jadestring);

console.log(f());

Uma solução mais geral seria renderizar mini sub-blocos de jade em um único bloco (talvez identificado por algo como ${jade goes here}), então ...

p some paragraph text where ${a(href="wherever.htm") the link} is embedded

Isso poderia ser implementado exatamente da mesma maneira que acima.

Exemplo de trabalho de solução geral:

var f, jade;

jade = require('jade');

jade.filters.inline = function(txt) {
  txt = txt.replace(/\${(.+?)}/, function(a,b){
    return jade.compile(b)();
  });
  return jade.compile(txt)();
};

jadestring = ""+ // p.s. I hate javascript's non-handling of multiline strings
  "h1 happy days\n"+
  ":inline\n"+
  "  p this can have ${a(href='http://going-nowhere.com/') a link} in it"


f = jade.compile(jadestring);

console.log(f());
Billy Moon
fonte
1
Isso é uma solução muito complicada. Existem maneiras mais fáceis agora.
JGallardo
3

Se seus links vierem de uma fonte de dados, você pode usar:

  ul
    each val in results
      p
        | blah blah 
        a(href="#{val.url}") #{val.name}
        |  more blah

Veja interpolação

P.Brian.Mackey
fonte
2

Editar: este recurso foi implementado e o problema encerrado, consulte a resposta acima.


Eu postei um problema para adicionar esse recurso ao Jade

https://github.com/visionmedia/jade/issues/936

Ainda não tive tempo para implementá-lo, mais + 1s podem ajudar!

Jpillora
fonte
2
Muito obrigado @jpillora por criar esse problema, que terminou com a implementação deste recurso in-line.
Emilien
1

Este é o melhor que posso inventar

-var a = function(href,text){ return "<a href='"+href+"'>"+text+"</a>" }

p this is an !{a("http://example.com/","embedded link")} in the paragraph

Renderiza ...

<p>this is an <a href='http://example.com/'>embedded link</a> in the paragraph</p>

Funciona bem, mas parece um hack - deveria haver uma sintaxe para isso!

Billy Moon
fonte
0

Não sabia que o jade requer uma linha por etiqueta. Achei que podemos economizar espaço. Muito melhor se isso puder ser entendido ul> li> a [class = "emmet"] {text}

Paoloumali
fonte
0

Tive que adicionar um ponto final diretamente atrás de um link, assim:

This is your test [link].

Eu resolvi assim:

label(for="eula").lbl.lbl-checkbox.lbl-eula #{i18n.signup.text.accept_eula}
    | <a href="#about/termsandconditions" class=".lnk.lnk-eula">#{i18n.signup.links.eula}</a>.
Rick Pastoor
fonte
0

Como sugerido por Daniel Baulig, usado abaixo com parâmetros dinâmicos

| <a href=!{aData.link}>link</a>
Shams
fonte
0

Acontece que existe (pelo menos agora) uma opção perfeitamente simples

p Convert a .fit file using <a href="http://connect.garmin.com/"> Garmin Connect's</a> export functionality.
Simon H
fonte
2
Meio que anula o propósito de usar um pré-processador se você tiver que voltar ao html ao primeiro sinal de problema.
superluminário
2
Concordo, mas usar um tubo e uma nova linha toda vez que você precisar adicionar uma etiqueta em linha dificilmente seria o ideal. Novo no jade, mas parece uma grande omissão
Simon H
2
Eu também vim de um haml onde uma tag é prefixada com%. Jade é muito mais bonita.
superluminário
0
p
    | At Times Like These We Suggest Just Going:
    a(ui-sref="app") HOME
    | &nbsp;
Dr. Manhattan
fonte
-1

A coisa mais simples de todas;) mas eu estava lutando contra isso por alguns segundos. De qualquer forma, você precisa usar uma entidade HTML para o sinal "@" -> &#64; Se quiser incluir um link, digamos que seu / algum endereço de e-mail use isto:

p
    a(href="mailto:[email protected]" target="_top") me&#64;myemail.com
Pit Tanenbaum
fonte