美文网首页
java自定义定义脚本规则,解析简单的脚本实现打印图形布局定制

java自定义定义脚本规则,解析简单的脚本实现打印图形布局定制

作者: 吉凶以情迁 | 来源:发表于2023-03-10 11:13 被阅读0次

用java 构建一个 自定义的脚本解析字符串, 如下 label(1,1,fa,true) 就动态变成new Label对象 并传递参数1,1,"fa",true进去, 同时还支持整数变量的运算

以下是一个简单的Java代码示例,用于解析类似于 "label(1,1,fa,true)" 的字符串,并将其转换为对应的Label对象。

java
Copy code
import java.util.*;
import java.util.regex.*;

public class ScriptParser {
    private Map<String, Integer> variables = new HashMap<>();

    public Object evaluate(String script) {
        // 解析整数变量
        Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
        Matcher varMatcher = varPattern.matcher(script);
        while (varMatcher.find()) {
            String varName = varMatcher.group(1);
            int varValue = Integer.parseInt(varMatcher.group(2));
            variables.put(varName, varValue);
        }

        // 解析函数调用
        Pattern funcPattern = Pattern.compile("(\\w+)\\((.*)\\)");
        Matcher funcMatcher = funcPattern.matcher(script);
        if (funcMatcher.matches()) {
            String funcName = funcMatcher.group(1);
            String[] args = funcMatcher.group(2).split(",");

            if (funcName.equals("label")) {
                int x = evaluateInt(args[0].trim());
                int y = evaluateInt(args[1].trim());
                String text = evaluateString(args[2].trim());
                boolean visible = evaluateBoolean(args[3].trim());

                return new Label(x, y, text, visible);
            }
        }

        return null;
    }

    private int evaluateInt(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return variables.get(expression);
        }

        // 如果是数字,直接转换为整数
        try {
            return Integer.parseInt(expression);
        } catch (NumberFormatException e) {
            // 如果不是数字,尝试解析表达式
            Pattern exprPattern = Pattern.compile("(\\w+)\\s*([\\+\\-\\*\\/])\\s*(\\w+)");
            Matcher exprMatcher = exprPattern.matcher(expression);
            if (exprMatcher.matches()) {
                int left = evaluateInt(exprMatcher.group(1).trim());
                int right = evaluateInt(exprMatcher.group(3).trim());
                switch (exprMatcher.group(2).trim()) {
                    case "+":
                        return left + right;
                    case "-":
                        return left - right;
                    case "*":
                        return left * right;
                    case "/":
                        return left / right;
                }
            }
        }

        return 0;
    }

    private String evaluateString(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return String.valueOf(variables.get(expression));
        }

        // 如果是字符串,去掉引号
        if (expression.startsWith("\"") && expression.endsWith("\"")) {
            return expression.substring(1, expression.length() - 1);
        }

        return "";
    }

    private boolean evaluateBoolean(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return variables.get(expression) != 0;
        }

        // 如果是布尔值,直接转换为布尔型
        if (expression.equalsIgnoreCase("true")) {
            return true;
        } else if (expression.equalsIgnoreCase("false")) {
            return false;
        }

        return false;
    }
}

java
Copy code
String script = "label(1, 2, \"hello\", true)";
ScriptParser parser = new ScriptParser();
Label label = (Label)

调整后


public class ScriptEngine {

    private Map<String, Integer> variables = new HashMap<>();

    public PrintLabelModel.BasePrint evaluate(String script) {
        // 解析整数变量
        Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
        Matcher varMatcher = varPattern.matcher(script);
        while (varMatcher.find()) {
            String varName = varMatcher.group(1);
            int varValue = Integer.parseInt(varMatcher.group(2));
            variables.put(varName, varValue);
        }

        // 解析函数调用
        Pattern funcPattern = Pattern.compile("(\\w+)\\((.*)\\)");
        Matcher funcMatcher = funcPattern.matcher(script);
        if (funcMatcher.matches()) {
            String funcName = funcMatcher.group(1);
            String[] args = funcMatcher.group(2).split(",");

            if (funcName.equals("label") && args.length > 3) {
                int x = evaluateInt(args[0].trim());
                int y = evaluateInt(args[1].trim());
                String label = evaluateString(args[2].trim());
                String text = evaluateString(args[3].trim());
                PrintLabelModel.TextLeftRight printLabelModel = new PrintLabelModel.TextLeftRight(x, y, label, text);
                int fontSize = args.length > 4 ? evaluateInt(args[4].trim()) : printLabelModel.fontSize;
                int limitRight = args.length > 5 ? evaluateInt(args[5].trim()) : 0;
                printLabelModel.fontSize = fontSize;
                printLabelModel.limitRight = limitRight;
                return printLabelModel;
            } else if (funcName.equals("text") && args.length > 2) {
                int x = evaluateInt(args[0].trim());
                int y = evaluateInt(args[1].trim());
                String text = evaluateString(args[2].trim());
                PrintLabelModel.Text printLabelModel = new PrintLabelModel.Text(x, y, text);
                int fontSize = args.length > 3 ? evaluateInt(args[3].trim()) : printLabelModel.fontsize;
                int limitRight = args.length > 4 ? evaluateInt(args[4].trim()) : 0;
                printLabelModel.fontsize = fontSize;
                printLabelModel.limitRight = limitRight;
                return printLabelModel;
            } else if (funcName.equals("qrcode") && args.length > 3) {
                int x = evaluateInt(args[0].trim());
                int y = evaluateInt(args[1].trim());
                int size = evaluateInt(args[2].trim());
                String text = evaluateString(args[3].trim());
                boolean showText = args.length > 4 ? evaluateBoolean(args[4].trim()) : false;
                PrintLabelModel.QRCode printLabelModel = new PrintLabelModel.QRCode(x, y, size, text, showText);
                return printLabelModel;
            } else if (funcName.equals("barcode") && args.length > 4) {
                int x = evaluateInt(args[0].trim());
                int y = evaluateInt(args[1].trim());
                int width = evaluateInt(args[2].trim());
                int height = evaluateInt(args[3].trim());
                String text = evaluateString(args[4].trim());
                boolean showText = args.length > 5 ? evaluateBoolean(args[5].trim()) : false;
                PrintLabelModel.BarCode printLabelModel = new PrintLabelModel.BarCode(x, y,  width, height, text, showText);
                int fontSize = args.length > 6 ?evaluateInt(args[6].trim()):printLabelModel.fontsize;
                printLabelModel.fontsize=fontSize;
                return printLabelModel;
            }
        }

        return null;
    }

    private int evaluateInt(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return variables.get(expression);
        }

        // 如果是数字,直接转换为整数
        try {
            return Integer.parseInt(expression);
        } catch (NumberFormatException e) {
            // 如果不是数字,尝试解析表达式
            Pattern exprPattern = Pattern.compile("(\\w+)\\s*([\\+\\-\\*\\/])\\s*(\\w+)");
            Matcher exprMatcher = exprPattern.matcher(expression);
            if (exprMatcher.matches()) {
                int left = evaluateInt(exprMatcher.group(1).trim());
                int right = evaluateInt(exprMatcher.group(3).trim());
                switch (exprMatcher.group(2).trim()) {
                    case "+":
                        return left + right;
                    case "-":
                        return left - right;
                    case "*":
                        return left * right;
                    case "/":
                        return left / right;
                }
            }
        }

        return 0;
    }

    private String evaluateString(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return String.valueOf(variables.get(expression));
        }

        // 如果是字符串,去掉引号
        if (expression.startsWith("\"") && expression.endsWith("\"")) {
            return expression.substring(1, expression.length() - 1);
        }

        return "";
    }

    private boolean evaluateBoolean(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return variables.get(expression) != 0;
        }

        // 如果是布尔值,直接转换为布尔型
        if (expression.equalsIgnoreCase("true")) {
            return true;
        } else if (expression.equalsIgnoreCase("false")) {
            return false;
        }

        return false;
    }

经过调整发现他写的不支持多行调整后

public class ScriptEngine {

    private Map<String, Integer> variables = new HashMap<>();

    public PrintLabelModel evaluate(String script) {
        PrintLabelModel model=new PrintLabelModel();

        String[] split = script.split("\n");
        for (String currentLine : split) {
            if(currentLine==null||currentLine.trim().length()==0||currentLine.startsWith("#") ||currentLine.startsWith("//")||currentLine.startsWith("--")){
                continue;
            }
            // 解析整数变量
            Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
            Matcher varMatcher = varPattern.matcher(script);
            while (varMatcher.find()) {
                String varName = varMatcher.group(1);
                int varValue = Integer.parseInt(varMatcher.group(2));
                variables.put(varName, varValue);
            }

            // 解析函数调用
            Pattern funcPattern = Pattern.compile("(\\w+)\\((.*)\\)");
            Matcher funcMatcher = funcPattern.matcher(currentLine);
            if (funcMatcher.matches()) {
                String funcName = funcMatcher.group(1);
                String[] args = funcMatcher.group(2).split(",");

                if (funcName.equals("label") && args.length > 3) {
                    int x = evaluateInt(args[0].trim());
                    int y = evaluateInt(args[1].trim());
                    String label = evaluateString(args[2].trim());
                    String text = evaluateString(args[3].trim());
                    PrintLabelModel.TextLeftRight printLabelModel = new PrintLabelModel.TextLeftRight(x, y, label, text);
                    int fontSize = args.length > 4 ? evaluateInt(args[4].trim()) : printLabelModel.fontSize;
                    int limitRight = args.length > 5 ? evaluateInt(args[5].trim()) : 0;
                    printLabelModel.fontSize = fontSize;
                    printLabelModel.limitRight = limitRight;
                    model.infos.add(printLabelModel);
                } else if (funcName.equals("text") && args.length > 2) {
                    int x = evaluateInt(args[0].trim());
                    int y = evaluateInt(args[1].trim());
                    String text = evaluateString(args[2].trim());
                    PrintLabelModel.Text printLabelModel = new PrintLabelModel.Text(x, y, text);
                    int fontSize = args.length > 3 ? evaluateInt(args[3].trim()) : printLabelModel.fontsize;
                    int limitRight = args.length > 4 ? evaluateInt(args[4].trim()) : 0;
                    printLabelModel.fontsize = fontSize;
                    printLabelModel.limitRight = limitRight;
                    model.infos.add(printLabelModel);
                } else if (funcName.equals("qrcode") && args.length > 3) {
                    int x = evaluateInt(args[0].trim());
                    int y = evaluateInt(args[1].trim());
                    int size = evaluateInt(args[2].trim());
                    String text = evaluateString(args[3].trim());
                    boolean showText = args.length > 4 ? evaluateBoolean(args[4].trim()) : false;
                    PrintLabelModel.QRCode printLabelModel = new PrintLabelModel.QRCode(x, y, size, text, showText);
                    model.infos.add(printLabelModel);
                } else if (funcName.equals("barcode") && args.length > 4) {
                    int x = evaluateInt(args[0].trim());
                    int y = evaluateInt(args[1].trim());
                    int width = evaluateInt(args[2].trim());
                    int height = evaluateInt(args[3].trim());
                    String text = evaluateString(args[4].trim());
                    boolean showText = args.length > 5 ? evaluateBoolean(args[5].trim()) : false;
                    PrintLabelModel.BarCode printLabelModel = new PrintLabelModel.BarCode(x, y,  width, height, text, showText);
                    int fontSize = args.length > 6 ?evaluateInt(args[6].trim()):printLabelModel.fontsize;
                    printLabelModel.fontsize=fontSize;
                    model.infos.add(printLabelModel);
                }
            }
        }

        return model;
    }

    private int evaluateInt(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return variables.get(expression);
        }

        // 如果是数字,直接转换为整数
        try {
            return Integer.parseInt(expression);
        } catch (NumberFormatException e) {
            // 如果不是数字,尝试解析表达式
            Pattern exprPattern = Pattern.compile("(\\w+)\\s*([\\+\\-\\*\\/])\\s*(\\w+)");
            Matcher exprMatcher = exprPattern.matcher(expression);
            if (exprMatcher.matches()) {
                int left = evaluateInt(exprMatcher.group(1).trim());
                int right = evaluateInt(exprMatcher.group(3).trim());
                switch (exprMatcher.group(2).trim()) {
                    case "+":
                        return left + right;
                    case "-":
                        return left - right;
                    case "*":
                        return left * right;
                    case "/":
                        return left / right;
                }
            }
        }

        return 0;
    }

    private String evaluateString(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return String.valueOf(variables.get(expression));
        }

        // 如果是字符串,去掉引号
        if (expression.startsWith("\"") && expression.endsWith("\"")) {
            return expression.substring(1, expression.length() - 1);
        }

        return "";
    }

    private boolean evaluateBoolean(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return variables.get(expression) != 0;
        }

        // 如果是布尔值,直接转换为布尔型
        if (expression.equalsIgnoreCase("true")) {
            return true;
        } else if (expression.equalsIgnoreCase("false")) {
            return false;
        }

        return false;
    }

    public static PrintLabelModel script2printLabelModel(String content) {
        String[] split = content.split("\n");
        LinkedHashMap<String, String> vars = new LinkedHashMap<>();
        for (String s : split) {

        }
        return null;

    }
}

上面还有一些问题 比如不支持一行多个变量定义 ,不支持 一行多个
也不支持a=b+1的识别
修正a=b+1识别

    //  Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
                Pattern varPattern = Pattern.compile("^([a-z]+)\\s*=\\s*([a-z0-9+*-\\/()]+)$");

最后的代码如下


public class ScriptEngine {

    private Map<String, Integer> variables = new HashMap<>();

    public PrintLabelModel evaluate(String script) {
        PrintLabelModel model = new PrintLabelModel();

        String[] split = script.split("\n");
        for (String currentLine : split) {
            if (currentLine == null || currentLine.trim().length() == 0 || currentLine.startsWith("#") || currentLine.startsWith("//") || currentLine.startsWith("--")) {
                continue;
            }
            for (String block : currentLine.split(";")) {


                // 解析整数变量
//                Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
                Pattern varPattern = Pattern.compile("^([a-z]+)\\s*=\\s*([a-z0-9+*-\\/()]+)$");
                Matcher varMatcher = varPattern.matcher(block);
                while (varMatcher.find()) {
                    String varName = varMatcher.group(1);
                    int varValue = evaluateInt(varMatcher.group(2));//Integer.parseInt(varMatcher.group(2));
                    variables.put(varName, varValue);
                }

                // 解析函数调用
                Pattern funcPattern = Pattern.compile("(\\w+)\\((.*)\\)");
                Matcher funcMatcher = funcPattern.matcher(block);
                if (funcMatcher.matches()) {
                    String funcName = funcMatcher.group(1);
                    String[] args = funcMatcher.group(2).split(",");

                    if (funcName.equals("label") && args.length > 3) {
                        int x = evaluateInt(args[0].trim());
                        int y = evaluateInt(args[1].trim());
                        String label = evaluateString(args[2].trim());
                        String text = evaluateString(args[3].trim());
                        PrintLabelModel.TextLeftRight printLabelModel = new PrintLabelModel.TextLeftRight(x, y, label, text);
                        int fontSize = args.length > 4 ? evaluateInt(args[4].trim()) : printLabelModel.fontSize;
                        int limitRight = args.length > 5 ? evaluateInt(args[5].trim()) : 0;
                        printLabelModel.fontSize = fontSize;
                        printLabelModel.limitRight = limitRight;
                        model.infos.add(printLabelModel);
                    } else if (funcName.equals("print")) {

                        StringBuffer sb = new StringBuffer();
                        for (int i = 0; i < args.length; i++) {
                            sb.append(evaluateString(args[i]));
                            if (i != args.length - 1) {
                                sb.append(" ");
                            }
                        }
                        System.out.print(sb);

                    } else if (funcName.equals("text") && args.length > 2) {
                        int x = evaluateInt(args[0].trim());
                        int y = evaluateInt(args[1].trim());
                        String text = evaluateString(args[2].trim());
                        PrintLabelModel.Text printLabelModel = new PrintLabelModel.Text(x, y, text);
                        int fontSize = args.length > 3 ? evaluateInt(args[3].trim()) : printLabelModel.fontsize;
                        int limitRight = args.length > 4 ? evaluateInt(args[4].trim()) : 0;
                        printLabelModel.fontsize = fontSize;
                        printLabelModel.limitRight = limitRight;
                        model.infos.add(printLabelModel);
                    } else if (funcName.equals("qrcode") && args.length > 3) {
                        int x = evaluateInt(args[0].trim());
                        int y = evaluateInt(args[1].trim());
                        int size = evaluateInt(args[2].trim());
                        String text = evaluateString(args[3].trim());
                        boolean showText = args.length > 4 ? evaluateBoolean(args[4].trim()) : false;
                        PrintLabelModel.QRCode printLabelModel = new PrintLabelModel.QRCode(x, y, size, text, showText);
                        model.infos.add(printLabelModel);
                    } else if (funcName.equals("barcode") && args.length > 4) {
                        int x = evaluateInt(args[0].trim());
                        int y = evaluateInt(args[1].trim());
                        int width = evaluateInt(args[2].trim());
                        int height = evaluateInt(args[3].trim());
                        String text = evaluateString(args[4].trim());
                        boolean showText = args.length > 5 ? evaluateBoolean(args[5].trim()) : false;
                        PrintLabelModel.BarCode printLabelModel = new PrintLabelModel.BarCode(x, y, width, height, text, showText);
                        int fontSize = args.length > 6 ? evaluateInt(args[6].trim()) : printLabelModel.fontsize;
                        printLabelModel.fontsize = fontSize;
                        model.infos.add(printLabelModel);
                    }
                }
            }

        }

        return model;
    }

    private int evaluateInt(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return variables.get(expression);
        }

        // 如果是数字,直接转换为整数
        try {
            return Integer.parseInt(expression);
        } catch (NumberFormatException e) {
            // 如果不是数字,尝试解析表达式
            Pattern exprPattern = Pattern.compile("(\\w+)\\s*([\\+\\-\\*\\/])\\s*(\\w+)");
            Matcher exprMatcher = exprPattern.matcher(expression);
            if (exprMatcher.matches()) {
                int left = evaluateInt(exprMatcher.group(1).trim());
                int right = evaluateInt(exprMatcher.group(3).trim());
                switch (exprMatcher.group(2).trim()) {
                    case "+":
                        return left + right;
                    case "-":
                        return left - right;
                    case "*":
                        return left * right;
                    case "/":
                        return left / right;
                }
            }
        }

        return 0;
    }

    private String evaluateString(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return String.valueOf(variables.get(expression));
        }

        // 如果是字符串,去掉引号
        if (expression.startsWith("\"") && expression.endsWith("\"")) {
            return expression.substring(1, expression.length() - 1);
        }

        return expression;
    }

    private boolean evaluateBoolean(String expression) {
        // 如果是变量,替换为变量的值
        if (variables.containsKey(expression)) {
            return variables.get(expression) != 0;
        }

        // 如果是布尔值,直接转换为布尔型
        if (expression.equalsIgnoreCase("true")) {
            return true;
        } else if (expression.equalsIgnoreCase("false")) {
            return false;
        }

        return false;
    }

    public static PrintLabelModel script2printLabelModel(String content) {
        String[] split = content.split("\n");
        LinkedHashMap<String, String> vars = new LinkedHashMap<>();
        for (String s : split) {

        }
        return null;

    }
}


执行测试

    @Test
    public void test(){
        ScriptEngine scriptEngine=new ScriptEngine();
        PrintLabelModel evaluate = scriptEngine.evaluate("x=3\ny=5\nc=x+3;\nprint(x,y,c);vara=1\nb=3\nlabel(vara,3,3,3,3,3,3)\ntext(x,y,nihao)\ntext(x,c,c)");
        String s = JSON.toJSONString(evaluate);
        System.out.print(s);
    }

输出结果

3 5 6{"height":400,"infos":[{"content":"3","fontSize":3,"label":"3","limitRight":3,"newLineGap":3.0,"type":"textl","x":1,"y":3},{"content":"nihao","fontsize":15,"limitRight":0,"newLineGap":3,"type":"text","x":3,"y":5},{"content":"6","fontsize":15,"limitRight":0,"newLineGap":3,"type":"text","x":3,"y":6}],"width":600}

相关文章

网友评论

      本文标题:java自定义定义脚本规则,解析简单的脚本实现打印图形布局定制

      本文链接:https://www.haomeiwen.com/subject/hqttrdtx.html