package org.radrails.rails.internal.ui.generators;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IProject;
import org.radrails.rails.internal.ui.RailsConsoleLine;
public class GeneratorsConsoleLine extends RailsConsoleLine
{
private static final String RAILS_ROOT = "#{RAILS_ROOT}";
private static Pattern fgGeneratorPattern = Pattern
.compile("\\s+\\w+\\s+((?:\\w+/)*\\w+\\.[(rb)(rhtml)(css)(js)(yml)(haml)(sass)(html\\.erb)(xml\\.builder)(rxml)])");
private static Pattern OPEN_TRACE_LINE_PATTERN = Pattern.compile("\\s*(\\S.*?):(\\d+)(:|$)");
private static Pattern fgHAMLPattern = Pattern.compile("\\s+([a-zA-z0-9\\._/]+):(\\d+):in\\s+");
public GeneratorsConsoleLine(String line, IProject project)
{
tryGeneratorPattern(line);
if (!tryHAMLPattern(line))
tryNormalPattern(line);
if (isRelativePath() && project != null)
{
makeRelativeToWorkspace(project);
}
}
private void tryNormalPattern(String line)
{
Matcher matcher = OPEN_TRACE_LINE_PATTERN.matcher(line);
if (!matcher.find())
{
return;
}
fFilename = matcher.group(1);
int matchEnd = line.indexOf(fFilename) + fFilename.length();
if (fFilename.startsWith(RAILS_ROOT))
{
fFilename = "." + fFilename.substring(13);
}
String rest = line.substring(matchEnd + 1);
int index = rest.indexOf(":");
if (index == -1)
index = rest.length();
fLineNumber = Integer.parseInt(rest.substring(0, index));
fOffset = matcher.start(1);
fLength = fFilename.length();
fLength += 13 + index;
}
private boolean tryHAMLPattern(String line)
{
Matcher matcher = fgHAMLPattern.matcher(line);
if (!matcher.find())
{
return false;
}
fFilename = matcher.group(1);
fOffset = matcher.start(1);
fLength = matcher.end(2) - fOffset;
fLineNumber = Integer.parseInt(matcher.group(2));
return true;
}
private void tryGeneratorPattern(String line)
{
Matcher matcher = fgGeneratorPattern.matcher(line);
if (!matcher.find())
{
return;
}
fFilename = matcher.group(1);
int matchEnd = line.indexOf(fFilename) + fFilename.length();
String rest = line.substring(matchEnd);
fFilename += rest.trim();
if (fFilename.endsWith(":"))
fFilename = fFilename.substring(0, fFilename.length() - 1);
fOffset = matcher.start(1);
fLength = fFilename.length();
}
public static boolean isMatching(String line)
{
if (line == null)
return false;
if (line.trim().length() == 0)
return false;
if (line.startsWith(" route "))
return false;
if (line.endsWith("..."))
return false;
Matcher matcher = fgGeneratorPattern.matcher(line);
if (matcher.find())
return true;
matcher = fgHAMLPattern.matcher(line);
if (matcher.find())
return true;
matcher = OPEN_TRACE_LINE_PATTERN.matcher(line);
if (matcher.find())
{
String filename = matcher.group(1);
return filename.startsWith(RAILS_ROOT);
}
return false;
}
}