summaryrefslogtreecommitdiff
path: root/js/ducktype.js
blob: 6e2ebe9cf26b9fade480b003d96e7a04957d9e45 (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
Language: Ducktype
Author: Shaun McCance <shaunm@gnome.org>
Website: https://twitter.com/shaunm
Category: markup
*/

function(hljs) {
  var ATTRLIST = {
    endsWithParent: true,
    relevance: 0,
    contains: [
      {
        className: 'attr',
        begin: />>[^\]\s]+/
      },
      {
        className: 'attr',
        begin: /(\.|#|>)?[A-Za-z0-9\._:#-]+/
      },
      {
        begin: /=/,
        relevance: 0,
        contains: [
          {
            className: 'string',
            endsParent: true,
            variants: [
              { begin: /"/, end: /"/ },
              { begin: /'/, end: /'/ },
              {begin: /[^\s"'\]]+/}
            ]
          }
        ]
      }
    ]
  };
  return {
    aliases: ['duck'],
    contains: [
      {
        className: 'section',
        variants: [
          { begin: /^=+ /, end: /$/ },
          { begin: /^-+ /, end: /$/ },
        ]
      },
      /* comments come in two forms: [-- fenced --] and [-] line */
      hljs.COMMENT(
        /^ *\[--/,
        /^ *--\]$/,
        { relevance: 10 }
      ),
      hljs.COMMENT(
        /^ *\[-\]/,
        /$/,
        { relevance: 10 }
      ),
      /* no-parse fences are enclosed in [[[ triple brackets ]]] */
      {
        className: 'code',
        begin: /^ *\[\[\[$/,
        end: /^ *\]\]\]$/,
        relevance: 10
      },
      /* block tags [look like=this] */
      {
        className: 'tag',
        begin: /^ *\[/,
        end: /\]$/,
        contains: [
          {
            className: 'name',
            begin: /[A-Za-z0-9\._:-]+/,
            relevance: 0
          },
          ATTRLIST
        ]
      },
      /* entity $references; */
      {
        className: 'tag',
        begin: /\$[a-zA-Z0-9][a-zA-Z0-9:]*;/
      },
      /* info elements are tagged @like[this] */
      {
        className: 'tag',
        begin: /^ *@[a-zA-Z][a-zA-Z:]*\[/,
        end: /\]/,
        contains: [
          ATTRLIST
        ]
      },
      /* parser directives look like info elements, but have a looser
         syntax. need to match them after info elements */
      {
        className: 'tag',
        begin: /^ *@/,
        end: /$/
      },
      /* inline element are tagged $like[this](and this) */
      {
        className: 'tag',
        begin: /\$[a-zA-Z][a-zA-Z:]*\[/,
        end: /\]/,
        contains: [
          ATTRLIST
        ]
      }
    ]
  };
}