I have tried many things as you can see. I have it now working for both nested and unnested tags as far as I can tell, yet it still won't verify. Where is the problem?
package com.codegym.task.task19.task1918;
/*
Introducing tags
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Solution {
//public static String tag = "span";
public static String tag;
public static String openingTag = "<" + tag;
public static String closingTag = "</" + tag + ">";
public static String begin = "♫";
public static String stop = "◄";
public static int open = 0;
public static int close = 0;
public static ArrayList<Integer> start = new ArrayList<>();
public static ArrayList<Integer> end = new ArrayList<>();
public static ArrayList<String> tags = new ArrayList<>();
private static ArrayList<String> splitTag = new ArrayList<>();
private static ArrayList<String> splitTag2 = new ArrayList<>();
private static ArrayList<String> subTags = new ArrayList<>();
public static void main(String[] args) throws IOException {
tag = args[0];
BufferedReader readme = new BufferedReader(new InputStreamReader(System.in));
String filename = readme.readLine();
readme.close();
BufferedReader reader = new BufferedReader(new FileReader(filename));
String input = "";
String line;
while ((line = reader.readLine()) != null) {
input += line;
}
reader.close();
input = input.replaceAll(openingTag, begin);
input = input.replaceAll(closingTag, stop);
splitString(input);
for (String tag : tags){
if (tag.endsWith(" YESSTRING")) {
tag = tag.replace(" YESSTRING", "");
subTags.add(tag);
tag = tag.replaceAll(openingTag, begin);
tag = tag.replaceAll(closingTag, stop);
subTags.add(tag.substring(1, tag.length() - 1) + " YESSTRING");
// for (String sub : splitTag) {
// if (sub.endsWith(" YESSTRING")) {
// tag = sub.replace(" YESSTRING", "");
// subTags.add(tag);
// splitTag.remove(sub);
// tag = tag.replaceAll(openingTag, begin);
// tag = tag.replaceAll(closingTag, stop);
// splitTag.add(tag.substring(1, tag.length() - 1));
// } else {
// splitSubString(sub);
// splitTag.remove(sub);
// }
// }
}else {
subTags.add(tag);
}
}
for (String tag : subTags){
if(tag.endsWith(" YESSTRING")){
splitSubString(tag);
while (splitTag.size() > 0){
splitSubString(splitTag.get(0));
splitTag.remove(0);
}
}
else{
System.out.println(tag);
}
}
}
public static String getString(String tag){
String tags = tag;
tags = tags.replaceAll(begin, openingTag);
tags = tags.replaceAll(stop, closingTag);
// System.out.println(tags);
return tags;
}
public static void splitString(String input){
for (int i = 0; i < input.length(); i++) {
boolean startEquals = begin.equals(String.valueOf(input.charAt(i)));
boolean stopEquals = stop.equals(String.valueOf(input.charAt(i)));
if (startEquals) { //start tags
start.add(i);
open++;
}
if (stopEquals) {
end.add(i);
close++;
}
if (open == close && open > 1){
tags.add(getString(input.substring(start.get(0), end.get(end.size() -1) +1)) + " YESSTRING");
open = 0;
close = 0;
start.clear();
end.clear();
}
else if (open == close && open == 1){
tags.add(getString(input.substring(start.get(0), end.get(0) +1)));
open = 0;
close = 0;
start.clear();
end.clear();
}
}
}
public static void splitSubString(String input){
input = input.replaceAll(openingTag, begin);
input = input.replaceAll(closingTag, stop);
for (int i = 0; i < input.length(); i++) {
boolean startEquals = begin.equals(String.valueOf(input.charAt(i)));
boolean stopEquals = stop.equals(String.valueOf(input.charAt(i)));
if (startEquals) { //start tags
start.add(i);
open++;
}
if (stopEquals) {
end.add(i);
close++;
}
if (open == close && open > 1){
splitTag.add(getString(input.substring(start.get(0), end.get(0) +1)) + " YESSTRING");
open = 0;
close = 0;
start.clear();
end.clear();
}
else if (open == close && open == 1){
System.out.println(getString(input.substring(start.get(0), end.get(0) +1)));
open = 0;
close = 0;
start.clear();
end.clear();
}
}
}
}
// System.out.println(start);
// System.out.println(end);
// int x = 0;
// System.out.println(start.size());
/*
ArrayList<String> subs = new ArrayList<>();
ArrayList<Integer> A = new ArrayList<>();
ArrayList<Integer> B = new ArrayList<>();
for (int b : end){
for (int a : start){
if (a > b){
if (A.contains(a)) {
if(!B.contains(b)){
B.add(b);
}
}else A.add(a);
}
}
}
// System.out.println(A);
// System.out.println(B);
int end1 = 0, end2 = 0, endmain = 0, startmain = 0, start1 = 0, start2 = 0, finalstart = 0, finalend = 0, simplestart = 0, simpleend = 0;
for (int c = 0; c < start.size(); c++){
if (A.contains(start.get(c)) && B.contains(end.get(c))){
if (start.get(c) > end2) {
// System.out.println("Stoppoint start: " + start.get(c)); //split single tag
simplestart = start.get(c);
// System.out.println("Stoppoint end: " + end.get(c));
simpleend = end.get(c);
}
else {
// System.out.println("Stoppoint1.2 start: " + start.get(c));// internal splitpoint second start and main end
start2 = start.get(c);
// System.out.println("Stoppoint1.2 end: " + end.get(c));
endmain = end.get(c);
}
}else if (A.contains(start.get(c)) && !B.contains(end.get(c))){ // final one
// System.out.println("final start : " + start.get(c));
finalstart = start.get(c);
// System.out.println("final end: " + end.get(c));
finalend = end.get(c);
}
else{ // first start and second end point
if (B.contains(end.get(c)) && end.get(c) > start1) {
// System.out.println("startstring2: " + start.get(c));
start1 = start.get(c);
// System.out.println("end2: " + end.get(c));
end2 = end.get(c);
}
else { // main start and first end
// System.out.println("start1: " + start.get(c));
startmain = start.get(c);
// System.out.println("end1: " + end.get(c));
end1 = end.get(c);
}
}
}
String one = "";
if (startmain >0 && endmain > 0) {
one = input.substring(startmain, endmain + 1);
}
String two = input.substring(start1, end1 + 1);
String three = "";
if (endmain > 0) {
three = input.substring(start2, end2 + 1);
} else {
three = input.substring(startmain, end2 + 1);
}
String four = input.substring(simplestart, simpleend +1);
String five = input.substring(finalstart, finalend+1);
if (!one.equals("")){
printString(one);
}
printString(two);
printString(three);
printString(four);
printString(five);
/* works sort of
for (int i = 1; i < start.size(); i++) {
if (start.get(i) > end.get(i - 1) && x > 1) {
// System.out.println(start.get(i-1));
// System.out.println(end.get(i-1));
// System.out.println("this i gets passed " + i);
// System.out.println("this x gets passed " + x);
String part = input.substring(start.get(i - x - 1), end.get(i - 1) + 1);
//System.out.println("compare" + part + x);
subs.add(part);
for (int j = 0; j < x; j++) {
String party = input.substring(start.get(i - x + j), end.get(i - x - 1 + j) + 1);
// String part2 = input.substring(start.get(i - x), end.get(i - 3) + 1);
// System.out.println("compare1.2" + party);
// String part3 = input.substring(start.get(i - x + 1), end.get(i - 2) + 1);
// System.out.println("compare1.3" + part3);
subs.add(party);
}
x = 1;
} else if (start.get(i) > end.get(i - 1)) {
String part = input.substring(start.get(i - x), end.get(i - 1) + 1);
// System.out.println("compare2" + part);
x = 1;
subs.add(part);
} else {
x++;
}
if (i == (start.size() - 1)) {
// System.out.println(start.get(i));
// System.out.println(end.get(i));
// System.out.println("this i gets passed " + i);
// System.out.println("this x gets passed " + x);
//subs.add(getSubString(input, start, end, x, i ));
String part = input.substring(start.get(i), end.get(i) + 1);
// System.out.println("endline" + part);
subs.add(part);
}
}
*/
// } // ends main
/* public static void printString(String in){
String tags = in;
tags = tags.replaceAll(begin, openingTag);
tags = tags.replaceAll(stop, closingTag);
System.out.println(tags);
}
}
*/
/*
int x = i;
int count = 0;
while (x < start.size() && start.get(x) < end.get(i)) {
count++;
x++;
System.out.println("hoi");
}
System.out.println(x);
System.out.println(count);
for (int y = 0; y < count; y++) {
String tags = input.substring(start.get(x-count+y), end.get(x-1) + 1);
tags = tags.replaceAll(begin, openingTag);
tags = tags.replaceAll(stop, closingTag);
System.out.println(tags);
}
i = x;
*/