about summary refs log tree commit diff stats
path: root/tree-sitter-yts/grammar.js
blob: 8a9d61fec45006dd0c87e8c25e3f17e343122720 (plain) (blame)
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
module.exports = grammar({
  name: "yts",

  rules: {
    source_file: ($) => repeat(choice($.line, $.comment)),
    line: ($) =>
      seq($.command, repeat($.flag), $.id, $.title, $.date, $.author, $.duration, $.url, "\n"),

    command: ($) => choice("pick", "p", "watch", "w", "drop", "d", "url", "u"),
    flag: ($) =>
      choice(
              /-\w [^\s]+/,
              /-\w '[^']*'/,
              /-\w "[^"]*"/,
              /-\w=[^\s]+/,
              /-\w='[^']*'/,
              /-\w="[^"]*"/,

              /--\w[\w-]+ [^\s]+/,
              /--\w[\w-]+ '[^']*'/,
              /--\w[\w-]+ "[^"]*"/,
              /--\w[\w-]+=[^\s]+/,
              /--\w[\w-]+='[^']*'/,
              /--\w[\w-]+="[^"]*"/,
              ),
    id: ($) => /[a-z0-9]+/,
    title: ($) => seq($._q, /[^"]+/, $._q),
    date: ($) => seq($._q, /\d{4}-\d{2}-\d{2}/, $._q),
    author: ($) => seq($._q, /[^"]+/, $._q),
    duration: ($) =>
      seq(
        $._q,
        seq(choice("[No Duration]", /\d+m \d+s/, /\d+h \d+m/)),
        $._q,
      ),
    url: ($) => seq($._q, /[^"]+/, $._q),
    comment: ($) => /#.*/,
    _q: ($) => $.quote,
    quote: ($) => /"/,
  },
  extras: ($) => [/\s/],
});