void ToFirstUpper(Wtroka& str) { if (!str.empty() && ::IsLower(str[0])) *(str.begin()) = static_cast<wchar16>(::ToUpper(str[0])); // TODO: this does not work properly for surrogate pairs (UTF-16) }
bool EqualCiRus(const Wtroka& s1, const char* s2) { static const CodePage& cp = *CodePageByCharset(CODES_WIN); const ui16* w = s1.begin(); for (; w != s1.end() && *s2 != 0; ++w, ++s2) if (::ToLower(*w) != ::ToLower(cp.unicode[static_cast<ui8>(*s2)])) return false; return w == s1.end() && *s2 == 0; }
// ищет закрывающую кавычку в текущем или последующем предложениях, // добавляет все слова до закрывающей кавычки к ResultToAdd // игнорируем внутренние кавычки bool CQuotesFinder::FindCloseQuoteInNextSentences(int StartSentNo, int StartWordForFirstSentence, Wtroka& ResultToAdd, yvector<SFactAddress>& FioInQuotes, SLeadInfo& LeadInfo) { Wtroka Add; yvector<SFactAddress> AddFioInQuotes; int Depth = 1; for (int SentNo=StartSentNo; (SentNo-StartSentNo<=2)&& (SentNo< (int)m_vecSentence.size()); SentNo++) { CSentenceRusProcessor* pSent = GetSentPrc(SentNo); yset<int> QuoteWords; int k=0; if (SentNo == StartSentNo) k = StartWordForFirstSentence; for (; k < (int)pSent->getWordsCount(); k++) { const CWord& w = *pSent->getWordRus(k); Add += w.GetOriginalText() + ' '; QuoteWords.insert(k); bool bHasCloseQuote = false; if (w.HasOpenQuote()) { if (ispunct(w.GetText()[0])) { Depth--; // одиночную кавычку знака препинания считаем закр. кавычкой (кто-то по ошибке поставил пробел) bHasCloseQuote = true;; } else Depth++; } if (w.HasCloseQuote()) { Depth--; if ((Depth == 1) // Закрывающая кавычка в конце предложения закрывает все открытые кавычки. && ((k+1 == (int)pSent->getWordsCount()) || ((k+2 == (int)pSent->getWordsCount()) && pSent->getWordRus(k+1)->IsPunct() ) ) ) { Depth = 0; } bHasCloseQuote = true; } if (w.GetText() == Wtroka::FromAscii("\"")) { if (k+1 == (int)pSent->getWordsCount() || pSent->getWordRus(k+1)->IsPunct()) { bHasCloseQuote = true; Depth--; } } if (bHasCloseQuote && Depth == 0) { if (!Add.empty() && Add[0] == '-') { const wchar16* beg = Add.begin() + 1; StripRangeBegin(beg, Add.end()); Add.assign(beg, Add.end() - beg); } if (ResultToAdd.back() == ',' && Add.size() > 0 && NStr::IsLangAlpha(Add[0], TMorph::GetMainLanguage()) && ::IsUpper(Add[0])) { ResultToAdd.erase(ResultToAdd.size() - 1); ResultToAdd += CharToWide(". "); } ResultToAdd += Add; AddFios(SentNo, QuoteWords, AddFioInQuotes); FioInQuotes.insert(FioInQuotes.end(), AddFioInQuotes.begin(), AddFioInQuotes.end()); LeadInfo.m_iLastSent = SentNo; return true; } } AddFios(SentNo, QuoteWords, AddFioInQuotes); } return false; }