/// <summary> /// Parses the helper. /// </summary> /// <param name="p">The p.</param> /// <returns>HtmlTag.</returns> private static HtmlTag ParseHelper(StringScanner p) { // Does it look like a tag? if (p.current != '<') { return(null); } // Skip '<' p.SkipForward(1); // Is it a comment? if (p.SkipString("!--")) { p.Mark(); if (p.Find("-->")) { var t = new HtmlTag("!"); t.m_attributes.Add("content", p.Extract()); t.m_closed = true; p.SkipForward(3); return(t); } } // Is it a closing tag eg: </div> bool bClosing = p.SkipChar('/'); // Get the tag name string tagName = null; if (!p.SkipIdentifier(ref tagName)) { return(null); } // Probably a tag, create the HtmlTag object now HtmlTag tag = new HtmlTag(tagName); tag.m_closing = bClosing; // If it's a closing tag, no attributes if (bClosing) { if (p.current != '>') { return(null); } p.SkipForward(1); return(tag); } while (!p.eof) { // Skip whitespace p.SkipWhitespace(); // Check for closed tag eg: <hr /> if (p.SkipString("/>")) { tag.m_closed = true; return(tag); } // End of tag? if (p.SkipChar('>')) { return(tag); } // attribute name string attributeName = null; if (!p.SkipIdentifier(ref attributeName)) { return(null); } // Skip whitespace p.SkipWhitespace(); // Skip equal sign if (p.SkipChar('=')) { // Skip whitespace p.SkipWhitespace(); // Optional quotes if (p.SkipChar('\"')) { // Scan the value p.Mark(); if (!p.Find('\"')) { return(null); } // Store the value tag.m_attributes.Add(attributeName, p.Extract()); // Skip closing quote p.SkipForward(1); } else { // Scan the value p.Mark(); while (!p.eof && !char.IsWhiteSpace(p.current) && p.current != '>' && p.current != '/') { p.SkipForward(1); } if (!p.eof) { // Store the value tag.m_attributes.Add(attributeName, p.Extract()); } } } else { tag.m_attributes.Add(attributeName, ""); } } return(null); }
public static TableSpec Parse(StringScanner p) { // Leading line space allowed p.SkipLinespace(); // Quick check for typical case if (p.current != '|' && p.current != ':' && p.current != '-') { return(null); } // Don't create the spec until it at least looks like one TableSpec spec = null; // Leading bar, looks like a table spec if (p.SkipChar('|')) { spec = new TableSpec(); spec.LeadingBar = true; } // Process all columns while (true) { // Parse column spec p.SkipLinespace(); // Must have something in the spec if (p.current == '|') { return(null); } bool AlignLeft = p.SkipChar(':'); while (p.current == '-') { p.SkipForward(1); } bool AlignRight = p.SkipChar(':'); p.SkipLinespace(); // Work out column alignment ColumnAlignment col = ColumnAlignment.NA; if (AlignLeft && AlignRight) { col = ColumnAlignment.Center; } else if (AlignLeft) { col = ColumnAlignment.Left; } else if (AlignRight) { col = ColumnAlignment.Right; } if (p.eol) { // Not a spec? if (spec == null) { return(null); } // Add the final spec? spec.Columns.Add(col); return(spec); } // We expect a vertical bar if (!p.SkipChar('|')) { return(null); } // Create the table spec if (spec == null) { spec = new TableSpec(); } // Add the column spec.Columns.Add(col); // Check for trailing vertical bar p.SkipLinespace(); if (p.eol) { spec.TrailingBar = true; return(spec); } // Next column } }