예제 #1
0
      private static void WorkWithLinks(TextToTokenParserContext context, int i)
      {
          if (context.Text[i] == '[')
          {
              if (context.TagStack.Count == 0)
              {
                  context.TagStack.Push((i, context.Text[i].ToString()));
                  return;
              }

              if (context.TagStack.Count != 0 && context.TagStack.Peek().Value == "[")
              {
                  context.TagStack.Pop();
              }
              context.TagStack.Push((i, context.Text[i].ToString()));
              return;
          }

          if (context.TagStack.Count == 0)
          {
              return;
          }
          if (context.Text[i] == ']')
          {
              var last = context.TagStack.Pop();
              if (last.Value == "[")
              {
                  context.TagStack.Push((last.Index, "[]"));
              }
              return;
          }

          if (context.Text[i] == '(')
          {
              var last = context.TagStack.Pop();
              if (i != 0 && context.Text[i - 1] == ']' && last.Value == "[]")
              {
                  context.TagStack.Push((last.Index, "[]("));
              }
              return;
          }

          if (context.Text[i] == ')')
          {
              var last = context.TagStack.Pop();
              if (last.Value == "[](")
              {
                  context.Result.Add(context.Text.GetToken(last.Index, i, last.Value));
              }
          }
      }
예제 #2
0
      public static List <Token> Parse(string text)
      {
          var context = new TextToTokenParserContext(text);

          for (var i = 0; i < text.Length; i++)
          {
              if (ShieldingSymbols.Contains(text[i]))
              {
                  WorkWithShielding(context, i);
                  continue;
              }
              if (char.IsDigit(text[i]))
              {
                  WorkWithDigits(context, i);
              }
              if (text[i] == ' ')
              {
                  context.Checkpoint     = true;
                  context.HasDigitBefore = false;
              }
              if (i != 0 && text[i - 1] != '\\')
              {
                  context.ShieldingList.Clear();
              }
              if (!SpecialSymbols.Contains(text[i]) ||
                  i != 0 && text[i - 1] == '\\' && context.ShieldingList.Count % 2 == 1)
              {
                  continue;
              }
              context.Checkpoint = false;
              if (text[i].IsLinkTag())
              {
                  WorkWithLinks(context, i);
              }
              if (text[i].Is_Tag())
              {
                  WorkWith_(context, i);
              }
          }

          foreach (var token in context.TempStrongTokens)
          {
              context.Result.Add(token);
          }
          return(context.Result);
      }
예제 #3
0
      private static void WorkWith_(TextToTokenParserContext context, int i)
      {
          if (context.TagStack.Count == 0 && context.IsCharCorrectToAdd(i, 1, OperationContext.Context.ToOpen))
          {
              context.TryToAdd_Tag((i, context.Text[i].ToString()));
              return;
          }

          if (context.TagStack.Count != 0 && context.TagStack.Peek().Index == i - 1 && context.TagStack.Peek().Value == "_")
          {
              context.TryToAdd__Tag((context.TagStack.Pop().Index, "__"));
              return;
          }

          if (context.TagStack.Count != 0)
          {
              context.TryToAdd_Tag((i, context.Text[i].ToString()));
          }
      }
예제 #4
0
 private static void WorkWithDigits(TextToTokenParserContext context, int i)
 {
     if (context.TagStack.Count != 0 || context.TempStrongTagStack.Count != 0)
     {
         return;
     }
     context.HasDigitBefore = true;
     if (!context.Checkpoint)
     {
         if (context.Last == Added.Result && context.Result.Count != 0)
         {
             context.Result.RemoveAt(context.Result.Count - 1);
         }
         if (context.Last == Added.Temp && context.TempStrongTokens.Count != 0)
         {
             context.TempStrongTokens.RemoveAt(context.TempStrongTokens.Count - 1);
         }
     }
 }
예제 #5
0
 private static void WorkWithShielding(TextToTokenParserContext context, int i)
 {
     context.ShieldingList.Add(i);
 }