about summary refs log tree commit diff stats
path: root/tree-sitter-yts/grammar.js
blob: 563f7f4a7c01525c620bbb7dcc56bc26ec73ffa5 (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
43
44
45
46
47
48
49
50
51
52
// yt - A fully featured command line YouTube client
//
// Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
// SPDX-License-Identifier: GPL-3.0-or-later
//
// This file is part of Yt.
//
// You should have received a copy of the License along with this program.
// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.

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", "watched", "wd", "add", "a", "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/],
});