diff --git a/src/output/Console.php b/src/output/StdMessenger.php
similarity index 82%
rename from src/output/Console.php
rename to src/output/StdMessenger.php
index bd0331b..9272475 100644
--- a/src/output/Console.php
+++ b/src/output/StdMessenger.php
@@ -4,7 +4,7 @@ namespace nur\sery\output;
use Exception;
use nulib\cl;
-class Console implements IMessenger {
+class StdMessenger implements IMessenger {
const INDENT = " ";
const VALID_LEVELS = [
@@ -35,18 +35,18 @@ class Console implements IMessenger {
const GENERIC_PREFIXES = [
self::LEVEL_MAJOR => [
"section" => [true, "SECTION!", "===", "=", "=", "==="],
- "title" => [false, "TITLE!", null, "T", "", "---"],
+ "title" => [false, "TITLE!", null, "T", "", "==="],
"desc" => ["DESC!", ">", ""],
"error" => ["CRITICAL!", "E!", ""],
- "warn" => ["ATTENTION!", "W!", ""],
- "note" => ["IMPORTANT!", "N!", ""],
+ "warn" => ["WARNING!", "W!", ""],
+ "note" => ["ATTENTION!", "N!", ""],
"info" => ["IMPORTANT!", "I!", ""],
"step" => ["*", ".", ""],
"print" => [null, null, null],
],
self::LEVEL_NORMAL => [
"section" => [true, "SECTION:", "---", "-", "-", "---"],
- "title" => [false, "TITLE:", null, "T", "", null],
+ "title" => [false, "TITLE:", null, "T", "", "---"],
"desc" => ["DESC:", ">", ""],
"error" => ["ERROR:", "E", ""],
"warn" => ["WARN:", "W", ""],
@@ -56,7 +56,7 @@ class Console implements IMessenger {
"print" => [null, null, null],
],
self::LEVEL_DEBUG => [
- "section" => [false, "section", null, ">>", "<<", null],
+ "section" => [true, "section", null, ">>", "<<", null],
"title" => [false, "title", null, "t", "", null],
"desc" => [">", ">", ""],
"error" => ["e", "e", ""],
@@ -75,6 +75,7 @@ class Console implements IMessenger {
];
function __construct(?array $params=null) {
+ $output = cl::get($params, "output");
$color = cl::get($params, "color");
$debug = boolval(cl::get($params, "debug"));
$minLevel = self::verifix_level(cl::get($params, "min_level"), $debug);
@@ -84,10 +85,14 @@ class Console implements IMessenger {
"color" => $color,
"indent" => static::INDENT,
];
- $this->out = new StdOutput(STDOUT, $params);
- $this->err = new StdOutput(STDERR, $params);
- $this->minLevel = intval($minLevel);
- $this->defaultLevel = intval($defaultLevel);
+ if ($output !== null) {
+ $this->err = $this->out = new StdOutput($output, $params);
+ } else {
+ $this->out = new StdOutput(STDOUT, $params);
+ $this->err = new StdOutput(STDERR, $params);
+ }
+ $this->minLevel = $minLevel;
+ $this->defaultLevel = $defaultLevel;
$this->inSection = false;
$this->titles = [];
$this->title = null;
@@ -127,7 +132,7 @@ class Console implements IMessenger {
$maxlen = 0;
foreach ($lines as &$content) {
$line = $out->filterColors($content);
- $len = strlen($line);
+ $len = mb_strlen($line);
if ($len > $maxlen) $maxlen = $len;
$content = [$content, $len];
}; unset($content);
@@ -144,7 +149,7 @@ class Console implements IMessenger {
} else {
$prefix = $prefixes[1];
if ($prefix !== null) $prefix .= " ";
- $prefix2 = str_repeat(" ", strlen($prefix));
+ $prefix2 = str_repeat(" ", mb_strlen($prefix));
$lines = $out->getLines(false, $content);
foreach ($lines as $content) {
$out->iprint($indentLevel, $prefix, $content);
@@ -157,36 +162,66 @@ class Console implements IMessenger {
bool $printContent, $content,
bool $printResult, ?bool $rsuccess, $rcontent,
int $indentLevel, StdOutput $out): void {
+ $color = $out->isColor();
if ($rsuccess === true) $type = "success";
elseif ($rsuccess === false) $type = "failure";
else $type = "neutral";
- $prefixes = self::RESULT_PREFIXES[$type];
- $prefix = $out->isColor()? $prefixes[1]: $prefixes[0];
- if ($prefix !== null) $prefix .= " ";
+ $rprefixes = self::RESULT_PREFIXES[$type];
+ if ($color) {
+ $rprefix = $rprefixes[1];
+ $rprefix2 = null;
+ if ($rprefix !== null) {
+ $rprefix .= " ";
+ $rprefix2 = $out->filterColors($out->filterContent($rprefix));
+ $rprefix2 = str_repeat(" ", mb_strlen($rprefix2));
+ }
+ } else {
+ $rprefix = $rprefixes[0];
+ if ($rprefix !== null) $rprefix .= " ";
+ $rprefix2 = str_repeat(" ", mb_strlen($rprefix));
+ }
if ($printContent && $printResult) {
if ($rcontent) {
cl::ensure_array($content);
$content[] = ": ";
$content[] = $rcontent;
}
- $out->iprint($indentLevel, $prefix, $content);
+ $lines = $out->getLines(false, $content);
+ foreach ($lines as $content) {
+ $out->iprint($indentLevel, $rprefix, $content);
+ $rprefix = $rprefix2;
+ }
} elseif ($printContent) {
$prefixes = self::GENERIC_PREFIXES[$level]["step"];
- if ($out->isColor()) {
+ if ($color) {
$prefix = $prefixes[1];
+ if ($prefix !== null) $prefix .= " ";
+ $prefix2 = $out->filterColors($out->filterContent($prefix));
+ $prefix2 = str_repeat(" ", mb_strlen($prefix2));
$suffix = $prefixes[2];
} else {
$prefix = $prefixes[0];
+ if ($prefix !== null) $prefix .= " ";
+ $prefix2 = str_repeat(" ", mb_strlen($prefix));
$suffix = null;
}
- if ($prefix !== null) $prefix .= " ";
- $out->iprint($indentLevel, $prefix, $content, $suffix, ":");
+ $lines = $out->getLines(false, $content, ":");
+ foreach ($lines as $content) {
+ $out->iprint($indentLevel, $prefix, $content, $suffix);
+ $prefix = $prefix2;
+ }
} elseif ($printResult) {
- if (!$rcontent) {
+ if (!$rcontent && $color) {
if ($rsuccess === true) $rcontent = "succès";
elseif ($rsuccess === false) $rcontent = "échec";
}
- if ($rcontent) $out->iprint($indentLevel + 1, $prefix, $rcontent);
+ $rprefix = " $rprefix";
+ $rprefix2 = " $rprefix2";
+ $lines = $out->getLines(false, $rcontent);
+ foreach ($lines as $rcontent) {
+ $out->iprint($indentLevel, $rprefix, $rcontent);
+ $rprefix = $rprefix2;
+ }
}
}
@@ -194,16 +229,28 @@ class Console implements IMessenger {
$prefixes = self::GENERIC_PREFIXES[$level][$type];
if ($out->isColor()) {
$prefix = $prefixes[1];
+ $prefix2 = null;
+ if ($prefix !== null) {
+ $prefix .= " ";
+ $prefix2 = $out->filterColors($out->filterContent($prefix));
+ $prefix2 = str_repeat(" ", mb_strlen($prefix2));
+ }
$suffix = $prefixes[2];
+ $lines = $out->getLines(false, $content);
+ foreach ($lines as $content) {
+ $out->iprint($indentLevel, $prefix, $content, $suffix);
+ $prefix = $prefix2;
+ }
} else {
$prefix = $prefixes[0];
- $suffix = null;
+ if ($prefix !== null) $prefix .= " ";
+ $prefix2 = str_repeat(" ", mb_strlen($prefix));
+ $lines = $out->getLines(false, $content);
+ foreach ($lines as $content) {
+ $out->iprint($indentLevel, $prefix, $content);
+ $prefix = $prefix2;
+ }
}
- $line = [$prefix];
- if ($prefix !== null) $line[] = " ";
- $line[] = $content;
- $line[] = $suffix;
- $out->iprint($indentLevel, ...$line);
}
/** @var bool est-on dans une section? */
diff --git a/src/output/StdOutput.php b/src/output/StdOutput.php
index e969485..894673d 100644
--- a/src/output/StdOutput.php
+++ b/src/output/StdOutput.php
@@ -149,7 +149,7 @@ class StdOutput {
$text .= "m";
return $text;
}
- protected function filterContent(string $text): string {
+ function filterContent(string $text): string {
# couleur au début
$text = preg_replace_callback('/]*)>/', [self::class, "replace_colors"], $text);
# reset à la fin
diff --git a/src/output/TODO.md b/src/output/TODO.md
index a8cd04d..7c3bebb 100644
--- a/src/output/TODO.md
+++ b/src/output/TODO.md
@@ -1,5 +1,15 @@
# IMessenger
+## TOOD
+
+* [ ] support `add_date` et `date_format`
+* [ ] affichage des exceptions en message technique.
+ si pas de message, prendre le message de l'exception par défaut
+* [ ] possibilité de paramétrer le nom du fichier destination pour faire une
+ rotation des logs
+
+## Principe
+
* 3 niveaux: DEBUG, NORMAL, MAJOR
* plusieurs types de messages:
* section: flush tous les messages en cours, ne peut pas être imbriqué
diff --git a/tbin/test-console.php b/tbin/test-console.php
index 186cb86..e206f40 100755
--- a/tbin/test-console.php
+++ b/tbin/test-console.php
@@ -2,7 +2,7 @@
section("section");
@@ -102,4 +106,13 @@ $c->section("multi-line\nsection");
$c->title("multi-line\ntitle");
$c->title("another\ntitle");
$c->print("multi-line\nprint");
+$c->info("multi-line\ninfo");
+$c->action("multi-line\naction");
+$c->success();
+$c->action("multi-line\naction");
+$c->step("multi-line\nstep");
+$c->failure();
+$c->action("multi-line\naction");
+$c->step("multi-line\nstep");
+$c->success("multi-line\nsuccess");
$c->end(true);