Search in sources :

Example 1 with Triple

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;
}
Also used : Triple(org.antlr.v4.runtime.misc.Triple) ST(org.stringtemplate.v4.ST) Pattern(java.util.regex.Pattern) STGroupFile(org.stringtemplate.v4.STGroupFile) File(java.io.File)

Example 2 with Triple

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;
}
Also used : Path(java.nio.file.Path) XPath(org.antlr.v4.runtime.tree.xpath.XPath) IOException(java.io.IOException) EqnVar(us.parr.bookish.model.EqnVar) EqnIndexedVecVar(us.parr.bookish.model.EqnIndexedVecVar) EqnVecVar(us.parr.bookish.model.EqnVecVar) InlineEquation(us.parr.bookish.model.InlineEquation) STGroupFile(org.stringtemplate.v4.STGroupFile) File(java.io.File) EqnIndexedVar(us.parr.bookish.model.EqnIndexedVar)

Example 3 with Triple

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);
}
Also used : Column_name_setContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Column_name_setContext) Projected_columnsContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Projected_columnsContext) Where_stmtContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Where_stmtContext) Having_stmtContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Having_stmtContext) One(com.abubusoft.kripton.common.One) ArrayList(java.util.ArrayList) JqlBaseListener(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlBaseListener) Group_stmtContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Group_stmtContext) Select_coreContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Select_coreContext) Token(org.antlr.v4.runtime.Token) Order_stmtContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Order_stmtContext) Select_or_valuesContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Select_or_valuesContext) Triple(com.abubusoft.kripton.common.Triple) Column_value_setContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Column_value_setContext) Limit_stmtContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Limit_stmtContext) Offset_stmtContext(com.abubusoft.kripton.processor.sqlite.grammars.jsql.JqlParser.Offset_stmtContext)

Example 4 with Triple

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();
}
Also used : ParserRuleContext(org.antlr.v4.runtime.ParserRuleContext) CommonTokenStream(org.antlr.v4.runtime.CommonTokenStream) Token(org.antlr.v4.runtime.Token) TokenStreamRewriter(org.antlr.v4.runtime.TokenStreamRewriter)

Example 5 with Triple

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();
}
Also used : ParserRuleContext(org.antlr.v4.runtime.ParserRuleContext) CommonTokenStream(org.antlr.v4.runtime.CommonTokenStream) Token(org.antlr.v4.runtime.Token) TokenStreamRewriter(org.antlr.v4.runtime.TokenStreamRewriter)

Aggregations

Token (org.antlr.v4.runtime.Token)4 ATNState (org.antlr.v4.runtime.atn.ATNState)4 LeftRecursiveRule (org.antlr.v4.tool.LeftRecursiveRule)4 Rule (org.antlr.v4.tool.Rule)4 IOException (java.io.IOException)3 Path (java.nio.file.Path)3 CommonTokenStream (org.antlr.v4.runtime.CommonTokenStream)3 ParserRuleContext (org.antlr.v4.runtime.ParserRuleContext)3 TokenStreamRewriter (org.antlr.v4.runtime.TokenStreamRewriter)3 XPath (org.antlr.v4.runtime.tree.xpath.XPath)3 QuantifierAST (org.antlr.v4.tool.ast.QuantifierAST)3 File (java.io.File)2 BlockEndState (org.antlr.v4.runtime.atn.BlockEndState)2 LoopEndState (org.antlr.v4.runtime.atn.LoopEndState)2 PlusBlockStartState (org.antlr.v4.runtime.atn.PlusBlockStartState)2 StarBlockStartState (org.antlr.v4.runtime.atn.StarBlockStartState)2 Triple (org.antlr.v4.runtime.misc.Triple)2 BlockAST (org.antlr.v4.tool.ast.BlockAST)2 STGroupFile (org.stringtemplate.v4.STGroupFile)2 One (com.abubusoft.kripton.common.One)1