/// <summary> /// タグを指定して その 子要素も含めて削除する /// </summary> /// <param name="tag"></param> public void RemoveTokenAndChild(Token tag) { int pos = this.TokenList.IndexOf(tag); if (pos >= 0) { string endTagName = "/" + tag.TagName; // 次の /frame を探す var tagEnd = this.TokenList.Skip(pos) .Where(r => string.Equals(r.TagName,endTagName,StringComparison.OrdinalIgnoreCase)) .FirstOrDefault(); if (tagEnd != null) { int endPos = this.TokenList.IndexOf(tagEnd); if (endPos > pos) { List<Token> deleteList = new List<Token>(); for (int i = pos; i <= endPos; i++) { deleteList.Add(this.TokenList[i]); } // 実際に削除 foreach (var token in deleteList) { token._dom = null; this.TokenList.Remove(token); } } } } }
private Token read_token() { if (ch == EOF) { currentToken = null; return null; } else if (ch == '<' && ch_next == '!' && ch_next_next == '-' && ch_next_next_next == '-') { // コメントの終了を探す // IEの仕様は <!--> もコメントとして判断するので・・それと同様の動きをする。 StringBuilder sb = new StringBuilder(); sb.Append((char)ch); read_ch(); while (ch != EOF) { if (ch == '-' && ch_next == '-' && ch_next_next == '>') { sb.Append((char)ch); read_ch(); sb.Append((char)ch); read_ch(); sb.Append((char)ch); read_ch(); break; } else { sb.Append((char)ch); } read_ch(); } Token token = new Token(); token.TokenType = TokenTypeEnum.Comments; token.RawString = sb.ToString(); currentToken = token; return token; } else if (ch == '<' && (!is_space_char(ch_next))) { // タグ StringBuilder sb = new StringBuilder(); sb.Append((char)ch); read_ch(); bool tagEndFlag = false; // タグの開始 while (ch != EOF) { sb.Append((char)ch); if (ch == '"' || ch == '\'') { char find_char = (char)ch; read_ch(); while (ch != EOF) { if (ch == find_char) { sb.Append((char)ch); break; } sb.Append((char)ch); read_ch(); } } else if (ch == '>') { // タグの終了 read_ch(); tagEndFlag = true; break; } read_ch(); } string rawStr = sb.ToString(); Token token = new Token(); if (tagEndFlag == false) { // タグだと思ったが途中で終了 token.TokenType = TokenTypeEnum.Literal; token.RawString = rawStr; } else if (rawStr.Length > 2) { // タグ token.TokenType = TokenTypeEnum.HtmlTag; } else { // それ以外の文字 token.TokenType = TokenTypeEnum.Literal; } token.RawString = rawStr; currentToken = token; return token; } else { // タグの可能性のある文字 < が来るまでは Literal として登録 StringBuilder sb = new StringBuilder(); sb.Append((char)ch); read_ch(); while (ch != EOF) { if (ch != '<') { sb.Append((char)ch); read_ch(); } else { break; } } Token token = new Token(); token.TokenType = TokenTypeEnum.Literal; token.RawString = sb.ToString(); currentToken = token; return token; } }