/** * moves a string to a math object * * @param string $str string/text/char * * @return bool|\math\objects\string */ public static function stringToRenderdObject($str) { if (strpos($str, "^")) { $s = explode("^", $str); return objects\string::sup(renderer::init(self::stringToRenderdObject($s[0])), renderer::init(self::stringToRenderdObject($s[1]))); } if (strpos($str, "_")) { $s = explode("_", $str); return objects\string::sub(renderer::init(self::stringToRenderdObject($s[0])), renderer::init(self::stringToRenderdObject($s[1]))); } if (ctype_alpha($str)) { return objects\string::char($str); } elseif (is_numeric($str)) { return objects\string::number($str); } elseif (is_string($str)) { return objects\string::string($str); } return false; }
/** * This is the main part behind MathPHP. * * It prepares the objects. It renders the whole sourcecode of the objects. * It returns a tree of \math\rendered objects * * @param array|object $objectarray Math object which should be rendered * @param bool|true $autodetect sould this method auto detect simple strings (\math\objects\string) * * @return array|bool|\math\objects\string|string */ public static function init($objectarray, $autodetect = true) { $code = []; if (is_array($objectarray) && count($objectarray) > 0) { foreach ($objectarray as $obj) { if (is_array($obj)) { $code[] = renderer::init($obj); } else { if (is_object($obj)) { if (get_class($obj) != "math\\rendered") { $code[] = renderer::init($obj); } else { $code[] = $obj; } } else { if ($autodetect) { $code[] = renderer::init(functions::stringToRenderdObject($obj)); } else { $code[] = $obj; } } } } } else { if (is_object($objectarray)) { if (get_class($objectarray) == "math\\rendered") { return $objectarray; } else { if (!$objectarray->isBase()) { if (get_class($objectarray) == "math\\mathobject") { $objectarray->setContent(renderer::init($objectarray->getContent(), true)); //return renderer::init($objectarray->getContent(), true); // @TODO } else { $objectarray->setObjectscache(renderer::init($objectarray->getObjectscache(), true)); } } $ex = explode("::", $objectarray->getType()); $func = $ex[1]; $engine = '\\math\\renderengines\\' . self::getRenderEngine() . '\\' . $ex[0]; if (class_exists($engine) && method_exists($engine, $func)) { if (get_class($objectarray) == "math\\mathobject") { return new rendered($engine::$func($objectarray->getContent())); } else { if (!is_array($objectarray->getObjectscache())) { if (get_class($objectarray->getObjectscache()) == "math\\rendered") { return $objectarray->getObjectscache(); } else { return new rendered($engine::$func($objectarray->getObjectscache()->getContent())); } } else { return new rendered($engine::$func($objectarray->getObjectscache())); } } } else { if (get_class($objectarray) == "math\\mathobject") { return new rendered($objectarray->getContent()); } else { return new rendered($objectarray->getObjectscache()); } } } } else { if (is_string($objectarray)) { if ($autodetect) { return functions::stringToRenderdObject($objectarray); } else { return $objectarray; } } else { return $objectarray; } } } return $code; }
/** * renders the current math object and displays it * * @param bool|false $return should the rendered sourcecode be echoed or returned * @param bool|true $autodetect auto detect strings/integers/chars * @param bool|true $copy copy the current math object to a new history * * @return $this */ public function view($return = false, $autodetect = true, $copy = true) { $this->objectscache[$this->pointer] = renderer::init($this->objectscache[$this->pointer], $autodetect); if ($return) { return $this; } else { if ($copy) { $this->objectscache[$this->pointer + 1] = $this->objectscache[$this->pointer]; } echo renderer::objToString($this->objectscache[$this->pointer]); $this->pointer++; return $this; } }