use of org.antlr.v4.runtime.misc.Triple in project bookish by parrt.
the class Tex2SVG method tex2svg.
public Triple<String, Float, Float> tex2svg(String latex, LatexType type, int fontsize) {
try {
latex = latex.trim();
String tmpdir = new File(outputDir).getAbsolutePath();
if (!Files.exists(Paths.get(tmpdir))) {
Files.createDirectories(Paths.get(tmpdir));
}
if (!Files.exists(Paths.get(tmpdir + "/images"))) {
Files.createSymbolicLink(Paths.get(tmpdir + "/images"), Paths.get(outputDir + "/images"));
}
String texfilename = tmpdir + "/temp.tex";
ST template = null;
switch(type) {
case EQN:
template = templates.getInstanceOf("eqntex");
break;
case BLOCKEQN:
template = templates.getInstanceOf("blockeqntex");
break;
case LATEX:
template = templates.getInstanceOf("blocktex");
break;
}
template.add("text", latex);
template.add("fontsize", fontsize);
Files.write(Paths.get(texfilename), template.render().getBytes());
// System.out.println("wrote "+texfilename);
String[] results = execInDir(tmpdir, "xelatex", "-shell-escape", "-interaction=nonstopmode", "temp.tex");
// println(results.a)
String metricsRegex = "// bookish metrics: ([0-9]*[.][0-9]+)pt, ([0-9]*[.][0-9]+)pt";
Pattern metricsPattern = Pattern.compile("metricsRegex");
String log = ParrtIO.load(tmpdir + "/temp.log");
float height = 0, depth = 0;
for (String line : results[0].split("\n")) {
String prefix = "// bookish metrics: ";
if (line.startsWith(prefix)) {
int first = prefix.length();
int comma = line.indexOf(',');
String heightS = line.substring(first, comma - "pt".length());
String depthS = line.substring(comma + 1, line.indexOf('p', comma));
height = Float.parseFloat(heightS);
depth = Float.parseFloat(depthS);
}
if (line.startsWith("!") || line.startsWith("l.")) {
System.err.println(line);
System.err.println(latex);
}
}
if (results[1].length() > 0) {
System.err.println(results[1]);
}
results = execInDir(tmpdir, "pdfcrop", "temp.pdf");
if (results[1].length() > 0) {
System.err.println(results[1]);
}
results = execInDir(tmpdir, "pdf2svg", "temp-crop.pdf", "temp.svg");
if (results[1].length() > 0) {
System.err.println(results[1]);
}
String svgfilename = tmpdir + "/temp.svg";
return new Triple<>(new String(Files.readAllBytes(Paths.get(svgfilename))), height, depth);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
use of org.antlr.v4.runtime.misc.Triple in project bookish by parrt.
the class Translator method visitEqn.
@Override
public OutputModelObject visitEqn(BookishParser.EqnContext ctx) {
String eqn = stripQuotes(ctx.getText());
if (target == Tool.Target.LATEX || target == Tool.Target.LATEX_BOOK) {
return new InlineEquation(null, eqn, -1, -1);
}
// check for special cases like $w$ and $\mathbf{w}_i$.
List<String> elements = extract(eqnVarPattern, eqn);
if (elements.size() > 0) {
return new EqnVar(elements.get(0));
}
elements = extract(eqnVecVarPattern, eqn);
if (elements.size() > 0) {
return new EqnVecVar(elements.get(0));
}
elements = extract(eqnVecVarPattern2, eqn);
if (elements.size() > 0) {
return new EqnVecVar(elements.get(0));
}
elements = extract(eqnIndexedVarPattern, eqn);
if (elements.size() > 0) {
return new EqnIndexedVar(elements.get(0), elements.get(1));
}
elements = extract(eqnIndexedVecVarPattern, eqn);
if (elements.size() > 0) {
return new EqnIndexedVecVar(elements.get(0), elements.get(1));
}
elements = extract(eqnIndexedVecVarPattern2, eqn);
if (elements.size() > 0) {
return new EqnIndexedVecVar(elements.get(0), elements.get(1));
}
float height = 0, depth = 0;
String prefix = String.format("eqn-%s", md5hash(eqn));
// String prefix = String.format("images/eqn-%s",hash(eqn));
File[] files = new File(outputDir + "/images").listFiles((dir, name) -> name.startsWith(prefix));
String existing = null;
if (files != null && files.length > 0) {
existing = files[0].getName();
int i = existing.indexOf("-depth");
int j = existing.indexOf(".svg", i);
String depthS = existing.substring(i + "-depth".length(), j);
depth = Float.parseFloat(depthS);
return new InlineEquation("images/" + existing, eqn, -1, depth);
}
Triple<String, Float, Float> results = texConverter.tex2svg(eqn, Tex2SVG.LatexType.EQN, INLINE_EQN_FONT_SIZE);
String svg = results.a;
height = results.b;
depth = results.c;
try {
String src = String.format("%s/images/%s-depth%06.2f.svg", outputDir, prefix, depth);
Path outpath = Paths.get(src);
System.out.println(outpath);
Files.write(outpath, svg.getBytes());
String relativePath = String.format("images/%s-depth%06.2f.svg", prefix, depth);
return new InlineEquation(relativePath, eqn, height, depth);
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
use of org.antlr.v4.runtime.misc.Triple in project kripton by xcesco.
the class JQLChecker method replaceVariableStatements.
/**
* <p>
* Given a sql, replace som component like where, order by, etc..
*
* <p>
* Note that only first level of variable statements will be replaced.
*
* @param jql
* @param listener
* @return
*/
public String replaceVariableStatements(final JQLContext jqlContext, final String jql, final JQLReplaceVariableStatementListener listener) {
final List<Triple<Token, Token, String>> replace = new ArrayList<>();
final One<Integer> currentSelectLevel = new One<Integer>(-1);
JqlBaseListener rewriterListener = new JqlBaseListener() {
@Override
public void enterSelect_core(Select_coreContext ctx) {
currentSelectLevel.value0++;
}
@Override
public void enterSelect_or_values(Select_or_valuesContext ctx) {
currentSelectLevel.value0++;
}
@Override
public void exitSelect_core(Select_coreContext ctx) {
currentSelectLevel.value0--;
}
@Override
public void exitSelect_or_values(Select_or_valuesContext ctx) {
currentSelectLevel.value0--;
}
@Override
public void enterProjected_columns(Projected_columnsContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 1;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onProjectedColumns(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
@Override
public void enterWhere_stmt(Where_stmtContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 1;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onWhere(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
@Override
public void enterOrder_stmt(Order_stmtContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 1;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onOrderBy(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
@Override
public void enterGroup_stmt(Group_stmtContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 1;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onGroup(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
@Override
public void enterHaving_stmt(Having_stmtContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 1;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onHaving(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
@Override
public void enterOffset_stmt(Offset_stmtContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 1;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onOffset(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
@Override
public void enterLimit_stmt(Limit_stmtContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 1;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onLimit(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
@Override
public void enterColumn_name_set(Column_name_setContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 2;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onColumnNameSet(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
@Override
public void enterColumn_value_set(Column_value_setContext ctx) {
// we work on level 0
if (currentSelectLevel.value0 > 0)
return;
int start = ctx.getStart().getStartIndex() - 1;
int stop = ctx.getStop().getStopIndex() + 2;
if (start == stop)
return;
String statement = jql.substring(start, stop);
String value = listener.onColumnValueSet(statement);
if (value != null) {
replace.add(new Triple<Token, Token, String>(ctx.start, ctx.stop, value));
}
}
};
return replaceInternal(jqlContext, jql, replace, rewriterListener);
}
use of org.antlr.v4.runtime.misc.Triple in project kripton by xcesco.
the class JQLChecker method replaceFromVariableStatementInternal.
private String replaceFromVariableStatementInternal(JQLContext context, String jql, final List<Triple<Token, Token, String>> replace, JqlBaseListener rewriterListener) {
Pair<ParserRuleContext, CommonTokenStream> parser = prepareVariableStatement(context, jql);
walker.walk(rewriterListener, parser.value0);
TokenStreamRewriter rewriter = new TokenStreamRewriter(parser.value1);
for (Triple<Token, Token, String> item : replace) {
rewriter.replace(item.value0, item.value1, item.value2);
}
return rewriter.getText();
}
use of org.antlr.v4.runtime.misc.Triple in project kripton by xcesco.
the class JQLChecker method replaceInternal.
private String replaceInternal(final JQLContext jqlContext, String jql, final List<Triple<Token, Token, String>> replace, JqlBaseListener rewriterListener) {
Pair<ParserRuleContext, CommonTokenStream> parser = prepareParser(jqlContext, jql);
walker.walk(rewriterListener, parser.value0);
TokenStreamRewriter rewriter = new TokenStreamRewriter(parser.value1);
for (Triple<Token, Token, String> item : replace) {
rewriter.replace(item.value0, item.value1, item.value2);
}
return rewriter.getText();
}
Aggregations