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+ [^\s]+/, /--\w+ '[^']*'/, /--\w+ "[^"]*"/, /--\w+=[^\s]+/, /--\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/], });