/// <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); }
/// <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); }
/// <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; } } }
/// <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); }
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); } //レス返信>>を探して処理する processGt(); //PanelにTextboxを追加して内容を書き込む,panel_checkboxにcheckboxを生成 mkCboxAndTbox(); //rightPanelViewの配列の長さを設定 for (int j = 0; j < mtm.resNum; j++) { mtm.rightPanelViewChecked.Add(false); } leftDispChange(); }