ma11hew28
ma11hew28

Reputation: 126309

Can I create links with 'target="_blank"' in Markdown?

Is there a way to create a link in Markdown that opens in a new window? If not, what syntax do you recommend to do this? I'll add it to the markdown compiler I use. I think it should be an option.

Upvotes: 821

Views: 506509

Answers (24)

Jose Espin
Jose Espin

Reputation: 5

This works for me: [Page Link](your url here "(target|_blank)")

Upvotes: -3

leonardli
leonardli

Reputation: 19

You can add any attributes using {[attr]="[prop]"}

For example [Google](http://www.google.com){target="_blank"}

Upvotes: 1

alex
alex

Reputation: 490133

I don't think there is a markdown feature, although there may be other options available if you want to open links which point outside your own site automatically with JavaScript.

Array.from(document.links)
    .filter(link => link.hostname != window.location.hostname)
    .forEach(link => link.target = '_blank');

jsFiddle.

If you're using jQuery:

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

jsFiddle.

Upvotes: 136

Kuba Andrýsek
Kuba Andrýsek

Reputation: 63

If you work with MkDocs, you might be interested in the Open in a new tab - plugin

This plugin adds JS to open outgoing links and PDFs in a new tab.

Install the plugin using pip from PyPI:

pip3 install mkdocs-open-in-new-tab

Just add the plugin:

plugins:
  - search
  - open-in-new-tab

More about the plugin.

Upvotes: 1

atazmin
atazmin

Reputation: 5677

For "markdown-to-jsx" with MUI v5

This seem to work for me:

import Markdown from 'markdown-to-jsx';

...

  const MarkdownLink = ({ children, ...props }) => (
    <Link {...props}>{children}</Link>
  );

...

          <Markdown
            options={{
              forceBlock: true,
              overrides: {
                a: {
                  component: MarkdownLink,
                  props: {
                    target: '_blank',
                  },
                },
              },
            }}
          >
            {description}
          </Markdown>

Upvotes: 2

Aakash
Aakash

Reputation: 23717

For React + Markdown environment:

I created a reusable component:

export type TargetBlankLinkProps = {
  label?: string;
  href?: string;
};

export const TargetBlankLink = ({
  label = "",
  href = "",
}: TargetBlankLinkProps) => (
  <a href={href} target="__blank">
    {label}
  </a>
);

And I use it wherever I need a link that open in a new window.

Upvotes: 1

wav
wav

Reputation: 1552

In Laravel I solved it this way:

$post->text= Str::replace('<a ', '<a target="_blank"', $post->text);

Not works for a specific link. Edit all links in the Markdown text. (In my case it's fine)

Upvotes: 1

Thomas
Thomas

Reputation: 10055

If someone is looking for a global rmarkdown (pandoc) solution.

Using Pandoc Lua Filter

You could write your own Pandoc Lua Filter which adds target="_blank" to all links:

  1. Write a Pandoc Lua Filter, name it for example links.lua
function Link(element)

    if 
        string.sub(element.target, 1, 1) ~= "#"
    then
        element.attributes.target = "_blank"
    end
    return element

end
  1. Then update your _output.yml
bookdown::gitbook:
  pandoc_args:
    - --lua-filter=links.lua

Inject <base target="_blank"> in Header

An alternative solution would be to inject <base target="_blank"> in the HTML head section using the includes option:

  1. Create a new HTML file, name it for example links.html
<base target="_blank">
  1. Then update your _output.yml
bookdown::gitbook:
  includes:
    in_header: links.html

Note: This solution may also open new tabs for hash (#) pointers/URLs. I have not tested this solution with such URLs.

Upvotes: 4

guya
guya

Reputation: 5260

For ghost markdown use:

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

Found it here: https://cmatskas.com/open-external-links-in-a-new-window-ghost/

Upvotes: 12

meduvigo
meduvigo

Reputation: 1621

With Markdown v2.5.2, you can use this:

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

Upvotes: 98

moubi
moubi

Reputation: 340

Not a direct answer, but may help some people ending up here.

If you are using GatsbyJS there is a plugin that automatically adds target="_blank" to external links in your markdown.

It's called gatsby-remark-external-links and is used like so:

yarn add gatsby-remark-external-links

plugins: [      
  {
    resolve: `gatsby-transformer-remark`,
    options: {
      plugins: [{
        resolve: "gatsby-remark-external-links",
        options: {
          target: "_blank",
          rel: "noopener noreferrer"
        }
      }]
    }
  },

It also takes care of the rel="noopener noreferrer".

Reference the docs if you need more options.

Upvotes: 14

Faka
Faka

Reputation: 166

If you just want to do this in a specific link, just use the inline attribute list syntax as others have answered, or just use HTML.

If you want to do this in all generated <a> tags, depends on your Markdown compiler, maybe you need an extension of it.

I am doing this for my blog these days, which is generated by pelican, which use Python-Markdown. And I found an extension for Python-Markdown Phuker/markdown_link_attr_modifier, it works well. Note that an old extension called newtab seems not work in Python-Markdown 3.x.

Upvotes: 0

Serge Stroobandt
Serge Stroobandt

Reputation: 31488

Automated for external links only, using GNU sed & make

If one would like to do this systematically for all external links, CSS is no option. However, one could run the following sed command once the (X)HTML has been created from Markdown:

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

This can be further automated by adding above sed command to a makefile. For details, see GNU make or see how I have done that on my website.

Upvotes: 0

farnoy
farnoy

Reputation: 7766

Kramdown supports it. It's compatible with standard Markdown syntax, but has many extensions, too. You would use it like this:

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

Upvotes: 543

coatless
coatless

Reputation: 20746

So, it isn't quite true that you cannot add link attributes to a Markdown URL. To add attributes, check with the underlying markdown parser being used and what their extensions are.

In particular, pandoc has an extension to enable link_attributes, which allow markup in the link. e.g.

[Hello, world!](http://example.com/){target="_blank"}
  • For those coming from R (e.g. using rmarkdown, bookdown, blogdown and so on), this is the syntax you want.
  • For those not using R, you may need to enable the extension in the call to pandoc with +link_attributes

Note: This is different than the kramdown parser's support, which is one the accepted answers above. In particular, note that kramdown differs from pandoc since it requires a colon -- : -- at the start of the curly brackets -- {}, e.g.

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

In particular:

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

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

Upvotes: 32

Peter Danshov
Peter Danshov

Reputation: 155

I'm using Grav CMS and this works perfectly:

Body/Content:
Some text[1]

Body/Reference:
[1]: http://somelink.com/?target=_blank

Just make sure that the target attribute is passed first, if there are additional attributes in the link, copy/paste them to the end of the reference URL.

Also work as direct link:
[Go to this page](http://somelink.com/?target=_blank)

Upvotes: 11

aholub
aholub

Reputation: 451

One global solution is to put <base target="_blank"> into your page's <head> element. That effectively adds a default target to every anchor element. I use markdown to create content on my Wordpress-based web site, and my theme customizer will let me inject that code into the top of every page. If your theme doesn't do that, there's a plug-in

Upvotes: 20

midudev
midudev

Reputation: 1061

There's no easy way to do it, and like @alex has noted you'll need to use JavaScript. His answer is the best solution but in order to optimize it, you might want to filter only to the post-content links.

<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>

The code is compatible with IE8+ and you can add it to the bottom of your page. Note that you'll need to change the ".post-content a" to the class that you're using for your posts.

As seen here: http://blog.hubii.com/target-_blank-for-links-on-ghost/

Upvotes: 7

user5036455
user5036455

Reputation: 87

In my project I'm doing this and it works fine:

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

Link

But not all parsers let you do that.

Upvotes: 7

Bruno J. S. Lesieur
Bruno J. S. Lesieur

Reputation: 3865

For completed alex answered (Dec 13 '10)

A more smart injection target could be done with this code :

/*
 * 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');

You could change the regexp exceptions with adding more extension in (?!html?|php3?|aspx?) group construct (understand this regexp here: https://regex101.com/r/sE6gT9/3).

and for a without jQuery version, check code below:

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';
        } 
    }
}

Upvotes: 0

MrPenguin Pablo
MrPenguin Pablo

Reputation: 71

You can do this via native javascript code like so:

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

JSFiddle Code

Upvotes: 7

Danny
Danny

Reputation: 4114

I do not agree that it's a better user experience to stay within one browser tab. If you want people to stay on your site, or come back to finish reading that article, send them off in a new tab.

Building on @davidmorrow's answer, throw this javascript into your site and turn just external links into links with target=_blank:

    <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>

Upvotes: 0

user3167223
user3167223

Reputation: 31

I ran into this problem when trying to implement markdown using PHP.

Since the user generated links created with markdown need to open in a new tab but site links need to stay in tab I changed markdown to only generate links that open in a new tab. So not all links on the page link out, just the ones that use markdown.

In markdown I changed all the link output to be <a target='_blank' href="..."> which was easy enough using find/replace.

Upvotes: 0

Matchu
Matchu

Reputation: 85784

As far as the Markdown syntax is concerned, if you want to get that detailed, you'll just have to use HTML.

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

Most Markdown engines I've seen allow plain old HTML, just for situations like this where a generic text markup system just won't cut it. (The StackOverflow engine, for example.) They then run the entire output through an HTML whitelist filter, regardless, since even a Markdown-only document can easily contain XSS attacks. As such, if you or your users want to create _blank links, then they probably still can.

If that's a feature you're going to be using often, it might make sense to create your own syntax, but it's generally not a vital feature. If I want to launch that link in a new window, I'll ctrl-click it myself, thanks.

Upvotes: 608

Related Questions