From 55728059cf2d28db29f3c94fe6d1fcf9abf63f0c Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 15 Oct 2025 12:13:49 +0400 Subject: [PATCH] =?UTF-8?q?d=C3=A9but=20r=C3=A9organisation=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/php-docker-settings.xml | 15 ++ .idea/php.xml | 4 +- php/src/output/_TMessenger.php | 11 +- php/src/output/std/AbstractMessenger.php | 16 +- php/src/output/std/ConsoleMessenger.php | 212 +++++++++++++---------- php/src/output/std/LogMessenger.php | 142 ++++++++------- php/src/output/std/NullMessenger.php | 3 + php/src/output/std/ProxyMessenger.php | 122 +++++++------ php/src/output/std/_IMessenger.php | 24 +-- php/tbin/.gitignore | 1 + 10 files changed, 326 insertions(+), 224 deletions(-) diff --git a/.idea/php-docker-settings.xml b/.idea/php-docker-settings.xml index 047d43d..9e9123b 100644 --- a/.idea/php-docker-settings.xml +++ b/.idea/php-docker-settings.xml @@ -17,6 +17,21 @@ + + + + + + + diff --git a/.idea/php.xml b/.idea/php.xml index 40a93eb..06ee8b4 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -2,7 +2,7 @@ - + @@ -17,7 +17,7 @@ - + diff --git a/php/src/output/_TMessenger.php b/php/src/output/_TMessenger.php index 26de8a5..912dc0a 100644 --- a/php/src/output/_TMessenger.php +++ b/php/src/output/_TMessenger.php @@ -11,9 +11,14 @@ trait _TMessenger { static function set_messenger(IMessenger $msg, bool $replace=false): IMessenger { if (self::$msg instanceof NullMessenger) self::$msg = null; - if ($replace || self::$msg === null) return self::$msg = $msg; - elseif (self::$msg instanceof ProxyMessenger) self::$msg->addMessenger($msg); - else self::$msg = new ProxyMessenger(self::$msg); + if ($replace || self::$msg === null) { + return self::$msg = $msg; + } elseif (self::$msg instanceof ProxyMessenger) { + self::$msg->addMessenger($msg); + } else { + self::$msg = new ProxyMessenger(self::$msg); + self::$msg->addMessenger($msg); + } return $msg; } diff --git a/php/src/output/std/AbstractMessenger.php b/php/src/output/std/AbstractMessenger.php index 69da625..073c036 100644 --- a/php/src/output/std/AbstractMessenger.php +++ b/php/src/output/std/AbstractMessenger.php @@ -49,8 +49,12 @@ abstract class AbstractMessenger implements _IMessenger { protected int $lastTitleId = 1; + protected abstract function title__getId(): ?int; + protected int $lastActionId = 1; + protected abstract function action__getId(): ?int; + protected function getLinePrefix(): ?string { $linePrefix = null; if ($this->addDate) { @@ -59,9 +63,9 @@ abstract class AbstractMessenger implements _IMessenger { } if ($this->showIds) { if ($this->id !== null) $linePrefix .= "p=$this->id "; - $titleId = $this->_getTitleId(); + $titleId = $this->title__getId(); if ($titleId !== null) $linePrefix .= "t=$titleId "; - $actionId = $this->_getActionId(); + $actionId = $this->action__getId(); if ($actionId !== null) $linePrefix .= "a=$actionId "; } return $linePrefix; @@ -129,7 +133,7 @@ abstract class AbstractMessenger implements _IMessenger { } } - protected abstract function flushActions(bool $endAction=false, ?int $overrideLevel=null): void; + protected abstract function action__flush(bool $endAction=false, ?int $overrideLevel=null): void; protected function _printAction( ?string $linePrefix, int $level, @@ -269,7 +273,7 @@ abstract class AbstractMessenger implements _IMessenger { $flushActions = true; $showContent = $this->checkLevel($level); if ($content !== null && $showContent) { - $this->flushActions(); $flushActions = false; + $this->action__flush(); $flushActions = false; $this->_printGeneric($linePrefix, $level, $type, $content, $indentLevel, $out); } if ($exceptions !== null) { @@ -279,12 +283,12 @@ abstract class AbstractMessenger implements _IMessenger { # tout d'abord message $message = exceptions::get_message($exception); if ($showContent) { - if ($flushActions) { $this->flushActions(); $flushActions = false; } + if ($flushActions) { $this->action__flush(); $flushActions = false; } $this->_printGeneric($linePrefix, $level, $type, $message, $indentLevel, $out); } # puis summary et traceback if ($showTraceback) { - if ($flushActions) { $this->flushActions(); $flushActions = false; } + if ($flushActions) { $this->action__flush(); $flushActions = false; } $summary = exceptions::get_summary($exception, false); $this->_printGeneric($linePrefix, $level1, $type, $summary, $indentLevel, $out); $traceback = exceptions::get_traceback($exception); diff --git a/php/src/output/std/ConsoleMessenger.php b/php/src/output/std/ConsoleMessenger.php index fe383cd..9083f3d 100644 --- a/php/src/output/std/ConsoleMessenger.php +++ b/php/src/output/std/ConsoleMessenger.php @@ -108,8 +108,19 @@ class ConsoleMessenger extends AbstractMessenger { /** @var array section qui est en attente d'affichage */ protected ?array $section; + protected function section__end(): void { + while ($this->actions) $this->adone(); + while ($this->titles) $this->title__end(); + $this->inSection = false; + $this->section = null; + } + + function section__afterFunc(): void { + $this->section__end(); + } + function section($content, ?callable $func=null, ?int $level=null): void { - $this->_endSection(); + $this->section__end(); $this->inSection = true; if (!$this->checkLevel($level)) return; $this->section = [ @@ -122,7 +133,7 @@ class ConsoleMessenger extends AbstractMessenger { try { $func($this); } finally { - $this->_endSection(); + $this->section__afterFunc(); } } } @@ -138,13 +149,6 @@ class ConsoleMessenger extends AbstractMessenger { } } - function _endSection(): void { - while ($this->actions) $this->adone(); - while ($this->titles) $this->_endTitle(); - $this->inSection = false; - $this->section = null; - } - protected function getIndentLevel(bool $withActions=true): int { $indentLevel = count($this->titles) - 1; if ($indentLevel < 0) $indentLevel = 0; @@ -159,63 +163,26 @@ class ConsoleMessenger extends AbstractMessenger { protected array $titles; - function _getTitleMark(): int { - return count($this->titles); + function title__getMarks(): array { + return [count($this->titles)]; } - function _getTitleId(): ?int { + protected function title__getId(): ?int { return end($this->titles)["id"] ?? null; } - function title($content, ?callable $func=null, ?int $level=null): void { - if (!$this->checkLevel($level)) return; - $titleLevel = $this->_getTitleMark(); - // faire en deux temps pour linePrefix soit à jour - $this->titles[] = ["id" => $this->lastTitleId++]; - A::merge($this->titles[array_key_last($this->titles)], [ - "title_level" => $titleLevel, - "max_title_level" => null, - "line_prefix" => $this->getLinePrefix(), - "level" => $level, - "content" => $content, - "print_content" => true, - "descs" => [], - "print_descs" => false, - ]); - if ($func !== null) { - try { - $title =& $this->titles[array_key_last($this->titles)]; - $title["max_title_level"] = $titleLevel + 1; - $func($this); - } finally { - $title["max_title_level"] = null; - $this->_endTitle($titleLevel); + protected function title__end(?int $until=null): void { + $title = $this->titles[array_key_last($this->titles)] ?? null; + if ($title !== null) { + $until ??= $title["max_title_level"]; + $until ??= $this->title__getMarks()[0] - 1; + while (count($this->titles) > $until) { + array_pop($this->titles); } } } - function desc($content, ?int $level=null): void { - if (!$this->checkLevel($level)) return; - $desc = [ - "line_prefix" => $this->getLinePrefix(), - "level" => $level, - "content" => $content, - ]; - $key = array_key_last($this->titles); - if ($key !== null) { - $title =& $this->titles[$key]; - $title["descs"][] = $desc; - $title["print_descs"] = true; - } else { - # pas de titre en cours - $this->_printGeneric( - $desc["line_prefix"], $desc["level"], - "desc", $desc["content"], - 0, $this->err); - } - } - - protected function flushTitles(): void { + protected function title__flush(): void { $this->printSection(); $err = $this->err; $indentLevel = 0; @@ -241,29 +208,86 @@ class ConsoleMessenger extends AbstractMessenger { }; unset($title); } - function _endTitle(?int $until=null): void { - $title = $this->titles[array_key_last($this->titles)] ?? null; - if ($title !== null) { - $until ??= $title["max_title_level"]; - $until ??= $this->_getTitleMark() - 1; - while (count($this->titles) > $until) { - array_pop($this->titles); + function title__beforeFunc(array $marks): void { + $title =& $this->titles[array_key_last($this->titles)]; + $title["max_title_level"] = $marks[0] + 1; + } + + function title__afterFunc(array $marks): void { + $title =& $this->titles[array_key_last($this->titles)]; + $title["max_title_level"] = null; + $this->title__end($marks[0]); + } + + function title($content, ?callable $func=null, ?int $level=null): void { + if (!$this->checkLevel($level)) return; + $marks = $this->title__getMarks(); + // faire en deux temps pour linePrefix soit à jour + $this->titles[] = ["id" => $this->lastTitleId++]; + A::merge($this->titles[array_key_last($this->titles)], [ + "title_level" => $marks[0], + "max_title_level" => null, + "line_prefix" => $this->getLinePrefix(), + "level" => $level, + "content" => $content, + "print_content" => true, + "descs" => [], + "print_descs" => false, + ]); + if ($func !== null) { + try { + $this->title__beforeFunc($marks); + $func($this); + } finally { + $this->title__afterFunc($marks); } } } + function desc($content, ?int $level=null): void { + if (!$this->checkLevel($level)) return; + $desc = [ + "line_prefix" => $this->getLinePrefix(), + "level" => $level, + "content" => $content, + ]; + $key = array_key_last($this->titles); + if ($key !== null) { + $title =& $this->titles[$key]; + $title["descs"][] = $desc; + $title["print_descs"] = true; + } else { + # pas de titre en cours + $this->_printGeneric( + $desc["line_prefix"], $desc["level"], + "desc", $desc["content"], + 0, $this->err); + } + } + protected array $actions; - function _getActionMark(): int { - return count($this->actions); + function action__getMarks(): array { + return [count($this->actions)]; } - function _getActionId(): ?int { + protected function action__getId(): ?int { return end($this->actions)["id"] ?? null; } - protected function flushActions(bool $endAction=false, ?int $overrideLevel=null): void { - $this->flushTitles(); + protected function action__end(?int $until=null): void { + $action = $this->actions[array_key_last($this->actions)] ?? null; + if ($action !== null) { + $until ??= $action["max_action_level"]; + $until ??= $this->action__getMarks()[0] - 1; + while (count($this->actions) > $until) { + array_pop($this->actions); + } + } + } + + protected function action__flush(bool $endAction=false, ?int $overrideLevel=null): void { + $this->title__flush(); $err = $this->err; $indentLevel = $this->getIndentLevel(false); $lastIndex = array_key_last($this->actions); @@ -311,16 +335,27 @@ class ConsoleMessenger extends AbstractMessenger { } $indentLevel++; }; unset($action); - if ($endAction) $this->_endAction(); + if ($endAction) $this->action__end(); + } + + function action__beforeFunc(array $marks): void { + $action =& $this->actions[array_key_last($this->actions)]; + $action["max_action_level"] = $marks[0] + 1; + } + + function action__afterFunc(array $marks): void { + $action =& $this->actions[array_key_last($this->actions)]; + $action["max_action_level"] = null; + $this->action__end($marks[0]); } function action($content, ?callable $func=null, ?int $level=null): void { $this->checkLevel($level); - $actionLevel = $this->_getActionMark(); + $marks = $this->action__getMarks(); // faire en deux temps pour linePrefix soit à jour $this->actions[] = ["id" => $this->lastActionId++]; A::merge($this->actions[array_key_last($this->actions)], [ - "action_level" => $actionLevel, + "action_level" => $marks[0], "max_action_level" => null, "timestamp" => time(), "line_prefix" => $this->getLinePrefix(), @@ -332,18 +367,16 @@ class ConsoleMessenger extends AbstractMessenger { ]); if ($func !== null) { try { - $action =& $this->actions[array_key_last($this->actions)]; - $action["max_action_level"] = $actionLevel + 1; + $this->action__beforeFunc($marks); $result = $func($this); - if ($this->_getActionMark() > $actionLevel) { + if ($this->action__getMarks()[0] > $marks[0]) { $this->aresult($result); } } catch (Exception $e) { $this->afailure($e); throw $e; } finally { - $action["max_action_level"] = null; - $this->_endAction($actionLevel); + $this->action__afterFunc($marks); } } } @@ -359,7 +392,7 @@ class ConsoleMessenger extends AbstractMessenger { $action =& $this->actions[array_key_last($this->actions)]; $action["result_success"] = true; $action["result_content"] = $content; - $this->flushActions(true, $overrideLevel); + $this->action__flush(true, $overrideLevel); } function afailure($content=null, ?int $overrideLevel=null): void { @@ -367,7 +400,7 @@ class ConsoleMessenger extends AbstractMessenger { $action =& $this->actions[array_key_last($this->actions)]; $action["result_success"] = false; $action["result_content"] = $content; - $this->flushActions(true, $overrideLevel); + $this->action__flush(true, $overrideLevel); } function adone($content=null, ?int $overrideLevel=null): void { @@ -375,7 +408,7 @@ class ConsoleMessenger extends AbstractMessenger { $action =& $this->actions[array_key_last($this->actions)]; $action["result_success"] = null; $action["result_content"] = $content; - $this->flushActions(true, $overrideLevel); + $this->action__flush(true, $overrideLevel); } function aresult($result=null, ?int $overrideLevel=null): void { @@ -386,17 +419,6 @@ class ConsoleMessenger extends AbstractMessenger { else $this->adone($result, $overrideLevel); } - function _endAction(?int $until=null): void { - $action = $this->actions[array_key_last($this->actions)] ?? null; - if ($action !== null) { - $until ??= $action["max_action_level"]; - $until ??= $this->_getActionMark() - 1; - while (count($this->actions) > $until) { - array_pop($this->actions); - } - } - } - function print($content, ?int $level=null): void { $this->_printGenericOrException( $level, "print", $content, @@ -428,9 +450,9 @@ class ConsoleMessenger extends AbstractMessenger { } function end(bool $all=false): void { - if ($all) $this->_endSection(); - elseif ($this->actions) $this->_endAction(); - elseif ($this->titles) $this->_endTitle(); - else $this->_endSection(); + if ($all) $this->section__afterFunc(); + elseif ($this->actions) $this->action__end(); + elseif ($this->titles) $this->title__end(); + else $this->section__afterFunc(); } } diff --git a/php/src/output/std/LogMessenger.php b/php/src/output/std/LogMessenger.php index bc7d978..b709959 100644 --- a/php/src/output/std/LogMessenger.php +++ b/php/src/output/std/LogMessenger.php @@ -79,8 +79,16 @@ class LogMessenger extends AbstractMessenger { return $clone; } + protected function section__end(): void { + $this->end(true); + } + + function section__afterFunc(): void { + $this->section__end(); + } + function section($content, ?callable $func=null, ?int $level=null): void { - $this->_endSection(); + $this->section__end(); if (!$this->checkLevel($level)) return; $this->_printTitle( $this->getLinePrefix(), $level, @@ -90,45 +98,61 @@ class LogMessenger extends AbstractMessenger { try { $func($this); } finally { - $this->_endSection(); + $this->section__afterFunc(); } } } - function _endSection(): void { - $this->end(true); - } - protected array $titles; - function _getTitleMark(): int { - return count($this->titles); + function title__getMarks(): array { + return [count($this->titles)]; } - function _getTitleId(): ?int { + protected function title__getId(): ?int { return end($this->titles)["id"] ?? null; } + protected function title__end(?int $until=null): void { + $title = $this->titles[array_key_last($this->titles)] ?? null; + if ($title !== null) { + $until ??= $title["max_title_level"]; + $until ??= $this->title__getMarks()[0] - 1; + while (count($this->titles) > $until) { + array_pop($this->titles); + } + } + } + + function title__beforeFunc(array $marks): void { + $title =& $this->titles[array_key_last($this->titles)]; + $title["max_title_level"] = $marks[0] + 1; + } + + function title__afterFunc(array $marks): void { + $title =& $this->titles[array_key_last($this->titles)]; + $title["max_title_level"] = null; + $this->title__end($marks[0]); + } + function title($content, ?callable $func=null, ?int $level=null): void { if (!$this->checkLevel($level)) return; - $titleLevel = $this->_getTitleMark(); + $marks = $this->title__getMarks(); $this->titles[] = [ "id" => $this->lastTitleId++, - "title_level" => $titleLevel, + "title_level" => $marks[0], "max_title_level" => null, ]; $this->_printTitle( $this->getLinePrefix(), $level, "title", $content, - $titleLevel, $this->out); + $marks[0], $this->out); if ($func !== null) { try { - $title =& $this->titles[array_key_last($this->titles)]; - $title["max_title_level"] = $titleLevel + 1; + $this->title__beforeFunc($marks); $func($this); } finally { - $title["max_title_level"] = null; - $this->_endTitle($titleLevel); + $this->title__afterFunc($marks); } } } @@ -143,31 +167,47 @@ class LogMessenger extends AbstractMessenger { } - function _endTitle(?int $until=null): void { - $title = $this->titles[array_key_last($this->titles)]; - $until ??= $title["max_title_level"]; - $until ??= $this->_getTitleMark() - 1; - while (count($this->titles) > $until) { - array_pop($this->titles); + protected array $actions; + + function action__getMarks(): array { + return [count($this->actions)]; + } + + protected function action__getId(): ?int { + return end($this->actions)["id"] ?? null; + } + + protected function action__end(?int $until=null): void { + $action = $this->actions[array_key_last($this->actions)] ?? null; + if ($action !== null) { + $until ??= $action["max_action_level"]; + $until ??= $this->action__getMarks()[0] - 1; + while (count($this->actions) > $until) { + array_pop($this->actions); + } } } - protected array $actions; - - function _getActionMark(): int { - return count($this->actions); + protected function action__flush(bool $endAction=false, ?int $overrideLevel=null): void { } - function _getActionId(): ?int { - return end($this->actions)["id"] ?? null; + function action__beforeFunc(array $marks): void { + $action =& $this->actions[array_key_last($this->actions)]; + $action["max_action_level"] = $marks[0] + 1; + } + + function action__afterFunc(array $marks): void { + $action =& $this->actions[array_key_last($this->actions)]; + $action["max_action_level"] = null; + $this->action__end($marks[0]); } function action($content, ?callable $func=null, ?int $level=null): void { $this->checkLevel($level); - $actionLevel = $this->_getActionMark(); + $marks = $this->action__getMarks(); $this->actions[] = [ "id" => $this->lastActionId++, - "action_level" => $actionLevel, + "action_level" => $marks[0], "max_action_level" => null, "level" => $level ]; @@ -175,28 +215,23 @@ class LogMessenger extends AbstractMessenger { $this->getLinePrefix(), $level, true, $content, false, null, null, - $actionLevel, $this->out); + $marks[0], $this->out); if ($func !== null) { try { - $action =& $this->actions[array_key_last($this->actions)]; - $action["max_action_level"] = $actionLevel + 1; + $this->action__beforeFunc($marks); $result = $func($this); - if ($this->_getActionMark() > $actionLevel) { + if ($this->action__getMarks()[0] > $marks[0]) { $this->aresult($result); } } catch (Exception $e) { $this->afailure($e); throw $e; } finally { - $action["max_action_level"] = null; - $this->_endAction($actionLevel); + $this->action__afterFunc($marks); } } } - protected function flushActions(bool $endAction=false, ?int $overrideLevel=null): void { - } - function step($content, ?int $level=null): void { $this->_printGenericOrException( $level, "step", $content, @@ -204,7 +239,7 @@ class LogMessenger extends AbstractMessenger { } function asuccess($content=null, ?int $overrideLevel=null): void { - if ($this->_getActionMark() == 0) $this->action(null); + if ($this->action__getMarks()[0] == 0) $this->action(null); $action = end($this->actions); $level = $overrideLevel ?? $action["level"]; $this->_printAction( @@ -212,11 +247,11 @@ class LogMessenger extends AbstractMessenger { false, null, true, true, $content, $action["action_level"], $this->out); - $this->_endAction(); + $this->action__end(); } function afailure($content=null, ?int $overrideLevel=null): void { - if ($this->_getActionMark() == 0) $this->action(null); + if ($this->action__getMarks()[0] == 0) $this->action(null); $action = end($this->actions); $level = $overrideLevel ?? $action["level"]; $this->_printAction( @@ -224,11 +259,11 @@ class LogMessenger extends AbstractMessenger { false, null, true, false, $content, $action["action_level"], $this->out); - $this->_endAction(); + $this->action__end(); } function adone($content=null, ?int $overrideLevel=null): void { - if ($this->_getActionMark() == 0) $this->action(null); + if ($this->action__getMarks()[0] == 0) $this->action(null); $action = end($this->actions); $level = $overrideLevel ?? $action["level"]; $this->_printAction( @@ -236,26 +271,17 @@ class LogMessenger extends AbstractMessenger { false, null, true, null, $content, $action["action_level"], $this->out); - $this->_endAction(); + $this->action__end(); } function aresult($result=null, ?int $overrideLevel=null): void { - if ($this->_getActionMark() == 0) $this->action(null); + if ($this->action__getMarks()[0] == 0) $this->action(null); if ($result === true) $this->asuccess(null, $overrideLevel); elseif ($result === false) $this->afailure(null, $overrideLevel); elseif ($result instanceof Exception) $this->afailure($result, $overrideLevel); else $this->adone($result, $overrideLevel); } - function _endAction(?int $until=null): void { - $action = $this->actions[array_key_last($this->actions)]; - $until ??= $action["max_action_level"]; - $until ??= $this->_getActionMark() - 1; - while (count($this->actions) > $until) { - array_pop($this->actions); - } - } - protected function getIndentLevel(bool $withActions=true): int { $indentLevel = count($this->titles) - 1; if ($indentLevel < 0) $indentLevel = 0; @@ -296,11 +322,11 @@ class LogMessenger extends AbstractMessenger { function end(bool $all=false): void { if ($all) { while ($this->actions) $this->adone(); - while ($this->titles) $this->_endTitle(); + while ($this->titles) $this->title__end(); } elseif ($this->actions) { - $this->_endAction(); + $this->action__end(); } elseif ($this->titles) { - $this->_endTitle(); + $this->title__end(); } } } diff --git a/php/src/output/std/NullMessenger.php b/php/src/output/std/NullMessenger.php index ca4f816..0218ebb 100644 --- a/php/src/output/std/NullMessenger.php +++ b/php/src/output/std/NullMessenger.php @@ -12,15 +12,18 @@ class NullMessenger implements IMessenger { } function section($content, ?callable $func=null, ?int $level=null): void { + if ($func !== null) $func($this); } function title($content, ?callable $func=null, ?int $level=null): void { + if ($func !== null) $func($this); } function desc($content, ?int $level=null): void { } function action($content, ?callable $func=null, ?int $level=null): void { + if ($func !== null) $func($this); } function step($content, ?int $level=null): void { diff --git a/php/src/output/std/ProxyMessenger.php b/php/src/output/std/ProxyMessenger.php index 527fec0..6b578b4 100644 --- a/php/src/output/std/ProxyMessenger.php +++ b/php/src/output/std/ProxyMessenger.php @@ -10,14 +10,14 @@ use nulib\output\IMessenger; * NB: si cette classe est instanciée sans argument, elle agit comme * {@link NullMessenger}: elle envoie tous les messages vers /dev/null */ -class ProxyMessenger implements IMessenger { +class ProxyMessenger implements _IMessenger { function __construct(?IMessenger ...$msgs) { foreach ($msgs as $msg) { if ($msg !== null) $this->msgs[] = $msg; } } - /** @var IMessenger[] */ + /** @var _IMessenger[] */ protected ?array $msgs = []; function isEmpty(): bool { @@ -43,45 +43,64 @@ class ProxyMessenger implements IMessenger { return $clone; } + function section__afterFunc(): void { + foreach ($this->msgs as $msg) { + if ($msg instanceof _IMessenger) { + $msg->section__afterFunc(); + } + } + } + function section($content, ?callable $func=null, ?int $level=null): void { - $useFunc = false; foreach ($this->msgs as $msg) { $msg->section($content, null, $level); - if ($msg instanceof _IMessenger) $useFunc = true; } - if ($useFunc && $func !== null) { + if ($func !== null) { try { $func($this); } finally { - /** @var _IMessenger $msg */ - foreach ($this->msgs as $msg) { - $msg->_endSection(); - } + $this->section__afterFunc(); + } + } + } + + function title__getMarks(): array { + $marks = []; + foreach ($this->msgs as $key => $msg) { + if ($msg instanceof _IMessenger) { + $marks[$key] = $msg->title__getMarks(); + } + } + return $marks; + } + + function title__beforeFunc(array $marks): void { + foreach ($this->msgs as $key => $msg) { + if ($msg instanceof _IMessenger) { + $msg->title__beforeFunc($marks[$key]); + } + } + } + + function title__afterFunc(array $marks): void { + foreach ($this->msgs as $key => $msg) { + if ($msg instanceof _IMessenger) { + $msg->title__afterFunc($marks[$key]); } } } function title($content, ?callable $func=null, ?int $level=null): void { - $useFunc = false; - $untils = []; + $marks = $this->title__getMarks(); foreach ($this->msgs as $msg) { - if ($msg instanceof _IMessenger) { - $useFunc = true; - $untils[] = $msg->_getTitleMark(); - } $msg->title($content, null, $level); } - if ($useFunc && $func !== null) { + if ($func !== null) { try { + $this->title__beforeFunc($marks); $func($this); } finally { - /** @var _IMessenger $msg */ - $index = 0; - foreach ($this->msgs as $msg) { - if ($msg instanceof _IMessenger) { - $msg->_endTitle($untils[$index++]); - } - } + $this->title__afterFunc($marks); } } } @@ -92,38 +111,43 @@ class ProxyMessenger implements IMessenger { } } - function action($content, ?callable $func=null, ?int $level=null): void { - $useFunc = false; - $untils = []; - foreach ($this->msgs as $msg) { + function action__getMarks(): array { + $marks = []; + foreach ($this->msgs as $key => $msg) { if ($msg instanceof _IMessenger) { - $useFunc = true; - $untils[] = $msg->_getActionMark(); + $marks[$key] = $msg->action__getMarks(); } + } + return $marks; + } + + function action__beforeFunc(array $marks): void { + foreach ($this->msgs as $key => $msg) { + if ($msg instanceof _IMessenger) { + $msg->action__beforeFunc($marks[$key]); + } + } + } + + function action__afterFunc(array $marks): void { + foreach ($this->msgs as $key => $msg) { + if ($msg instanceof _IMessenger) { + $msg->action__afterFunc($marks[$key]); + } + } + } + + function action($content, ?callable $func=null, ?int $level=null): void { + $marks = $this->action__getMarks(); + foreach ($this->msgs as $msg) { $msg->action($content, null, $level); } - if ($useFunc && $func !== null) { + if ($func !== null) { try { - $result = $func($this); - /** @var _IMessenger $msg */ - $index = 0; - foreach ($this->msgs as $msg) { - if ($msg->_getActionMark() > $untils[$index++]) { - $msg->aresult($result); - } - } - } catch (Exception $e) { - /** @var _IMessenger $msg */ - foreach ($this->msgs as $msg) { - $msg->afailure($e); - } - throw $e; + $this->action__beforeFunc($marks); + $func($this); } finally { - /** @var _IMessenger $msg */ - $index = 0; - foreach ($this->msgs as $msg) { - $msg->_endAction($untils[$index++]); - } + $this->action__afterFunc($marks); } } } diff --git a/php/src/output/std/_IMessenger.php b/php/src/output/std/_IMessenger.php index ed1c70f..eec67f3 100644 --- a/php/src/output/std/_IMessenger.php +++ b/php/src/output/std/_IMessenger.php @@ -74,17 +74,19 @@ interface _IMessenger extends IMessenger { "done" => [null, null], ]; - function _endSection(): void; + function section__afterFunc(): void; - function _getTitleMark(): int; + /** @return int[] */ + function title__getMarks(): array; + /** @param int[] $marks */ + function title__beforeFunc(array $marks): void; + /** @param int[] $marks */ + function title__afterFunc(array $marks): void; - function _getTitleId(): ?int; - - function _endTitle(?int $until=null): void; - - function _getActionMark(): int; - - function _getActionId(): ?int; - - function _endAction(?int $until=null): void; + /** @return int[] */ + function action__getMarks(): array; + /** @param int[] $marks */ + function action__beforeFunc(array $marks): void; + /** @param int[] $marks */ + function action__afterFunc(array $marks): void; } diff --git a/php/tbin/.gitignore b/php/tbin/.gitignore index 4e0bb30..e20f16c 100644 --- a/php/tbin/.gitignore +++ b/php/tbin/.gitignore @@ -1,3 +1,4 @@ +/devel/ /*.db /*.cache /*.log