Exemple #1
0
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);
};
Exemple #2
0
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);
};
Exemple #3
0
void CPlmLine :: DeleteOb2() 
{
	m_bOborot2 = false;
	DeleteDescr("EXPR2");
};
Exemple #4
0
/*
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;
}
Exemple #5
0
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;
}