HtmlAnalyzer
Parser HTML desenvolvido em Java (JDK 17) para desafio técnico.
A Arquitetura
O objetivo central deste projeto foi desenvolver uma aplicação via linha de comando capaz de ler o código HTML a partir de uma URL e localizar o texto contido no nível estrutural mais profundo.
A restrição técnica proibia o uso de frameworks externos e pacotes DOM prontos. A solução foi desenhada utilizando processamento de Strings e controle de fluxo através de uma Stack (Pilha) para mapear hierarquias de abertura e fechamento de tags. Foram incluídos tratamentos de borda precisos, emitindo "URL connection error" em falhas de rede e monitorando consistência estrutural para alertar "malformed HTML" em caso de anomalias.
Source Code
HtmlAnalyzer.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Stack;
public class HtmlAnalyzer {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("URL connection error");
return;
}
Stack<String> pilha = new Stack<>();
int actualDepth = 0;
int maxDepth = 0;
String finalOutput = "";
try {
URL url = new URL(args[0]);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
if (line.isEmpty()) continue;
if (isTagOpen(line)) {
String tag = extractTagName(line);
pilha.push(tag);
actualDepth++;
} else if (isTagClose(line)) {
String tag = extractTagName(line);
if (pilha.isEmpty() || !pilha.peek().equals(tag)) {
System.out.println("malformed HTML");
return;
}
pilha.pop();
actualDepth--;
} else {
if (actualDepth > maxDepth) {
maxDepth = actualDepth;
finalOutput = line;
}
}
}
if (!pilha.isEmpty()) {
System.out.println("malformed HTML");
return;
}
System.out.println(finalOutput);
} catch (Exception e) {
System.out.println("URL connection error");
}
}
private static boolean isTagOpen(String line) {
return line.startsWith("<") && !line.startsWith("</");
}
private static boolean isTagClose(String line) {
return line.startsWith("</");
}
private static String extractTagName(String line) {
return line.replaceAll("[<>/]", "");
}
}