54 lines
1.3 KiB
JavaScript
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 + ')';
|
|
}
|