📄 htmlparser.cpp
字号:
{ return Matches(wxT("</"));}bool wxSimpleHtmlParser::IsComment(){ return Matches(wxT("<!--"));}bool wxSimpleHtmlParser::IsDirective(){ return Matches(wxT("<!"));}bool wxSimpleHtmlParser::IsString(){ return (GetChar(m_pos) == (int) '"') ;}bool wxSimpleHtmlParser::IsWord(){ return (IsAlpha(GetChar(m_pos)));}bool wxSimpleHtmlParser::IsTagStartBracket(int ch){ return (ch == wxT('<'));}bool wxSimpleHtmlParser::IsTagEndBracket(int ch){ return (ch == wxT('>'));}bool wxSimpleHtmlParser::IsWhitespace(int ch){ return ((ch == 13) || (ch == 10) || (ch == 32) || (ch == (int) '\t')) ;}bool wxSimpleHtmlParser::IsAlpha(int ch){ return (wxIsalpha((wxChar) ch) != 0);}bool wxSimpleHtmlParser::IsWordChar(int ch){ return (wxIsalpha((wxChar) ch) != 0 || ch == wxT('-') || ch == wxT('_') || IsNumeric(ch));}bool wxSimpleHtmlParser::IsNumeric(int ch){ return (wxIsdigit((wxChar) ch) != 0 || ch == wxT('-') || ch == wxT('.')) ;}// Matches this string (case insensitive)bool wxSimpleHtmlParser::Matches(const wxString& tok, bool eatIt){ wxString text(m_text.Mid(m_pos, tok.Length())); bool success = (text.CmpNoCase(tok) == 0) ; if (success && eatIt) { m_pos += tok.Length(); } return success;}// Safe way of getting a characterint wxSimpleHtmlParser::GetChar(size_t i) const{ if (i >= m_length) return -1; return m_text[i];}void wxSimpleHtmlParser::Clear(){ if (m_topLevel) delete m_topLevel; m_topLevel = NULL; m_text = wxEmptyString; m_pos = 0; m_length = 0;}// Write this filevoid wxSimpleHtmlParser::Write(wxOutputStream& stream){ if (m_topLevel) m_topLevel->Write(stream);}bool wxSimpleHtmlParser::WriteFile(wxString& filename){ wxFileOutputStream fstream(filename); if (fstream.Ok()) { Write(fstream); return TRUE; } else return FALSE;}/* * wxSimpleHtmlTag * Representation of a tag or chunk of text */wxSimpleHtmlTag::wxSimpleHtmlTag(const wxString& tagName, int tagType){ m_name = tagName; m_type = tagType; m_attributes = NULL; m_children = NULL; m_parent = NULL; m_next = NULL;}wxSimpleHtmlTag::~wxSimpleHtmlTag(){ ClearAttributes(); ClearChildren();}//// Operationsvoid wxSimpleHtmlTag::ClearAttributes(){ if (m_attributes) { wxSimpleHtmlAttribute* attr = m_attributes; while (attr) { wxSimpleHtmlAttribute* next = attr->m_next; attr->m_next = NULL; delete attr; attr = next; } m_attributes = NULL; }}wxSimpleHtmlAttribute* wxSimpleHtmlTag::FindAttribute(const wxString& name) const{ wxSimpleHtmlAttribute* attr = m_attributes; while (attr) { if (attr->GetName().CmpNoCase(name) == 0) { return attr; } attr = attr->m_next; } return NULL;}void wxSimpleHtmlTag::AppendAttribute(const wxString& name, const wxString& value){ wxSimpleHtmlAttribute* attr = new wxSimpleHtmlAttribute(name, value); if (m_attributes) { // Find tail wxSimpleHtmlAttribute* last = m_attributes; while (last->m_next) last = last->m_next; last->m_next = attr; } else m_attributes = attr;}void wxSimpleHtmlTag::ClearChildren(){ if (m_children) { wxSimpleHtmlTag* child = m_children; while (child) { wxSimpleHtmlTag* next = child->m_next; child->m_next = NULL; delete child; child = next; } m_children = NULL; }}void wxSimpleHtmlTag::AppendTag(wxSimpleHtmlTag* tag){ if (m_children) { // Find tail wxSimpleHtmlTag* last = m_children; while (last->m_next) last = last->m_next; last->m_next = tag; tag->m_parent = this; } else m_children = tag;}// Gets the text from this tag and its descendantswxString wxSimpleHtmlTag::GetTagText(){ wxString text; if (m_children) { wxSimpleHtmlTag* tag = m_children; while (tag) { text += tag->GetTagText(); tag = tag->m_next; } return text; } else if (GetType() == wxSimpleHtmlTag_Text) return GetText(); else return wxEmptyString;}int wxSimpleHtmlTag::GetAttributeCount() const{ int count = 0; wxSimpleHtmlAttribute* attr = m_attributes; while (attr) { count ++; attr = attr->m_next; } return count;}wxSimpleHtmlAttribute* wxSimpleHtmlTag::GetAttribute(int i) const{ int count = 0; wxSimpleHtmlAttribute* attr = m_attributes; while (attr) { if (count == i) return attr; count ++; attr = attr->m_next; } return NULL;}int wxSimpleHtmlTag::GetChildCount() const{ int count = 0; wxSimpleHtmlTag* tag = m_children; while (tag) { count ++; tag = tag->m_next; } return count;}bool wxSimpleHtmlTag::HasAttribute(const wxString& name, const wxString& value) const{ wxSimpleHtmlAttribute* attr = FindAttribute(name); return (attr && (attr->GetValue().CmpNoCase(value) == 0)) ;}bool wxSimpleHtmlTag::HasAttribute(const wxString& name) const{ return FindAttribute(name) != NULL ;}bool wxSimpleHtmlTag::GetAttributeValue(wxString& value, const wxString& attrName){ wxSimpleHtmlAttribute* attr = FindAttribute(attrName); if (attr) { value = attr->GetValue(); return TRUE; } else return FALSE;}// Search forward from this tag until we find a tag with this name & attribute wxSimpleHtmlTag* wxSimpleHtmlTag::FindTag(const wxString& tagName, const wxString& attrName){ wxSimpleHtmlTag* tag = m_next; while (tag) { if (tag->NameIs(tagName) && tag->FindAttribute(attrName)) return tag; tag = tag->m_next; } return NULL;}bool wxSimpleHtmlTag::FindTextUntilTagClose(wxString& text, const wxString& tagName){ wxSimpleHtmlTag* tag = this; while (tag) { if (tag->GetType() == wxSimpleHtmlTag_Close && tag->NameIs(tagName)) return TRUE; if (tag->GetType() == wxSimpleHtmlTag_Text) text += tag->GetText(); tag = tag->m_next; } return TRUE;}wxSimpleHtmlTag* wxSimpleHtmlTag::GetChild(int i) const{ int count = 0; wxSimpleHtmlTag* tag = m_children; while (tag) { if (count == i) return tag; count ++; tag = tag->m_next; } return NULL;}void wxSimpleHtmlTag::Write(wxOutputStream& stream){ switch (GetType()) { case wxSimpleHtmlTag_Text: { stream << m_text; break; } case wxSimpleHtmlTag_Open: { stream << "<" << m_name; if (GetAttributeCount() > 0) stream << " "; int i; for (i = 0; i < GetAttributeCount(); i++) { wxSimpleHtmlAttribute* attr = GetAttribute(i); attr->Write(stream); if (i < GetAttributeCount() - 1) stream << " "; } stream << ">\n"; break; } case wxSimpleHtmlTag_Directive: { stream << "<!" << m_name << " "; int i; for (i = 0; i < GetAttributeCount(); i++) { wxSimpleHtmlAttribute* attr = GetAttribute(i); attr->Write(stream); if (i < GetAttributeCount() - 1) stream << " "; } stream << ">\n"; break; } case wxSimpleHtmlTag_Close: { stream << "</" << m_name << ">\n"; break; } default: { break; } } wxSimpleHtmlTag* tag = m_children; while (tag) { tag->Write(stream); tag = tag->m_next; }}void wxSimpleHtmlAttribute::Write(wxOutputStream& stream){ if (m_value.IsEmpty()) stream << m_name; else { stream << m_name; stream << "=\""; stream << m_value; stream << "\""; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -