Works as in example, but somehow could not pass verification...
package com.codegym.task.task19.task1918;
/*
Introducing tags
*/
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
reader.close();
//args = new String[] {"span"};
//String fileName = "e:\\Java\\files\\test.html";
FileReader fileReader = new FileReader(fileName);
char[] buffer = new char[4096];
StringBuilder contents = new StringBuilder();
while (true) {
int count = fileReader.read(buffer);
if (count < 0) break;
contents.append(Arrays.copyOf(buffer, count));
}
fileReader.close();
List<Tag> tags = parseHtml(contents);
int start = 0;
int level = 0;
for(Tag tag : tags) {
if (tag.name.equals(args[0]) && tag.isStart) {
if (level++ == 0) {
start = tag.position;
} else {
System.out.println(contents.substring(start, tag.position).replaceAll("\\r?\\n", ""));
start = tag.position;
}
} else if (tag.name.equals(args[0]) && !tag.isStart) {
if (--level == 0) {
System.out.println(contents.substring(start, tag.position).replaceAll("\\r?\\n", ""));
}
}
// if (tag.name.equals(args[0]) && tag.isStart) {
// if (level == 0) {
// start = tag.position;
// }
// level ++;
// } else if (tag.name.equals(args[0]) && !tag.isStart) {
// if (--level == 0) {
// System.out.println(contents.substring(start, tag.position).replaceAll("\\r?\\n", ""));
// start = 0;
// }
// }
}
}
private static List<Tag> parseHtml(StringBuilder contents) {
int pointer = 0;
List<Tag> tags = new ArrayList<>();
while (pointer < contents.length()) {
if (contents.charAt(pointer) == '<' && contents.charAt(pointer + 1) != '/') {
int tagStart = pointer;
while (contents.charAt(pointer) != ' ' && contents.charAt(pointer) != '>' && contents.charAt(pointer) != '\n' && contents.charAt(pointer) != '\r') {
pointer++;
}
int tagEnd = pointer;
tags.add(new Tag(contents.substring(tagStart + 1, tagEnd), tagStart, true));
}
if (contents.charAt(pointer) == '<' && contents.charAt(pointer + 1) == '/') {
int tagStart = pointer;
while (contents.charAt(pointer) != '>') pointer++;
int tagEnd = pointer;
tags.add(new Tag(contents.substring(tagStart + 2, tagEnd), tagEnd + 1, false));
}
pointer++;
}
return tags;
}
private static class Tag {
public String name;
public int position;
public boolean isStart;
public Tag(String name, int position, boolean isStart) {
this.name = name;
this.position = position;
this.isStart = isStart;
}
public String toString() {
return name + " " + (isStart ? " starts " : " ends ") + "in position " + position;
}
}
}