package ctagsinterface.main;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import org.gjt.sp.jedit.View;
import org.gjt.sp.jedit.Buffer;
import ctagsinterface.options.GeneralOptionPane;
import java.util.Vector;
/**
* Mapper between file extensions and languages according to ctags
* @author Tom Power
*/
public class LanguageMap
{
private Vector<String[]> langMap = new Vector<String[]>();
/**
* Calls ctags --list-maps and parses for language to extension mapping
* Adds arrays to langMap in form [extension][language]
*/
private void setLanguageMap()
{
String ctags = GeneralOptionPane.getCtags();
try {
Process proc = Runtime.getRuntime().exec(ctags + " --list-maps");
InputStream inputStream = proc.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] lmLine = line.split("\\s+");
String lmLang = lmLine[0].toLowerCase();
for (int i = 1; i < lmLine.length; i++) {
String[] temp = new String[2];
temp[0] = lmLine[i].replace("*.", "");
temp[1] = lmLang;
langMap.add(temp);
}
}
} catch (IOException io) {
io.printStackTrace();
}
}
public Vector<String[]> getLanguageMap()
{
if (langMap.isEmpty())
setLanguageMap();
return langMap;
}
/**
* Gets the language of the view passed according to ctags
* @param View view of interest
* @return String the language ctags maps the view's extension to if found, otherwise the view's extension
*/
public String getLanguage(View view)
{
if (langMap.isEmpty())
setLanguageMap();
Buffer b = view.getBuffer();
String name = b.getName();
String ext = name.substring(name.lastIndexOf(".") + 1);
for (String[] lm : langMap) {
if (lm[0].equals(ext))
return lm[1];
}
return ext;
}
}