Example #1
0
		/// <summary>
		/// Processes formatting text.
		/// </summary>
		protected override void ProcessText()
		{
			Stack formatting = new Stack();
			int pos = 0;

			// Locate formatting tags
			MatchCollection matches = _recognizer.Matches(RawText);

			foreach (Match match in matches)
			{
				if (match.Index > pos)
				{
					string[] ss = Split(
						RawText.Substring(pos, match.Index - pos));

					// Collect formatting
					Styles f = Styles.Regular;
					object color = null;
					foreach (FormatToken token in formatting)
					{
						f |= token.Format;
						if (token.Format == Styles.Color)
							color = token.Param;
					}

					foreach (string s in ss)
					{
						Word word = null;
								
						if (color != null)
							word = new StyledWord(s, f, (Color)color);
						else
							word = new StyledWord(s, f, Color.Empty);

						InnerWords.Add(word);
					}

					// Advance pos
					pos = match.Index;
				}

				if (match.Index == pos)
				{
					// Modify formatting
					Styles f = Styles.Regular;
					object param = null;
					bool closing = match.Value.IndexOf("/") != -1;
					string mval = match.Value.ToLower();

					if (mval == "<b>" || mval == "</b>")
						f = Styles.Bold;

					else if (mval == "<i>" || mval == "</i>")
						f = Styles.Italic;

					else if (mval == "<u>" || mval == "</u>")
						f = Styles.Underline;

					else if (mval == "<sub>" || mval == "</sub>")
						f = Styles.Sub;

					else if (mval == "<sup>" || mval == "</sup>")
						f = Styles.Sup;

					else if (mval.IndexOf("color") != -1)
					{
						f = Styles.Color;
						if (!closing)
						{
							int spos = mval.IndexOf("#");
							string color = mval.Substring(spos + 1, 6);
							param = Color.FromArgb(
								int.Parse(color.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
								int.Parse(color.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
								int.Parse(color.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
						}
					}

					// It it is opening tag, add it to the stack,
					// otherwise - find the last corresponding opening
					// tag and remove it from the stack.
					if (!closing)
					{
						formatting.Push(new FormatToken(f, param));
					}
					else
					{
						Stack temp = new Stack();
						while (formatting.Count > 0)
						{
							if ((formatting.Peek() as FormatToken).Format == f)
								break;

							temp.Push(formatting.Pop());
						}

						// Remove if found
						if (formatting.Count > 0)
							formatting.Pop();

						// Return the remaining tokens
						while (temp.Count > 0)
							formatting.Push(temp.Pop());
					}

					// Advance pos
					pos += match.Length;
					continue;
				}

				throw new Exception("Styled text internal error.");
			}

			if (pos < RawText.Length)
			{
				string[] ss = Split(RawText.Substring(pos));

				// Collect formatting
				Styles f = Styles.Regular;
				object color = null;
				foreach (FormatToken token in formatting)
				{
					f |= token.Format;
					if (token.Format == Styles.Color)
						color = token.Param;
				}

				foreach (string s in ss)
				{
					Word word = null;
								
					if (color != null)
						word = new StyledWord(s, f, (Color)color);
					else
						word = new StyledWord(s, f, Color.Empty);

					InnerWords.Add(word);
				}
			}

			// Update the pure text
			_plainText = "";
			foreach (Word word in InnerWords)
				_plainText += word.Value;
		}
Example #2
0
        /// <summary>
        /// Processes formatting text.
        /// </summary>
        protected override void ProcessText()
        {
            Stack formatting = new Stack();
            int   pos        = 0;

            // Locate formatting tags
            MatchCollection matches = _recognizer.Matches(RawText);

            foreach (Match match in matches)
            {
                if (match.Index > pos)
                {
                    string[] ss = Split(
                        RawText.Substring(pos, match.Index - pos));

                    // Collect formatting
                    Styles f     = Styles.Regular;
                    object color = null;
                    foreach (FormatToken token in formatting)
                    {
                        f |= token.Format;
                        if (token.Format == Styles.Color)
                        {
                            color = token.Param;
                        }
                    }

                    foreach (string s in ss)
                    {
                        Word word = null;

                        if (color != null)
                        {
                            word = new StyledWord(s, f, (Color)color);
                        }
                        else
                        {
                            word = new StyledWord(s, f, Color.Empty);
                        }

                        InnerWords.Add(word);
                    }

                    // Advance pos
                    pos = match.Index;
                }

                if (match.Index == pos)
                {
                    // Modify formatting
                    Styles f       = Styles.Regular;
                    object param   = null;
                    bool   closing = match.Value.IndexOf("/") != -1;
                    string mval    = match.Value.ToLower();

                    if (mval == "<b>" || mval == "</b>")
                    {
                        f = Styles.Bold;
                    }

                    else if (mval == "<i>" || mval == "</i>")
                    {
                        f = Styles.Italic;
                    }

                    else if (mval == "<u>" || mval == "</u>")
                    {
                        f = Styles.Underline;
                    }

                    else if (mval == "<sub>" || mval == "</sub>")
                    {
                        f = Styles.Sub;
                    }

                    else if (mval == "<sup>" || mval == "</sup>")
                    {
                        f = Styles.Sup;
                    }

                    else if (mval.IndexOf("color") != -1)
                    {
                        f = Styles.Color;
                        if (!closing)
                        {
                            int    spos  = mval.IndexOf("#");
                            string color = mval.Substring(spos + 1, 6);
                            param = Color.FromArgb(
                                int.Parse(color.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
                                int.Parse(color.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
                                int.Parse(color.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
                        }
                    }

                    // It it is opening tag, add it to the stack,
                    // otherwise - find the last corresponding opening
                    // tag and remove it from the stack.
                    if (!closing)
                    {
                        formatting.Push(new FormatToken(f, param));
                    }
                    else
                    {
                        Stack temp = new Stack();
                        while (formatting.Count > 0)
                        {
                            if ((formatting.Peek() as FormatToken).Format == f)
                            {
                                break;
                            }

                            temp.Push(formatting.Pop());
                        }

                        // Remove if found
                        if (formatting.Count > 0)
                        {
                            formatting.Pop();
                        }

                        // Return the remaining tokens
                        while (temp.Count > 0)
                        {
                            formatting.Push(temp.Pop());
                        }
                    }

                    // Advance pos
                    pos += match.Length;
                    continue;
                }

                throw new Exception("Styled text internal error.");
            }

            if (pos < RawText.Length)
            {
                string[] ss = Split(RawText.Substring(pos));

                // Collect formatting
                Styles f     = Styles.Regular;
                object color = null;
                foreach (FormatToken token in formatting)
                {
                    f |= token.Format;
                    if (token.Format == Styles.Color)
                    {
                        color = token.Param;
                    }
                }

                foreach (string s in ss)
                {
                    Word word = null;

                    if (color != null)
                    {
                        word = new StyledWord(s, f, (Color)color);
                    }
                    else
                    {
                        word = new StyledWord(s, f, Color.Empty);
                    }

                    InnerWords.Add(word);
                }
            }

            // Update the pure text
            _plainText = "";
            foreach (Word word in InnerWords)
            {
                _plainText += word.Value;
            }
        }