CssParser.java
package sk.iway.css;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.io.IwcmFile;
import sk.iway.iwcm.io.IwcmInputStream;
import sk.iway.iwcm.utils.Pair;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class CssParser {
List<Pair<String, String>> elements = new LinkedList<Pair<String, String>>();
public CssParser(IwcmFile css)
{
parseCssFile(css);
}
private void parseCssFile(IwcmFile css)
{
Reader in = null;
Scanner scanner = null;
boolean success = false;
try
{
in = new InputStreamReader(new IwcmInputStream(css));
scanner = new Scanner(in);
scanner.useDelimiter("}");
success = parse(scanner);
}
catch (FileNotFoundException e)
{
sk.iway.iwcm.Logger.error(e);
}
finally {
try
{
if (scanner!=null) scanner.close();
if (in!=null) in.close();
}
catch (Exception e)
{
sk.iway.iwcm.Logger.error(e);
}
}
if (success==false) {
parseEditorComments(css);
}
}
private boolean parse(Scanner scanner)
{
while (scanner.hasNext()) {
String text = cleanText(scanner.next());
if (text.contains("@media") || text.contains("/** Editor end **/") || text.contains(".cssParserEnd")) {
Logger.debug(CssParser.class, "break");
return false;
}
if (text.contains(" ") || text.contains("#") || !text.contains(".")) {
continue;
}
Pair<String, String> result = new Pair<String, String>(parseTag(text), parseClass(text));
elements.add(result);
}
return true;
}
private void parseEditorComments(IwcmFile css) {
File file = new File(css.getAbsolutePath());
try (FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr);) {
String line;
String lastLine = null;
while ((line = br.readLine()) != null) {
if (line.contains("/* editor */") && lastLine != null) {
String text = cleanText(lastLine);
if (text.contains(" ") || text.contains("#") || !text.contains(".")) {
continue;
}
Pair<String, String> result = new Pair<String, String>(parseTag(text), parseClass(text));
elements.add(result);
}
lastLine = line;
}
} catch (IOException e) {
sk.iway.iwcm.Logger.error(e);
}
}
private String parseTag(String element)
{
int dotIndex = element.indexOf(".");
if (dotIndex == 0) {
return "*";
}
return element.substring(0, dotIndex).trim();
}
private String parseClass(String element)
{
int dotIndex = element.indexOf(".");
//replace btn.btn-primary na btn btn-primary
return Tools.replace(element.substring(dotIndex + 1).trim(), ".", " ");
}
private String cleanText(String text)
{
if (text.contains("{")) {
text = text.substring(0, text.indexOf("{")).trim();
}
text = text.trim().replaceAll("\\r\\n|\\r|\\n|\\t", "");
return text;
}
public List<Pair<String, String>> getElements()
{
return elements;
}
public void setElements(List<Pair<String, String>> elements)
{
this.elements = elements;
}
}