aboutsummaryrefslogtreecommitdiff
path: root/index.js
blob: 6eb862d1901f85b5514119f0d0795cab66219f7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
'use strict';

var parseAttr = require('md-attr-parser');

module.exports = linkAttr;

function linkAttr() {
  var parser = this.Parser;
  var tokenizers;

  if (!isRemarkParser(parser)) {
    throw new Error('Missing parser to attach `remark-attr` [link] (to)');
  }

  tokenizers = parser.prototype.inlineTokenizers;

  linkTokenize.locator = tokenizers.link.locator;
  let oldLink = tokenizers.link;

  function linkTokenize(eat, value, silent) {
    let linkEaten = oldLink.bind(this)(eat,value,silent);

    var self = this;
    var index = 0;
    var pedantic = self.options.pedantic;
    var commonmark = self.options.commonmark;
    var gfm = self.options.gfm;
    var parsedAttr;
    const length = value.length;

    if( !linkEaten || !linkEaten.position ) {
      return undefined;
    }
    index = linkEaten.position.end.offset - linkEaten.position.start.offset;

    if (index < length && value.charAt(index) === '{' ) {
      parsedAttr = parseAttr(value, index);
    }

    if (parsedAttr) {
      linkEaten.data = {hProperties: parsedAttr.prop};
      linkEaten = eat(parsedAttr.eaten)(linkEaten);
    }
    return linkEaten;
  }

  tokenizers.link = linkTokenize;
}

function isRemarkParser(parser) {
  return Boolean(
    parser &&
    parser.prototype &&
    parser.prototype.inlineTokenizers &&
    parser.prototype.inlineTokenizers.link &&
    parser.prototype.inlineTokenizers.link.locator
  );
}