Markdown'da 'target = “_ blank”' ile bağlantılar oluşturabilir miyim?


462

Markdown'da yeni bir pencerede açılan bir bağlantı oluşturmanın bir yolu var mı? Değilse, bunu yapmak için hangi sözdizimini önerirsiniz. Kullandığım markdown derleyicisine ekleyeceğim. Bence bu bir seçenek olmalı.


Cevaplarda belirtildiği gibi, işaretlemede bir özellik değildir. Bunu bağlantı kurmak için varsayılan bir site çapında yapmak istiyorsanız, David Morrow'un cevabı var . Ya da sadece bir örnekte yapmak istiyorsanız, Matchu'nun cevabı bunu aslında HTML'de yazmanız gerektiğini söylüyor.
JGallardo


Sorunuz ne yaptığınızla ilgili değil, ancak oluşturduğunuz bağlantının farklı bir alana işaret ettiğini ve bunları yeni bir sekmede açacağını fark eden bazı markalama motorları veya tarayıcıları (hangisi olduğundan emin değilim). Benim için kaldırma zamanlar vardır sden https:istediğim işlevselliği almak için yeterlidir.
Josh Gust

Yanıtlar:


379

Markdown sözdizimi ile ilgili olarak, bu ayrıntıyı öğrenmek istiyorsanız, HTML kullanmanız yeterlidir.

<a href="http://example.com/" target="_blank">Hello, world!</a>

Gördüğüm çoğu Markdown motoru, sadece genel bir metin işaretleme sisteminin kesmediği durumlar için düz eski HTML'ye izin veriyor. (Örneğin StackOverflow motoru.) Daha sonra, yalnızca Markdown belgesi bile kolayca XSS saldırıları içerebileceğinden, tüm çıktıyı bir HTML beyaz liste filtresi aracılığıyla çalıştırırlar. Bu nedenle, siz veya kullanıcılarınız _blankbağlantı oluşturmak istiyorsanız , muhtemelen yine de yapabilirler.

Bu, sık sık kullanacağınız bir özellikse, kendi sözdiziminizi oluşturmak mantıklı olabilir, ancak genellikle hayati bir özellik değildir. Bu bağlantıyı yeni bir pencerede başlatmak istersem, kendim tıklatacağım, teşekkürler.


19
Biliyor musun? Sana ve Alex'e katılıyorum . Hiç kullanmamaya karar verdim _blank. İşleri tek bir tarayıcıda tutmak daha iyi bir kullanıcı deneyimi. Söylediğiniz gibi sadece geri dönebilir veya komut tıklatabilirler (Mac kullanıcısı :)).
ma11hew28

1
Alanım dışındaki tüm bağlantılara _blank ekleyen sayfada javascript çalıştırıyorum. @alex'in bir sonraki cevabı var
David Silva Smith

4
(Açık ve satır içi okunabilir olma arzusunda) şu sözdizimini öneririm: açılış[Visit this page](http::/link.com( fikrini almak için .
Augustin Riedinger

4
Basit hedef = "_ boş" tehlikeli olabilir! Etikete ayrıca rel = "noopener" ekleyin! ( sites.google.com/site/bughunteruniversity/nonvuln/… )
Max Vyaznikov

1
@MaxVyaznikov İlginç. Tarayıcıların giriş için kenarın üstünde bir pencere açmasının daha güvenli olacağını düşünüyor musunuz? Web siteleri için giriş kullanıcı arayüzünü "benzer" web sayfaları tarafından oluşturulan sahte ve sahte giriş kullanıcı arayüzünden ayırın. Geçmişte daha zor olduğu yerde şimdi daha mümkün olabilir.
1.21 gigawatts

354

Kramdown bunu destekliyor. Standart Markdown sözdizimi ile uyumludur, ancak birçok uzantısı da vardır. Bunu şöyle kullanırsınız:

[link](url){:target="_blank"}

7
Bu, Mac'teki Markdown motorunu kullanarak işe yaramıyor gibi görünüyor :-(
Netsi1964

50
Jekyll ile harika çalışıyor!
bholagabbar

1
Kramdown sözdizimi: [bağlantı adı] (URL_LINK) {: target = "_ blank"} kramdown çevrimiçi editörü kullanarak HTML içine çözümlenebilir: http://trykramdown.herokuapp.com/ Zaten epeyce vardı çünkü kullandım kramdown referansları ve bunları yeniden yazmaktan kaçınmak istedim.
algoquant

4
Jekyll'de bunu varsayılan olarak ayarlamanın bir yolu var mı? Blog yazılarımdaki tüm bağlantıların açılmasını istiyorumtarget="_blank"
ahirschberg

11
Çalışmıyor. Yalnızca {: target = "_ blank"} öğesini metin olarak işler.
Benny

113

Ben bir markdown özelliği olduğunu sanmıyorum.

Kendi sitenizin dışına otomatik olarak JavaScript ile işaret eden bağlantıları açmak istiyorsanız başka seçenekler de olabilir.

var links = document.links;

for (var i = 0, linksLength = links.length; i < linksLength; i++) {
   if (links[i].hostname != window.location.hostname) {
       links[i].target = '_blank';
   } 
}

jsFiddle .

JQuery kullanıyorsanız biraz daha basit ...

$(document.links).filter(function() {
    return this.hostname != window.location.hostname;
}).attr('target', '_blank');

jsFiddle .


1
Sana katılıyorum, ancak bir iframe içinde olduğunuzda, bağlantı ile çerçeveden dışarı çıkmanız gerekiyor.
David Morrow

2
İnsanları yeni bir pencereye zorladığım tek zaman, dışarıdan bir yere bağlanan bir cümlenin yarısında olduğum ve akışı kesmeden yorumlarım için kaynak sağlamak istiyorum. Bu js snippet amaç için idealdir - teşekkürler, upvoted :)
tehwalrus

14
Sanırım Jakob Nielson'dan yapılan alıntı artık burada geçerli değil. Yeni pencereler açmaktan şikayet ediyor, ancak günümüzde target = "_ blank" bunun yerine yeni bir sekmede açılıyor. Diğer alanlara bağlantılar yeni sekmelerde açılmadığında kişisel olarak beğenmedim.
Alexander Rechsteiner

3
Ayrıca: çünkü söylemek Jakob Nielsen says you shouldn't do thatkorkunç bir argüman.
Ola Tuvesson

2
Burada şunu da ekleyeceğim ki, bu küresel bir çözüm olarak da tercih edilebilir. Markdown'un noktası olan Markdown'unuzu temiz tutar.
Adam Michael Wood

47

Markdown-2.5.2 ile şunları kullanabilirsiniz:

[link](url){:target="_blank"}

2
Bunu denedim ve benim için işe yaramadı. Django 1.6 ile kullanma
joel goldstick

5
Jekyll v2.4.0 ile çalışır (önceki sürümlerle de çalışabilir)
nicksuch

5
Bu kramdown (ve Jekyll kramdown kullandıkça Jekyll ile çalışır).
z3ntu

1
Bu sözdiziminin GitLab'de çalışması sağlanamıyor. Markdown'ın hangi sürümünün kullanımda olduğundan emin değilim.
Rockin4Life33

Her bağlantı için belirtmek zorunda değilim bu varsayılan yapmak için bir yolu var mı?
Connel

8

Küresel bir çözüm, <base target="_blank"> sayfanızın <head>öğesine koymaktır . Bu, her bağlantı elemanına etkili bir şekilde varsayılan bir hedef ekler. Wordpress tabanlı web sitemde içerik oluşturmak için markdown kullanıyorum ve tema özelleştiricim bu kodu her sayfanın üstüne yerleştirmeme izin verecek. Temanız bunu yapmazsa, bir eklenti vardır


8

Grav CMS kullanıyorum ve bu mükemmel çalışır:

Gövde / İçerik:
Some text[1]

Gövde / Referans:
[1]: http://somelink.com/?target=_blank

Önce hedef özelliğin iletildiğinden emin olun, bağlantıda ek özellikler varsa, bunları referans URL'nin sonuna kopyalayın / yapıştırın.

Ayrıca doğrudan bağlantı olarak çalışın:
[Go to this page](http://somelink.com/?target=_blank)



7

Hayalet markdown kullanımı için:

[Google](https://google.com" target="_blank)

Burada buldum : https://cmatskas.com/open-external-links-in-a-new-window-ghost/


1
çözümünü beğendim. Farklı konfigürasyonlarla denedim, sadece satır içi bağlantıda çalışıyor gibi görünüyor . belki referans linkleri ile bağlantı kurmanın bir yolu vardır . gibi bir şey [open new window][1] \n [1]: (https://abc.xyz" target="_blank). belki bir şeyi yanlış anlarım, ya da bu şekilde çalışmaktan bahsetmez miyim?
MrIsaacs

7

Dolayısıyla, bir Markdown URL'sine bağlantı nitelikleri ekleyemeyeceğiniz doğru değildir. Nitelik eklemek için, kullanılan işaretleme ayrıştırıcısının ve bunların uzantılarının ne olduğunu kontrol edin.

Özellikle, bağlantıda işaretlemeye izin veren bir pandocetkinleştirme uzantısına sahiptir link_attributes. Örneğin

[Hello, world!](http://example.com/){target="_blank"}
  • Gelenler için Ar örneğin kullanarak ( rmarkdown, bookdown,blogdown ve benzeri), bu istediğiniz sözdizimi.
  • Bu kullanmayan için Ar , sen gerekebilir uzantısını etkinleştirmek için çağrıda pandocile+link_attributes

Not: Bu, kramdownayrıştırıcının yukarıdaki kabul edilen cevaplardan biri olan desteğinden farklıdır . Özellikle, kramdown'un pandoc'dan farklı olduğuna dikkat edin - :- kıvrımlı parantezlerin başında - {}, ör.

[link](http://example.com){:hreflang="de"}

Özellikle:

# Pandoc
{ attribute1="value1" attribute2="value2"}

# Kramdown
{: attribute1="value1" attribute2="value2"}
 ^
 ^ Colon

Bu, özel etiketleme ortamımızda benim için çalıştı. Teşekkürler!
klewis

6

Bunu aşağıdaki gibi yerel javascript kodu ile yapabilirsiniz:

 
var pattern = /a href=/g;
var sanitizedMarkDownText = rawMarkDownText.replace(pattern,"a target='_blank' href=");

JSFiddle Kodu


6

Projemde bunu yapıyorum ve iyi çalışıyor:

[Link](https://example.org/ "title" target="_blank")

bağlantı

Ancak tüm ayrıştırıcılar bunu yapmanıza izin vermez.


Neredeyse işe yarıyor, ancak örneğiniz bile yeni attrs (başlık kaynağını görüntüleyin veya düğümü html olarak düzenleyin) yerine başlık attr'una kodlanmış url ile oluşturuyor: <a href="https://example.org/" rel="nofollow" title="title&quot; target=&quot;_blank">Link</a>
Graham P Heath

6

Bunu yapmanın kolay bir yolu yok ve @alex'in belirttiği gibi JavaScript kullanmanız gerektiğini belirtti. Cevabı en iyi çözümdür, ancak optimize etmek için yalnızca içerik sonrası bağlantılara filtre uygulamak isteyebilirsiniz.

<script>
    var links = document.querySelectorAll( '.post-content a' );  
    for (var i = 0, length = links.length; i < length; i++) {  
        if (links[i].hostname != window.location.hostname) {
            links[i].target = '_blank';
        }
    }
</script>

Kod IE8 + ile uyumludur ve sayfanızın altına ekleyebilirsiniz. ".Post-content a" öğesini yayınlarınız için kullandığınız sınıfa değiştirmeniz gerektiğini unutmayın.

Burada görüldüğü gibi: http://blog.hubii.com/target-_blank-for-links-on-ghost/


0

PHP kullanarak markdown uygulamaya çalışırken bu sorunla karşılaştım.

Kullanıcı tarafından oluşturulan, markdown ile oluşturulan bağlantıların yeni bir sekmede açılması gerektiğinden, site bağlantılarının sekmede kalması gerektiğinden, yalnızca yeni bir sekmede açılan bağlantılar oluşturmak için markdown'u değiştirdim. Dolayısıyla, sayfadaki tüm bağlantılar bağlantı oluşturmaz, yalnızca işaretleme kullanan bağlantılar bağlantılandırılmaz.

İşaretlemede <a target='_blank' href="...">, bul / değiştir özelliğini kullanarak yeterince kolay olan tüm bağlantı çıkışını değiştirdim.


0

Tek bir tarayıcı sekmesinde kalmanın daha iyi bir kullanıcı deneyimi olduğunu kabul etmiyorum. Kullanıcıların sitenizde kalmasını istiyorsanız veya bu makaleyi okumayı bitirmek için geri dönerseniz, yeni bir sekmede gönderin.

@ Davidmorrow'un cevabına dayanarak, bu javascript'i sitenize atın ve sadece harici bağlantıları target = _blank ile bağlantılara dönüştürün:

    <script type="text/javascript" charset="utf-8">
      // Creating custom :external selector
      $.expr[':'].external = function(obj){
          return !obj.href.match(/^mailto\:/)
                  && (obj.hostname != location.hostname);
      };

      $(function(){
        // Add 'external' CSS class to all external links
        $('a:external').addClass('external');

        // turn target into target=_blank for elements w external class
        $(".external").attr('target','_blank');

      })

    </script>


0

Tamamlanan alex için cevap (Aralık 13 '10)

Bu kodla daha akıllı bir enjeksiyon hedefi yapılabilir:

/*
 * For all links in the current page...
 */
$(document.links).filter(function() {
    /*
     * ...keep them without `target` already setted...
     */
    return !this.target;
}).filter(function() {
    /*
     * ...and keep them are not on current domain...
     */
    return this.hostname !== window.location.hostname ||
        /*
         * ...or are not a web file (.pdf, .jpg, .png, .js, .mp4, etc.).
         */
        /\.(?!html?|php3?|aspx?)([a-z]{0,3}|[a-zt]{0,4})$/.test(this.pathname);
/*
 * For all link kept, add the `target="_blank"` attribute. 
 */
}).attr('target', '_blank');

(?!html?|php3?|aspx?)Grup yapısına daha fazla uzantı ekleyerek normal ifade istisnalarını değiştirebilirsiniz (şu normal ifadeyi buradan anlayabilirsiniz: https://regex101.com/r/sE6gT9/3 ).

jQuery olmayan bir sürüm için aşağıdaki kodu kontrol edin:

var links = document.links;
for (var i = 0; i < links.length; i++) {
    if (!links[i].target) {
        if (
            links[i].hostname !== window.location.hostname || 
            /\.(?!html?)([a-z]{0,3}|[a-zt]{0,4})$/.test(links[i].pathname)
        ) {
            links[i].target = '_blank';
        } 
    }
}

0

GNU sed & make kullanarak yalnızca harici bağlantılar için otomatiktir

Biri bunu tüm harici bağlantılar için sistematik olarak yapmak istiyorsa, CSS bir seçenek değildir . Ancak, sedMarkdown'dan (X) HTML oluşturulduktan sonra aşağıdaki komut çalıştırılabilir :

sed -i 's|href="http|target="_blank" href="http|g' index.html

Bu, a'ya yukarıdaki sedkomutu ekleyerek daha da otomatik hale getirilebilir makefile. Ayrıntılar için, GNU bkz makeveya bunu yapmış nasıl üzerinde web siteme .


-3

Bu benim için çalışıyor: [Page Link] (burada URL'niz "(target | _blank)")

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.