modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2023-12-31 22:37:04 +04:00
parent 48d2c4aabf
commit 2964153e54
19 changed files with 205 additions and 22 deletions

View File

@ -7,7 +7,7 @@
<sourceFolder url="file://$MODULE_DIR$/php/src_output" isTestSource="false" packagePrefix="nulib\output\" /> <sourceFolder url="file://$MODULE_DIR$/php/src_output" isTestSource="false" packagePrefix="nulib\output\" />
<sourceFolder url="file://$MODULE_DIR$/php/src_web" isTestSource="false" packagePrefix="nulib\web\" /> <sourceFolder url="file://$MODULE_DIR$/php/src_web" isTestSource="false" packagePrefix="nulib\web\" />
<sourceFolder url="file://$MODULE_DIR$/php/src_ref" isTestSource="false" packagePrefix="nulib\ref\" /> <sourceFolder url="file://$MODULE_DIR$/php/src_ref" isTestSource="false" packagePrefix="nulib\ref\" />
<sourceFolder url="file://$MODULE_DIR$/php/src_sys" isTestSource="false" packagePrefix="nulib\sys\" /> <sourceFolder url="file://$MODULE_DIR$/php/src_php" isTestSource="false" packagePrefix="nulib\php\" />
<excludeFolder url="file://$MODULE_DIR$/vendor" /> <excludeFolder url="file://$MODULE_DIR$/vendor" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />

View File

@ -19,7 +19,7 @@
"psr-4": { "psr-4": {
"nulib\\": "php/src_base", "nulib\\": "php/src_base",
"nulib\\ref\\": "php/src_ref", "nulib\\ref\\": "php/src_ref",
"nulib\\sys\\": "php/src_sys", "nulib\\php\\": "php/src_php",
"nulib\\output\\": "php/src_output", "nulib\\output\\": "php/src_output",
"nulib\\web\\": "php/src_web" "nulib\\web\\": "php/src_web"
} }

View File

@ -0,0 +1,10 @@
<?php
namespace nulib\php;
/**
* Interface ICloseable: un objet que l'on peut fermer
*/
interface ICloseable {
/** fermer l'objet et libérer les resources */
function close(): void;
}

View File

@ -1,4 +1,4 @@
# nulib\sys # nulib\php
Ce package contient des services généraux spécifiques à PHP Ce package contient des services généraux spécifiques à PHP

View File

@ -1,5 +1,5 @@
<?php <?php
namespace nulib\sys; namespace nulib\php\content;
/** /**
* Interface IContent: un objet capable de produire du contenu à afficher. le * Interface IContent: un objet capable de produire du contenu à afficher. le

View File

@ -1,5 +1,5 @@
<?php <?php
namespace nulib\sys; namespace nulib\php\content;
/** /**
* Interface IPrintable: un objet qui écrit du contenu sur la sortie standard * Interface IPrintable: un objet qui écrit du contenu sur la sortie standard

View File

@ -1,5 +1,5 @@
<?php <?php
namespace nulib\sys; namespace nulib\php\content;
/** /**
* Interface IStaticContent: comme {@link IContent} mais la liste retournée est * Interface IStaticContent: comme {@link IContent} mais la liste retournée est

View File

@ -1,7 +1,8 @@
<?php <?php
namespace nulib\sys; namespace nulib\php\content;
use nulib\cl; use nulib\cl;
use nulib\php\func;
/** /**
* Class content: gestionnaire de contenu (statique ou dynamique) * Class content: gestionnaire de contenu (statique ou dynamique)

View File

@ -1,5 +1,5 @@
<?php <?php
namespace nulib\sys; namespace nulib\php;
use Closure; use Closure;
use nulib\cl; use nulib\cl;

View File

@ -0,0 +1,148 @@
<?php
namespace nulib\php\iter;
use Exception;
use Iterator;
use nulib\os\EOFException;
use nulib\php\ICloseable;
/**
* Class AbstractIterator: implémentation de base d'un itérateur
*/
abstract class AbstractIterator implements Iterator, ICloseable {
/**
* initialiser les ressources nécessaires à l'itération.
*
* les exceptions lancées par cette méthode sont ignorées.
*/
protected function _setup(): void {}
/**
* lancer un traitement avant de commencer l'itération.
*
* cette méthode est appelée après {@link _setup()} et l'objet est garanti
* d'être dans un état valide.
*
* cette méthode est prévue pour être surchargée par l'utilisateur, mais il
* doit gérer lui-même les exceptions éventuelles.
*/
protected function beforeIter() {}
/**
* retourner le prochain élément. lancer l'exception {@link EOFException} pour
* indiquer que plus aucun élément n'est disponible
*
* le cas échéant, initialiser $key
*
* @throws EOFException
*/
abstract protected function _next(&$key);
/**
* modifier l'élement retourné par {@link _next()} avant de le retourner.
*
*
* cette méthode est prévue pour être surchargée par l'utilisateur, mais il
* doit gérer lui-même les exceptions éventuelles.
*/
protected function cook(&$item) {}
/**
* lancer un traitement avant de terminer l'itération et de libérer les
* resources
*
* cette méthode est appelée avant {@link _teardown()} et l'objet est garanti
* d'être dans un état valide.
*
* cette méthode est prévue pour être surchargée par l'utilisateur, mais il
* doit gérer lui-même les exceptions éventuelles.
*/
protected function beforeClose(): void {}
/**
* libérer les ressources allouées.
*
* les exceptions lancées par cette méthode sont ignorées.
*/
protected function _teardown(): void {}
function close(): void {
$this->rewind();
}
#############################################################################
# Implémentation par défaut
private $setup = false;
private $valid = false;
private $toredown = true;
private $index = 0;
protected $key;
protected $item = null;
function key() {
return $this->key;
}
function current() {
return $this->item;
}
function next(): void {
if ($this->toredown) return;
$this->valid = false;
try {
$item = $this->_next($key);
} catch (EOFException $e) {
$this->beforeClose();
try {
$this->_teardown();
} catch (Exception $e) {
}
$this->toredown = true;
return;
}
$this->cook($item);
$this->item = $item;
if ($key !== null) {
$this->key = $key;
} else {
$this->index++;
$this->key = $this->index;
}
$this->valid = true;
}
function rewind(): void {
if ($this->setup) {
if (!$this->toredown) {
$this->beforeClose();
try {
$this->_teardown();
} catch (Exception $e) {
}
}
$this->setup = false;
$this->valid = false;
$this->toredown = true;
$this->index = 0;
$this->key = null;
$this->item = null;
}
}
function valid(): bool {
if (!$this->setup) {
try {
$this->_setup();
} catch (Exception $e) {
}
$this->setup = true;
$this->toredown = false;
$this->beforeIter();
$this->next();
}
return $this->valid;
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace nulib\php\json;
use RuntimeException;
class JsonException extends RuntimeException {
static final function json_last_error(?string $prefix=null): ?self {
$json_last_error = json_last_error();
if ($json_last_error === JSON_ERROR_NONE) return null;
$message = json_last_error_msg()." ($json_last_error)";
if ($prefix) $message = "$prefix: $message";
return new static($message);
}
static final function ensure_json_value($value, ?string $prefix=null) {
$exception = self::json_last_error($prefix);
if ($exception === null) return $value;
else throw $exception;
}
}

View File

@ -1,5 +1,5 @@
<?php <?php
namespace nulib\ref\sys; namespace nulib\ref\php;
class ref_func { class ref_func {
const CALL_ALL_PARAMS_SCHEMA = [ const CALL_ALL_PARAMS_SCHEMA = [

View File

@ -1,7 +1,8 @@
<?php <?php
namespace nulib\sys; namespace nulib\php\content;
use nulib\sys\impl\html; use nulib\php\content\content;
use nulib\php\content\impl\html;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class contentTest extends TestCase { class contentTest extends TestCase {

View File

@ -1,7 +1,7 @@
<?php <?php
namespace nulib\sys\impl; namespace nulib\php\content\impl;
use nulib\sys\IContent; use nulib\php\content\IContent;
class AContent implements IContent { class AContent implements IContent {
function getContent(): iterable { function getContent(): iterable {

View File

@ -1,7 +1,7 @@
<?php <?php
namespace nulib\sys\impl; namespace nulib\php\content\impl;
use nulib\sys\IPrintable; use nulib\php\content\IPrintable;
class APrintable implements IPrintable { class APrintable implements IPrintable {
function print(): void { function print(): void {

View File

@ -1,7 +1,8 @@
<?php <?php
namespace nulib\sys\impl; namespace nulib\php\content\impl;
use nulib\sys\IStaticContent; use nulib\php\content\IStaticContent;
use nulib\php\content\impl\html;
class AStaticContent implements IStaticContent { class AStaticContent implements IStaticContent {
function getContent(): iterable { function getContent(): iterable {

View File

@ -1,8 +1,8 @@
<?php <?php
namespace nulib\sys\impl; namespace nulib\php\content\impl;
use nulib\sys\content; use nulib\php\content\content;
use nulib\sys\IStaticContent; use nulib\php\content\IStaticContent;
class ATag implements IStaticContent { class ATag implements IStaticContent {
function __construct(string $tag, $contents=null) { function __construct(string $tag, $contents=null) {

View File

@ -1,5 +1,7 @@
<?php <?php
namespace nulib\sys\impl; namespace nulib\php\content\impl;
use nulib\php\content\impl\ATag;
class html { class html {
const H1 = [self::class, "h1"]; const H1 = [self::class, "h1"];

View File

@ -12,7 +12,7 @@ namespace {
function func_o1v($b=9, ...$c): array { return [$b, ...$c]; } function func_o1v($b=9, ...$c): array { return [$b, ...$c]; }
} }
namespace nulib\sys { namespace nulib\php {
use nulib\tests\TestCase; use nulib\tests\TestCase;
class funcTest extends TestCase { class funcTest extends TestCase {