LexerConf::Ptr_t ColoursAndFontsManager::GetLexer(const wxString& lexerName, const wxString& theme) const { ColoursAndFontsManager::Map_t::const_iterator iter = m_lexersMap.find(lexerName.Lower()); if(iter == m_lexersMap.end()) return m_defaultLexer; // Locate the requested theme LexerConf::Ptr_t firstLexer(NULL); LexerConf::Ptr_t defaultLexer(NULL); if(theme.IsEmpty()) { // return the active theme const ColoursAndFontsManager::Vec_t& lexers = iter->second; for(size_t i = 0; i < lexers.size(); ++i) { if(!firstLexer) { firstLexer = lexers.at(i); } if(!defaultLexer && lexers.at(i)->GetThemeName() == "Default") { defaultLexer = lexers.at(i); } if(lexers.at(i)->IsActive()) return lexers.at(i); } // No match if(defaultLexer) return defaultLexer; else if(firstLexer) return firstLexer; else return m_defaultLexer; } else { const ColoursAndFontsManager::Vec_t& lexers = iter->second; for(size_t i = 0; i < lexers.size(); ++i) { if(lexers.at(i)->GetThemeName() == theme) { return lexers.at(i); } } return m_defaultLexer; } }
LexerConf::Ptr_t ColoursAndFontsManager::GetLexerForFile(const wxString& filename) const { if(filename.IsEmpty()) return GetLexer("text"); wxFileName fnFileName(filename); wxString fileNameLowercase = fnFileName.GetFullName(); fileNameLowercase.MakeLower(); LexerConf::Ptr_t defaultLexer(NULL); LexerConf::Ptr_t firstLexer(NULL); // Scan the list of lexers, locate the active lexer for it and return it ColoursAndFontsManager::Vec_t::const_iterator iter = m_allLexers.begin(); for(; iter != m_allLexers.end(); ++iter) { wxString fileMask = (*iter)->GetFileSpec(); if(FileUtils::WildMatch(fileMask, filename)) { if((*iter)->IsActive()) { return *iter; } else if(!firstLexer) { firstLexer = *iter; } else if(!defaultLexer && (*iter)->GetThemeName() == "Default") { defaultLexer = *iter; } } } // If we got here, it means that we could not find an active lexer that matches // the file mask. However, if we did find a "firstLexer" it means // that we do have a lexer that matches the file extension, its just that it is not // set as active if(firstLexer) { return firstLexer; } // Try this: // Use the FileExtManager to get the file type by examinig its content LexerConf::Ptr_t lexerByContent; // Null by default FileExtManager::FileType fileType = FileExtManager::TypeOther; if(FileExtManager::AutoDetectByContent(filename, fileType) && fileType != FileExtManager::TypeOther) { switch(fileType) { case FileExtManager::TypeScript: lexerByContent = GetLexer("script"); break; case FileExtManager::TypePhp: lexerByContent = GetLexer("php"); break; case FileExtManager::TypeSourceCpp: lexerByContent = GetLexer("c++"); break; case FileExtManager::TypeXml: lexerByContent = GetLexer("xml"); break; case FileExtManager::TypePython: lexerByContent = GetLexer("python"); break; default: break; } } // If we managed to find a lexer by content, use it if(lexerByContent) return lexerByContent; // If we reached here, it means we could not locate an active lexer for this file type if(defaultLexer) { return defaultLexer; } else if(firstLexer) { return firstLexer; } else { // Return the "Text" lexer return GetLexer("text"); } }
LexerConf::Ptr_t ColoursAndFontsManager::GetLexerForFile(const wxString& filename) const { wxFileName fnFileName(filename); wxString fileNameLowercase = fnFileName.GetFullName(); fileNameLowercase.MakeLower(); LexerConf::Ptr_t defaultLexer(NULL); LexerConf::Ptr_t firstLexer(NULL); // Scan the list of lexers, locate the active lexer for it and return it ColoursAndFontsManager::Vec_t::const_iterator iter = m_allLexers.begin(); for(; iter != m_allLexers.end(); ++iter) { wxString fileMask = (*iter)->GetFileSpec().Lower(); wxArrayString masks = ::wxStringTokenize(fileMask, ";", wxTOKEN_STRTOK); for(size_t i = 0; i < masks.GetCount(); ++i) { if(::wxMatchWild(masks.Item(i), fileNameLowercase)) { if((*iter)->IsActive()) { return *iter; } else if(!firstLexer) { firstLexer = *iter; } else if(!defaultLexer && (*iter)->GetThemeName() == "Default") { defaultLexer = *iter; } } } } // Try this: // Use the FileExtManager to get the file type by examinig its content LexerConf::Ptr_t lexerByContent; // Null by default FileExtManager::FileType fileType = FileExtManager::TypeOther; if(FileExtManager::AutoDetectByContent(filename, fileType) && fileType != FileExtManager::TypeOther) { switch(fileType) { case FileExtManager::TypeScript: lexerByContent = GetLexer("script"); break; case FileExtManager::TypePhp: lexerByContent = GetLexer("php"); break; case FileExtManager::TypeSourceCpp: lexerByContent = GetLexer("c++"); break; case FileExtManager::TypeXml: lexerByContent = GetLexer("xml"); break; case FileExtManager::TypePython: lexerByContent = GetLexer("python"); break; default: break; } } // If we managed to find a lexer by content, use it if(lexerByContent) return lexerByContent; // If we reached here, it means we could not locate an active lexer for this file type if(defaultLexer) { return defaultLexer; } else if(firstLexer) { return firstLexer; } else { // Return the "Text" lexer return GetLexer("text"); } }