# morphius `morphius` allows users to randomize the order and content of documents which can be used by teachers for generating tests with questions in a different order or with different numbers in each question for each student. If answers are provided, morphius will generate an answer key for each final test to make grading easier. # Format `morphius` processes content in a specific format described below: ##### Questions A question in `morphius` is indicated in the following format: `"|Question Content|"` The content inside the `"|"` and the `"|"` is the question content. The questions will be rearranged if desired to create a different order of questions on different tests while the rest of the content in the template remains in the same place. This means that if question numbers are included in the template, those should be placed outside of the question itself in order to retain the correct numbering when questions are rearranged. ##### Expressions Expressions are used to add randomness to questions: `|a+b|` is an example expression. Expressions must be placed inside of a question in order to be processed. Expressions are a mathematical expression that can include variables and evaluates to a number when generating a test. Variables represent a random number that will be selected separately for each test generated. A variable in an expression is any identifier that starts with a letter followed by a sequence of characters that can contain letters, numbers or underscores. Variables do not have to be declared and will default to be an integer between 0 and 99 when generated. Math is allowed in these expressions in order to create specific relationships between numbers in the generated question. Math is supported using the `mexprp` crate. The scope of variables is the question, so you can have the same variable names in different questions and they will likely have different values (unless they randomly end up being the same). If you want more fine tuned control of the range of possible values, you can declare the variable. ##### Variable Declarations A variable can be declared anywhere in the question in the following format: `|var_name: type = [min,max]|` where var_name is the name of your variable, type is either int or real, and min and max are integers representing the lower and upper bounds respectively of the value of your variable. An example declaration would be `|a: int = [0,99]|`. This is the declaration assumed for any variable without a declaration, so including this exact declaration in your code would be unecessary. ##### Answers Answers are used to generate an answer key for each test. Answers should be included for every question when using `process_with_answers`. They should be in the format `|Answer|` and should appear right after the question. Variables in answers have the same scope as their corresponding question so you can use expressions in your answers to calculate the answer in terms of the randomly generated variables in your question. # Examples Here is a simple example, you can find more example templates in the `examples` folder of the GitHub repository. ``` let template = " |This is a single question test. You must calculate the sum of two random numbers. What is |a| + |b|?| |The answer to this question is: |a+b||"; let doc = morphius::process_with_answers(template); let tests = morphius::generate(&doc, 5, Some(1)); //Prints out the first test println!("{}", tests[0].content); //Prints out the answer key for the first test println!("{}", tests[0].answers); ```