Exemple #1
0
        /// <summary>
        /// Parse a content text with error intercepts
        /// </summary>
        ParsedText ParseContentTextNext(String tagEnd, HParser parser, Func <Exception, bool> errorHandler)
        {
            ParsedText result = null;

            do
            {
                try
                {
                    result = parser.ParseContentText(tagEnd);
                    if (result == null)
                    {
                        break;
                    }
                }
                catch (Exception ex)
                {
                    if (errorHandler != null)
                    {
                        if (errorHandler(ex))
                        {
                            continue;
                        }
                    }
                    throw;
                }
            } while (result == null);
            return(result);
        }
Exemple #2
0
 /// <summary>
 ///		Interpreta los nodos
 /// </summary>
 private void ParseNodes(SyntaxNode objRoot, int intIndent)
 {         // Imprime la información del nodo
     ParsedText.AppendLine(new String('\t', intIndent) + objRoot.Kind());
     // Imprime la información de los nodos
     foreach (SyntaxNode objNode in objRoot.ChildNodes())
     {
         ParseNodes(objNode, intIndent + 1);
     }
 }
        public List <ParsedText> Parse(string text)
        {
            var results = new List <ParsedText>();

            // Line segmenting
            var lines      = text.Split('\n');
            var lineNumber = 0;

            foreach (var line in lines)
            {
                lineNumber += 1;

                var segments = line.Split(' ');
                var index    = 1;

                foreach (var segment in segments)
                {
                    var cleanedText = RemoveInvalidCharacters(segment).Trim().ToLower();

                    if (cleanedText.IsEmpty())
                    {
                        continue;
                    }

                    var model = new ParsedText
                    {
                        Index       = index,
                        Text        = segment,
                        CleanedText = cleanedText,
                        Line        = lineNumber
                    };

                    results.Add(model);

                    index += 1;
                }

                var uniqueWords = results.GroupBy(each => each.CleanedText).Select(each => each.Key);
                var words       = GetWords(uniqueWords.ToArray());

                foreach (var word in words)
                {
                    var matches = results.Where(each => each.CleanedText == word.Word);

                    foreach (var match in matches)
                    {
                        match.Word = word;
                    }
                }
            }

            return(results);
        }
Exemple #4
0
        /// <summary>
        /// Parse the next element
        /// </summary>
        public ParsedToken Parse()
        {
            CharInfo c;

            // If end of stream when stop here
            if (EOF)
            {
                return(null);
            }
            // Current token defined
            if (_CurrentToken != null)
            {
                // End tag out Doctype : error while end tag or doctype parsing, reset parser
                if (_CurrentToken.TokenType == ParsedTokenType.EndTag || _CurrentToken.TokenType == ParsedTokenType.Doctype)
                {
                    _CurrentRead = null;
                    _State       = ParseState.Content;
                    ResetTagBuffer();
                    LastParsed    = _CurrentToken;
                    _CurrentToken = null;
                    return(LastParsed);
                }
            }
            // Current Attribute defined
            if (_CurrentAttr != null)
            {
                LastParsed   = _CurrentAttr;
                _CurrentAttr = null;
                return(LastParsed);
            }
            // Current Read not empty ?
            if (_CurrentRead != null)
            {
                bool returnLast = true;
                switch (_State)
                {
                // Returns a non closed comment
                case ParseState.Comment:
                    String comment = GetCurrentRead(true);
                    comment    = comment.Substring(4).TrimStart();
                    LastParsed = new ParsedComment()
                    {
                        Position = _CurrentPosition,
                        Text     = HEntity.HtmlDecode(comment, RemoveUnknownOrInvalidEntities)
                    };
                    break;

                // Returns a text
                case ParseState.Content:
                    LastParsed = new ParsedText()
                    {
                        Position = _CurrentPosition,
                        Text     = HEntity.HtmlDecode(GetCurrentRead(true), RemoveUnknownOrInvalidEntities)
                    };
                    break;

                // Returns a text
                case ParseState.Doctype:
                case ParseState.ProcessInstruction:
                case ParseState.EndTag:
                case ParseState.Tag:
                    //LastParsed = new ParsedText() {
                    //    Position = _CurrentPosition,
                    //    Text = GetCurrentRead(true)
                    //};
                    _State     = ParseState.Content;
                    LastParsed = ParseText();
                    break;
                    // We forget the result
                    //default:
                    //    returnLast = false;
                    //    break;
                }
                _State = ParseState.Content;
                ResetTagBuffer();
                if (returnLast)
                {
                    return(LastParsed);
                }
            }
            // Read loop
            while (true)
            {
                // Read next char
                c = ReadChar();
                // EOF ?
                if (c == CharInfo.EOF)
                {
                    // Check unexpected EOF
                    if (_State != ParseState.Content)
                    {
                        _State = ParseState.Content;
                        ResetTagBuffer();
                        throw new ParseError("End of file unexpected.", ReadPosition);
                    }
                    // Stop the parsing
                    LastParsed = null;
                    EOF        = true;
                    return(null);
                }
                // Other case
                switch (_State)
                {
                // In text
                case ParseState.Content:
                    if (c == '<')
                    {
                        LastParsed = ParseStartTag();
                    }
                    else
                    {
                        LastParsed = ParseText();
                    }
                    return(LastParsed);

                // In tag or process instruction
                case ParseState.Tag:
                case ParseState.Doctype:
                case ParseState.ProcessInstruction:
                    SaveChar(c);
                    LastParsed = ParseInTag();
                    return(LastParsed);

                default:
                    break;
                }
            }
        }
Exemple #5
0
        /// <summary>
        /// Parse a content as raw text.
        /// </summary>
        /// <remarks>
        /// This method is used for parsing the content of the script, style tag content.
        /// The parsing is continue until matching the end of the <paramref name="tag"/>.
        /// If <paramref name="tag"/> is null or empty then we accept all endtag.
        /// </remarks>
        /// <exception cref="InvalidOperationException">
        /// Raised when the parser is not in a normal state : all tag need to be closed.
        /// </exception>
        /// <param name="tag">Tag name for the end tag expected.</param>
        /// <returns>Content</returns>
        public ParsedText ParseContentText(String tag)
        {
            // Verify
            if (this._State != ParseState.Content)
            {
                throw new InvalidOperationException("Can't read a content in a opened tag.");
            }
            // Read loop
            var      start = SourceReader.Position;
            CharInfo c;

            while ((c = ReadChar(false)) != CharInfo.EOF)
            {
                // End detected ?
                if (c == '<')
                {
                    var           endTagPos = c.Position;
                    StringBuilder saveTag   = new StringBuilder(15);
                    saveTag.Append(c);
                    while ((c = ReadChar(false)) != CharInfo.EOF && Char.IsWhiteSpace(c.AsChar))
                    {
                        saveTag.Append(c.AsChar);
                    }
                    if (c == '/')
                    {
                        // Pass '/'
                        saveTag.Append(c);
                        while ((c = ReadChar(false)) != CharInfo.EOF && Char.IsWhiteSpace(c.AsChar))
                        {
                            saveTag.Append(c.AsChar);
                        }
                        if (c != CharInfo.EOF)
                        {
                            // Pass tag name
                            StringBuilder tagName = new StringBuilder(10);
                            saveTag.Append(c.AsChar);
                            tagName.Append(c.AsChar);
                            while ((c = ReadChar(false)) != CharInfo.EOF && IsAttributeNameChar(c.AsChar))
                            {
                                saveTag.Append(c.AsChar);
                                tagName.Append(c.AsChar);
                            }
                            // We find the good end tag ?
                            if (c != CharInfo.EOF)
                            {
                                if (String.IsNullOrEmpty(tag) || String.Equals(tagName.ToString(), tag, StringComparison.OrdinalIgnoreCase))
                                {
                                    SaveChar(c);
                                    // Search the good end
                                    while ((c = ReadChar(false)) != CharInfo.EOF && Char.IsWhiteSpace(c.AsChar))
                                    {
                                        saveTag.Append(c.AsChar);
                                    }
                                    if (c == '>')
                                    {
                                        // Save the end tag for the next parse
                                        _CurrentToken          = ParsedTag.EndTag(tagName.ToString());
                                        _CurrentToken.Position = endTagPos;
                                        c = CharInfo.EOF;   // Don't save the char
                                        // Exit the loop
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    // If here then we don't find a good end tag we convert to 'text'
                    var etp = endTagPos;
                    foreach (var st in saveTag.ToString())
                    {
                        AddToCurrentRead(new CharInfo(st, etp++));
                    }
                }
                //
                AddToCurrentRead(c);
            }
            if (c != CharInfo.EOF)
            {
                SaveChar(c);
            }
            // Returns parse result
            LastParsed = new ParsedText()
            {
                Position = start,
                Text     = HEntity.HtmlDecode(GetCurrentRead(true), RemoveUnknownOrInvalidEntities)
            };
            return((ParsedText)LastParsed);
        }
Exemple #6
0
        private void btn_interpret_Click(object sender, EventArgs e)
        {
            mtm.rawtext = tbox_rawText.Text;
            clearAll();
            tbox_rawText.Text = mtm.rawtext;
            string s_b = "<b>";
            string s_bb = "</b>";
            string s_kakko = "<>";
            string s_id = "ID:";
            string s_lf = Environment.NewLine;
            int    pos, p_bb, p_kakko, p_kakko2, p_kakko3, p_kakko4, p_id;

            pos = p_bb = p_kakko = p_kakko2 = p_kakko3 = p_kakko4 = p_id = 0;
            int tmppos = 0;
            int i      = 0;

            p_bb    = mtm.rawtext.IndexOf(s_bb, 0);
            p_kakko = mtm.rawtext.IndexOf(s_kakko, 0);
            if (p_bb > -1)
            {
                while (pos >= 0)
                {
                    //</b>を探す
                    p_bb = mtm.rawtext.IndexOf(s_bb, pos);
                    //</b>の後の<>を探す
                    p_kakko  = mtm.rawtext.IndexOf(s_kakko, p_bb + s_bb.Length);
                    p_kakko2 = mtm.rawtext.IndexOf(s_kakko, p_kakko + s_kakko.Length);
                    //ID: を探す
                    p_id = mtm.rawtext.IndexOf(s_id, p_bb + s_kakko.Length);
                    //ID: の後の<>を探す
                    p_kakko3 = mtm.rawtext.IndexOf(s_kakko, p_id);
                    //書き込み内容の後の<>を探す
                    p_kakko4 = mtm.rawtext.IndexOf(s_kakko, p_kakko3 + s_kakko.Length);

                    ParsedText kakikomi = new ParsedText();
                    if (i == 0)
                    {
                        kakikomi.name = mtm.rawtext.Substring(pos, p_bb - pos - 1);
                    }
                    else
                    {
                        kakikomi.name = mtm.rawtext.Substring(pos + 1, p_bb - pos - 2);
                    }

                    pos = mtm.rawtext.IndexOf("\n", p_kakko4);
                    kakikomi.mailAddr = mtm.rawtext.Substring(p_kakko + s_kakko.Length, p_kakko2 - p_kakko - s_kakko.Length);
                    kakikomi.postTime = mtm.rawtext.Substring(p_id - 27, 26);
                    kakikomi.id       = mtm.rawtext.Substring(p_id + 3, p_kakko3 - p_id - 3);
                    kakikomi.comment  = mtm.rawtext.Substring(p_kakko3 + s_kakko.Length + 1,
                                                              p_kakko4 - 2 - (p_kakko3 + s_kakko.Length));
                    mtm.ptext.Add(kakikomi);

                    if (pos == tmppos)
                    {
                        break;
                    }
                    tmppos = pos;
                    i++;
                }
            }
            else if (p_kakko > -1)
            {
                while (pos >= 0)
                {
                    //<>を探す
                    p_kakko = mtm.rawtext.IndexOf(s_kakko, pos);
                    //<>の後の<>を探す
                    p_kakko2 = mtm.rawtext.IndexOf(s_kakko, p_kakko + s_kakko.Length);
                    //ID: を探す
                    p_id = mtm.rawtext.IndexOf(s_id, p_kakko2 + s_kakko.Length);
                    //ID: の後の<>を探す
                    p_kakko3 = mtm.rawtext.IndexOf(s_kakko, p_id);
                    //書き込み内容の後の<>を探す
                    p_kakko4 = mtm.rawtext.IndexOf(s_kakko, p_kakko3 + s_kakko.Length);

                    ParsedText kakikomi = new ParsedText();
                    if (i == 0)
                    {
                        kakikomi.name = mtm.rawtext.Substring(pos, p_kakko - pos);
                    }
                    else
                    {
                        kakikomi.name = mtm.rawtext.Substring(pos + 1, p_kakko - pos - 1);
                    }
                    pos = mtm.rawtext.IndexOf("\n", p_kakko4);
                    kakikomi.mailAddr = mtm.rawtext.Substring(p_kakko + s_kakko.Length, p_kakko2 - p_kakko - s_kakko.Length);
                    kakikomi.postTime = mtm.rawtext.Substring(p_id - 26, 25);
                    kakikomi.id       = mtm.rawtext.Substring(p_id + 3, p_kakko3 - p_id - 3);
                    kakikomi.comment  = mtm.rawtext.Substring(p_kakko3 + s_kakko.Length + 1,
                                                              p_kakko4 - 2 - (p_kakko3 + s_kakko.Length));
                    mtm.ptext.Add(kakikomi);
                    if (pos == tmppos)
                    {
                        break;
                    }
                    tmppos = pos;
                    i++;
                }
            }
            else
            {
                MessageBox.Show("</b>または<>が含まれる文章を入力してください。",
                                "エラー",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return;
            }

            //書き込み内容の行数を調べる
            mtm.resNum = mtm.ptext.Count();
            int   posi  = 0;
            byte  exist = 0;
            short brNum = -1;

            for (int j = 0; j < mtm.resNum; j++)
            {
                exist = 0;
                posi  = 1;
                brNum = -1;
                while (posi > 0)
                {
                    brNum++;
                    posi  = mtm.ptext[j].comment.IndexOf("<br>", posi + exist * 4);
                    exist = 1;
                }
                brNum++;
                mtm.lines.Add(brNum);
            }

            //レス返信&gt;&gt;を探して処理する
            processGt();

            //PanelにTextboxを追加して内容を書き込む,panel_checkboxにcheckboxを生成
            mkCboxAndTbox();

            //rightPanelViewの配列の長さを設定
            for (int j = 0; j < mtm.resNum; j++)
            {
                mtm.rightPanelViewChecked.Add(false);
            }
            leftDispChange();
        }