void CGraphmatFile::DealQuotedKeySequence(size_t LB, size_t HB) { if (!IsOneOpenQuotationMark(LB)) return; long i = LB + 1; if (i == HB) return; if (!HasDescr(i, OKey1)) return ; for (; i < HB; i++) if (HasDescr(i, OKey2)) break; if (i == HB) return; i++; if (i == HB) return; if (!IsOneCloseQuotationMark(i)) return; for (long k=LB; k <= i; k++) { DeleteDescr(k,OKey1); DeleteDescr(k,OKey2); }; SetDes (LB, OKey1); SetDes (i, OKey2); SetState(LB,i+1,stGrouped); };
void CGraphmatFile::DealKeySequence(size_t LB, size_t HB) { if (!HasDescr(LB, OKey1)) return; long i=LB; for (; i< HB;) { if (!HasDescr(i, OKey1)) break; for (; i < HB; i++) if (HasDescr(i, OKey2)) break; if (i == HB) break; i++; if (i == HB) break; if (GetUnits()[i].IsSoft()) i++; }; if ((i == HB) || !HasDescr(i, OKey2)) i = BSoft(i-1); if (i-LB < 2) return; for (long k=LB; k <= i; k++) { DeleteDescr(k,OKey1); DeleteDescr(k,OKey2); }; SetDes (LB, OKey1); SetDes (i, OKey2); SetState(LB,i+1,stGrouped); };
void CPlmLine :: DeleteOb2() { m_bOborot2 = false; DeleteDescr("EXPR2"); };
/* HP1-HP2 Дефисной группой считается последовательность графематических слов, разделенных дефисом,например: красно-зеленый Комсомольск-на-Амуре В дефисной группе запрещены пробелы, но могут попадаться концы строк. Дефис с пробелами считается тире. Эта функция находит дефисные пары, и если начало дефисной пары совпадает с концом предыдущей дефисной пары, тогда объединяет эти пары в одну группу */ int CGraphmatFile::DealHyphenPaar (size_t i, size_t HB) { size_t nh,nt; bool fl_spc=false; if (i==0) return false; if (!IsHyphen(i)) return false; for (nh=i-1; nh>0 && GetUnits()[nh].IsSoft(); nh--) fl_spc = fl_spc || GetUnits()[nh].IsSpace (); for (nt=i+1; nt<HB && GetUnits()[nt].IsSoft(); nt++) fl_spc = fl_spc || GetUnits()[nt].IsSpace (); if ( !fl_spc && nh > 0 && nt < HB && (HasDescr (nh,ORLE) || HasDescr (nh,OLLE)) && (HasDescr (nt,ORLE) || HasDescr (nt,OLLE)) ) { /* если начало дефисной группы совпадает с концом предыдущей дефисной группы, тогда нужно объединить эти группы, например: Комсомольск-на-Амуре Но кол-во дефисов в группе не должно быть больше трех (ad-hoc) */ if (HasDescr (nh,OSHyp2)) { int i; for (i=nh-1; i > 0; i--) if (HasDescr (i,OSHyp1) ) break; if (nt - i <= 4) // четыре слова - это три дефиса { DeleteDescr(nh,OSHyp2); nh = i; SetDes (nt,OSHyp2); } else return false; } else { SetDes (nh,OSHyp1); SetDes (nt,OSHyp2); }; // если в дефисную группу попал однословный оборот, то нужно отменить его, например, может быть найден // оборот ЗГЛ=что в дефисной группе что-нибудь. long l=nh; for (; l<=nt; l++) if ( HasDescr (l,OOb1) && HasDescr (l,OOb2) ) { DeleteDescr(l,OOb1); DeleteDescr(l,OOb2); SetOborotNo(l, -1); }; // если в дефисная группа пересекается с оборотом, но оборот не вкладывает ее и не вкладывается в нее, // тогда нужно отменить дефисныую группу. Я это видеол только на ошибочном примере "бригад-тем не менее" // это какая-та ошибка при сканировании, но лучше ее обработать, иначе валится синтаксис bool bInOborot = false; for (l=nh; l<=nt; l++) { if ( HasDescr (l,OOb1) ) { bInOborot = true; }; if (HasDescr (l,OOb2) ) { if ( (!bInOborot) && ( l<nt) ) { bInOborot = true; break; }; bInOborot = false; }; }; if (bInOborot) { DeleteDescr(nh,OSHyp1); DeleteDescr(nt,OSHyp2); return false; }; return true; } return false; }
int CGraphmatFile::InitContextDescriptors (size_t LB, size_t HB) { int NumOfFilledLines = 0; // число непустых строк WORD FuzzyMinSpace; /* This variable is the fuzzy min left margin. It is used to determine indentions of the text when the text is more than BigTextLengthInFilledLines */ WORD MinSpace = 100; /* This variable is the min left margin of the whole text, it will be used for determintation of indentions. */ size_t i; InitEnglishNameSlot(*this); // === Смещение от левого края ===== vector<WORD> gLeftMargins; CalculateLMarg(*this, gLeftMargins); // === Обороты ===== DealOborotto (HB); // === Имена собственные (Им?) ===== DealNames (LB,HB); for (i=LB; i<HB; i++) DealEnglishStyleFIO (i, HB); for (i=LB; i<HB; i++) DealSimpleEnglishNames(*this, i, HB); // === Минимальный левый отступ ===== MapCorrectMinSpace (*this, LB+1,HB, FuzzyMinSpace,MinSpace, NumOfFilledLines, gLeftMargins); for (i=LB; i<HB; i++) DealModifierKey(i,HB); for (i=1; i<HB; i++) DealAbbrev(i,HB); // === Реф-отрезки ===== for (i=LB; i<HB; i++) DealReferences(i,HB); // === Даты ===== for (i=LB; i<HB; i++) DealDates (i,HB); //=========== InternetAddresses for (i=LB; i<HB; i++) DealInternetAddresses(i,HB); for (i=LB; i<HB; i++) DealAbbrigedInternetAddresses(i, HB); for (i=LB; i<HB; i++) DealEmailAddresses(i,HB); for (i=LB; i<HB; i++) DealFreeInternetAddresses(i,HB); // ============ расширения файлов for (i=LB; i<HB; i++) DealExtensionsAndLocalFileNames(i,HB); //=========== Keys for (i=LB; i<HB; i++) DealSimpleKey(i,HB); for (i=LB; i<HB; i++) DealKeySequence(i,HB); if (m_Language == morphGerman) for (i=LB; i<HB; i++) DealGermanDividedCompounds(i,HB); for (i=LB; i<HB; i++) DealFloatNumbers (i, HB); // === ФИО ===== for (i=LB; i<HB;) if (!HasDescr(i, OPass)) i = DealFIO (i,HB); else i++; DealAsteriskBullet (LB, HB); // === Все остальное ===== size_t LastAsteriskNo = 0; for (i=LB; i<HB; i++) { if (!HasDescr(i, OPass)) { DealHyphenPaar(i,HB); DealBullet(i,HB); DealBulletsWithTwoBrackets (i, HB); if (HasDescr(i,OBullet)) MapCorrectMinSpace (*this, i+1,HB, FuzzyMinSpace, MinSpace, NumOfFilledLines, gLeftMargins); size_t Offset = ( (NumOfFilledLines < (size_t)BigTextLengthInFilledLines) || (MinSpace == FuzzyMinSpace) || (gLeftMargins[i] < FuzzyMinSpace) ) ? MinSpace : FuzzyMinSpace; if (m_bUseIndention) DealIndention(*this, i, Offset, gLeftMargins); int LowerBorder = (gLeftMargins[i] == 0) ? gLeftMargins[i] : gLeftMargins[i] - 1; if ( (LastAsteriskNo != 0) && (gLeftMargins[LastAsteriskNo] <= gLeftMargins[i]+1) && (gLeftMargins[LastAsteriskNo] >= LowerBorder) && (GetUnit(LastAsteriskNo).GetInputOffset() < GetUnit(i).GetInputOffset() + 1000) && HasDescr(i, OPar) ) DeleteDescr(i,OPar); if (HasDescr(i, OBullet) && GetUnits()[i].IsAsterisk()) { LastAsteriskNo = PSpace(i+1, HB); }; }; } return 1; }