Files
30-seconds-of-code/node_modules/remark-stringify/lib/visitors/link.js
2019-08-20 15:52:05 +02:00

54 lines
1.3 KiB
JavaScript

'use strict';
var uri = require('../util/enclose-uri');
var title = require('../util/enclose-title');
module.exports = link;
/* Expression for a protocol:
* http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax */
var PROTOCOL = /^[a-z][a-z+.-]+:\/?/i;
/* Stringify a link.
*
* When no title exists, the compiled `children` equal
* `url`, and `url` starts with a protocol, an auto
* link is created:
*
* <http://example.com>
*
* Otherwise, is smart about enclosing `url` (see
* `encloseURI()`) and `title` (see `encloseTitle()`).
*
* [foo](<foo at bar dot com> 'An "example" e-mail')
*
* Supports named entities in the `url` and `title` when
* in `settings.encode` mode. */
function link(node) {
var self = this;
var content = self.encode(node.url || '', node);
var exit = self.enterLink();
var escaped = self.encode(self.escape(node.url || '', node));
var value = self.all(node).join('');
exit();
if (
node.title == null &&
PROTOCOL.test(content) &&
(escaped === value || escaped === 'mailto:' + value)
) {
/* Backslash escapes do not work in autolinks,
* so we do not escape. */
return uri(self.encode(node.url), true);
}
content = uri(content);
if (node.title) {
content += ' ' + title(self.encode(self.escape(node.title, node), node));
}
return '[' + value + '](' + content + ')';
}