// yt - A fully featured command line YouTube client // // Copyright (C) 2024 Benedikt Peetz // 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 . 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/], });