package com.himamis.retex.editor.share.meta; import java.util.ArrayList; import java.util.List; class MetaModelFunctions { private static MetaFunction createFunction(String name, String tex, char key, MetaParameter[] parameters) { return new MetaFunction(name, tex, key, parameters); } private static MetaFunction createFunction(String name, String tex, MetaParameter[] parameters) { char key = name.length() == 1 ? name.charAt(0) : 0; return createFunction(name, tex, key, parameters); } private static MetaFunction createFunction(String name) { return createFunction(name, new MetaParameter[]{createParameter("x", 0)}); } private static MetaFunction createFunction(String name, String tex) { return createFunction(name, tex, new MetaParameter[] { createParameter("x", 0) }); } private static MetaFunction createFunctionInitial(String name, String tex, int initial, MetaParameter[] parameters) { MetaFunction metaFunction = createFunction(name, tex, parameters); metaFunction.setInitialIndex(initial); return metaFunction; } private static MetaFunction createFunctionInsert(String name, String tex, int insert, MetaParameter[] parameters) { MetaFunction metaFunction = createFunction(name, tex, parameters); metaFunction.setInsertIndex(insert); return metaFunction; } private static MetaFunction createFunction(String name, MetaParameter[] parameters) { return createFunction(name, name, parameters); } private static MetaFunction createFunctionParams(String name, String... parameterNames) { MetaParameter[] parameters = new MetaParameter[parameterNames.length]; for (int i = 0; i < parameterNames.length; i++) { parameters[i] = createParameter(parameterNames[i], i); } return createFunction(name, parameters); } private static MetaParameter createParameter(String name, int order) { return new MetaParameter(name, order); } private static MetaParameter createParameterUp(String name, int order, int up) { MetaParameter parameter = createParameter(name, order); parameter.setUpIndex(up); return parameter; } private static MetaParameter createParameterDown(String name, int order, int down) { MetaParameter parameter = createParameter(name, order); parameter.setDownIndex(down); return parameter; } MetaGroup createGeneralFunctionsGroup() { List<MetaComponent> functions = new ArrayList<MetaComponent>(); functions.add(createFunctionParams("_", "i")); functions.add(createFunctionParams("^", "n")); functions.add(createFunctionInitial("frac", "\\frac", 1, new MetaParameter[] { createParameterDown("x", 0, 1), createParameterUp("y", 1, 0) })); functions.add(createFunction("sqrt", "\\sqrt", new MetaParameter[]{ createParameter("x", 0) })); functions.add( createFunctionInsert("nroot", "\\sqrt", 1, new MetaParameter[] { createParameterDown("n", 0, 0), createParameterUp("x", 1, 1) })); functions.add( createFunctionInsert("sum", "\\sum", 3, new MetaParameter[] { createParameterUp("v", 0, 2), createParameterUp("fm", 1, 2), createParameterDown("to", 2, 0), createParameter("x", 3) })); functions.add(createFunctionInsert("prod", "\\prod", 3, new MetaParameter[] { createParameterUp("v", 0, 2), createParameterUp("fm", 1, 2), createParameterDown("to", 2, 0), createParameter("x", 3) })); functions.add(createFunction("nint", "\\int", new MetaParameter[] { createParameter("x", 0), createParameter("v", 1) })); functions.add( createFunctionInsert("int", "\\int", 2, new MetaParameter[] { createParameterUp("fm", 0, 1), createParameterDown("to", 1, 0), createParameter("x", 2), createParameter("v", 3) })); functions .add(createFunctionInsert("lim", "\\lim", 2, new MetaParameter[] { createParameter("v", 0), createParameter("to", 1), createParameter("x", 2) })); functions .add(createFunctionInsert("function", "function", 2, new MetaParameter[] { createParameter("name", 0), createParameter("v", 1), createParameter("x", 2) })); functions.add(createFunction("abs")); functions.add(createFunction("floor")); functions.add(createFunction("ceil")); return new ListMetaGroup(MetaModel.FUNCTIONS, MetaModel.GENERAL, functions); } MetaGroup createFunctions() { List<MetaComponent> functions = new ArrayList<MetaComponent>(); functions.add(createFunction("asin", "sin^{-1}")); functions.add(createFunction("acos", "cos^{-1}")); functions.add(createFunction("atan", "tan^{-1}")); functions.add(createFunction("arcsin", "sin^{-1}")); functions.add(createFunction("arccos", "cos^{-1}")); functions.add(createFunction("arctan", "tan^{-1}")); functions.add(createFunction("asinh", "sinh^{-1}")); functions.add(createFunction("acosh", "cosh^{-1}")); functions.add(createFunction("atanh", "tanh^{-1}")); functions.add(createFunction("ln", "ln")); functions.add(createFunction("log10", "log_{10}")); functions.add(createFunction("log2", "log_{2}")); functions.add(createFunction("floor")); functions.add(createFunction("ceil")); // Matrix operations return new ListMetaGroup(MetaModel.FUNCTIONS, MetaModel.FUNCTIONS, functions); } }