use crate::detail::token::{Token, TokenKind};
use crate::element::{Element, ElementKind};
const EXTENSIONS: &[&str] = &[
"3gp", "avi", "divx", "flv", "m2ts", "m4v", "mkv", "mov", "mp4", "mpg", "ogm", "rm", "rmvb",
"ts", "webm", "wmv", "7z", "ass", "srt", "ssa", "zip",
];
pub(super) fn parse_file_extension(tokens: &mut [Token]) -> Option<Element> {
let len = tokens.len();
if len < 2 {
return None;
}
let is_extension = tokens.get(len - 1).is_some_and(|t| {
matches!(t.kind, TokenKind::Keyword | TokenKind::Text)
&& EXTENSIONS.contains(&t.value.to_ascii_lowercase().as_str())
});
let is_dot = tokens
.get(len - 2)
.is_some_and(|t| t.kind == TokenKind::Delimiter && t.value == ".");
if !is_extension || !is_dot {
return None;
}
let token = tokens.get_mut(len - 1)?;
token.kind = TokenKind::Text; token.keyword = None;
token.element_kind = Some(ElementKind::FileExtension);
Some(Element {
kind: ElementKind::FileExtension,
value: token.value.clone(),
position: token.position,
})
}