private ScanResult_Word GetNextWord(string Text,Segment CurrentSegment,int StartPos,ref bool HasComplex) { BlockType block= CurrentSegment.BlockType; #region ComplexFind int BestComplexPos =-1; Pattern BestComplexPattern =null; string BestComplexToken =""; ScanResult_Word complexword=new ScanResult_Word(); if (HasComplex) { foreach (Pattern pattern in block.ComplexPatterns) { PatternScanResult scanres= pattern.IndexIn (Text,StartPos,pattern.Parent.CaseSensitive,this.Separators); if (scanres.Token != "") { if (scanres.Index < BestComplexPos || BestComplexPos ==-1) { BestComplexPos=scanres.Index; BestComplexPattern = pattern; BestComplexToken = scanres.Token; } } } if (BestComplexPattern != null) { complexword.HasContent =true; complexword.ParentList = BestComplexPattern.Parent; complexword.Pattern = BestComplexPattern; complexword.Position = BestComplexPos; complexword.Token = BestComplexToken; HasComplex=true; } else { HasComplex=false; } } #endregion #region SimpleFind ScanResult_Word simpleword=new ScanResult_Word(); for (int i= StartPos ;i<Text.Length;i++) { //bailout if we found a complex pattern before this char pos if (i>complexword.Position && complexword.HasContent) break; #region 3+ char pattern if (i<=Text.Length-3) { string key=Text.Substring (i,3).ToLower (); PatternCollection patterns2 =(PatternCollection)block.LookupTable[key]; //ok , there are patterns that start with this char if (patterns2 != null) { foreach (Pattern pattern in patterns2) { int len=pattern.StringPattern.Length; if (i+len>Text.Length) continue; char lastpatternchar=char.ToLower(pattern.StringPattern[len-1]); char lasttextchar=char.ToLower (Text[i+len-1]); #region Case Insensitive if (lastpatternchar==lasttextchar) { if (!pattern.IsKeyword || (pattern.IsKeyword && pattern.HasSeparators (Text,i))) { if (!pattern.Parent.CaseSensitive) { string s=Text.Substring (i,len).ToLower (); if (s==pattern.StringPattern.ToLower()) { simpleword.HasContent =true; simpleword.ParentList = pattern.Parent; simpleword.Pattern = pattern; simpleword.Position = i; if (pattern.Parent.NormalizeCase) simpleword.Token = pattern.StringPattern; else simpleword.Token = Text.Substring (i,len); break; } } else { string s=Text.Substring (i,len); if (s==pattern.StringPattern) { simpleword.HasContent =true; simpleword.ParentList = pattern.Parent; simpleword.Pattern = pattern; simpleword.Position = i; simpleword.Token = pattern.StringPattern; break; } } } } } #endregion } } #endregion if (simpleword.HasContent) break; #region single char pattern char c=Text[i]; PatternCollection patterns =(PatternCollection)block.LookupTable[c]; if (patterns != null) { //ok , there are patterns that start with this char foreach (Pattern pattern in patterns) { int len=pattern.StringPattern.Length; if (i+len>Text.Length) continue; char lastpatternchar=pattern.StringPattern[len-1]; char lasttextchar=Text[i+len-1]; if (!pattern.Parent.CaseSensitive) { #region Case Insensitive if (char.ToLower(lastpatternchar)==char.ToLower(lasttextchar)) { if (!pattern.IsKeyword || (pattern.IsKeyword && pattern.HasSeparators (Text,i))) { string s=Text.Substring (i,len).ToLower (); if (s==pattern.StringPattern.ToLower()) { simpleword.HasContent =true; simpleword.ParentList = pattern.Parent; simpleword.Pattern = pattern; simpleword.Position = i; simpleword.Token = Text.Substring (i,len); break; } } } #endregion } else { #region Case Sensitive if (lastpatternchar==lasttextchar) { if (!pattern.IsKeyword || (pattern.IsKeyword && pattern.HasSeparators (Text,i))) { string s=Text.Substring (i,len); if (s==pattern.StringPattern) { simpleword.HasContent =true; simpleword.ParentList = pattern.Parent; simpleword.Pattern = pattern; simpleword.Position = i; simpleword.Token = pattern.StringPattern; break; } } } #endregion } } if (simpleword.HasContent) break; } #endregion } #endregion if (complexword.HasContent && simpleword.HasContent) { if (simpleword.Position == complexword.Position) { if (simpleword.Token.Length > complexword.Token.Length) return simpleword; else return complexword; } if (simpleword.Position < complexword.Position) return simpleword; if (simpleword.Position > complexword.Position) return complexword; } if (simpleword.HasContent) return simpleword; if (complexword.HasContent) return complexword; return new ScanResult_Word (); }
private ScanResult_Word GetNextComplexWord(String Text,Segment CurrentSegment,int StartPositon) { if (StartPositon >= Text.Length) return new ScanResult_Word (); ScanResult_Word Result = new ScanResult_Word (); int CurrentPosition = 0; //look for keywords foreach (PatternList List in CurrentSegment.BlockType.KeywordsList) { foreach (Pattern Word in List.ComplexPatterns) { PatternScanResult psr= Word.IndexIn (Text,StartPositon,false,Separators); CurrentPosition = psr.Index; if ((CurrentPosition < Result.Position || Result.HasContent == false) && psr.Token != "") { Result.HasContent =true; Result.Position = CurrentPosition; Result.Token =psr.Token; Result.Pattern = Word; Result.ParentList = List; if (List.NormalizeCase) if (!Word.IsComplex) Result.Token =Word.StringPattern; } } } //look for operators foreach (PatternList List in CurrentSegment.BlockType.OperatorsList) { foreach (Pattern Word in List.ComplexPatterns) { PatternScanResult psr= Word.IndexIn (Text,StartPositon,false,Separators); CurrentPosition = psr.Index; if ((CurrentPosition < Result.Position || Result.HasContent == false) && psr.Token != "") { Result.HasContent =true; Result.Position = CurrentPosition; Result.Token =psr.Token; Result.Pattern = Word; Result.ParentList = List; if (List.NormalizeCase) if (!Word.IsComplex) Result.Token =Word.StringPattern; } } } if (Result.HasContent) return Result; else return new ScanResult_Word (); }