1<?php 2 3namespace TableRoller\Table; 4 5class Manager 6{ 7 static private $embedCalls = 0; 8 9 public function __construct( 10 private \helper_plugin_sqlite $db 11 ){} 12 13 private static array $tables; 14 15 public function rollOn(string $name): string 16 { 17 $table = $this->getTable($name); 18 $result = $table->rollOnce(); 19 return preg_replace_callback('/{{roll on:\s*([A-Za-z0-9_]+)\s*}}/i', [$this, 'embedResult'], $result); 20 } 21 22 private function embedResult($matches): string 23 { 24 self::$embedCalls++; 25 if (self::$embedCalls < 20) { 26 $table = $this->getTable($matches[1]); 27 return trim($table->rollOnce()); 28 } 29 30 return "Too many recursive calls"; 31 } 32 33 private function getTable(string $name): TableInterface 34 { 35 if (!isset(self::$tables[$name])) { 36 $result = $this->db->query('SELECT * FROM rtables WHERE id=? LIMIT 1', $name); 37 $row = $this->db->res_fetch_assoc($result); 38 if ($row['rows']) { 39 self::$tables[$name] = new DokuwikiJsonTable($row['rows']); 40 } else { 41 self::$tables[$name] = new BaseTable(); 42 } 43 } 44 45 return self::$tables[$name]; 46 } 47} 48