bool Anitomy::RemoveExtensionFromFilename(string_t& filename, string_t& extension) { const size_t position = filename.find_last_of(L'.'); if (position == string_t::npos) return false; extension = filename.substr(position + 1); const size_t max_length = 4; if (extension.length() > max_length) return false; if (!IsAlphanumericString(extension)) return false; // TODO: Add an option for this auto keyword = StringToUpperCopy(extension); if (!keyword_manager.Find(kElementFileExtension, keyword)) return false; filename.resize(position); return true; }
string_t KeywordManager::Normalize(const string_t& str) const { return StringToUpperCopy(str); }
void Parser::SearchForKeywords() { for (auto& token : tokens_) { if (token.category != kUnknown) continue; auto word = token.content; TrimString(word); // Don't bother if the word is a number that cannot be CRC if (word.size() != 8 && IsNumericString(word)) continue; // Performs better than making a case-insensitive Find auto keyword = StringToUpperCopy(word); for (int i = kElementIterateFirst; i < kElementIterateLast; i++) { auto category = static_cast<ElementCategory>(i); if (!parse_options.parse_release_group) if (category == kElementReleaseGroup) continue; if (!IsElementCategorySearchable(category)) continue; if (IsElementCategorySingular(category)) if (!elements_.empty(category)) continue; bool add_keyword = false; KeywordOptions options; switch (category) { case kElementFileChecksum: add_keyword = IsCrc32(word); break; case kElementVideoResolution: add_keyword = IsResolution(word); break; default: add_keyword = keyword_manager.Find(category, keyword, options); break; } if (add_keyword) { switch (category) { case kElementReleaseVersion: elements_.insert(category, word.substr(1)); // number without "v" break; default: elements_.insert(category, word); break; } if (options.safe || token.enclosed) token.category = kIdentifier; break; } } } }