Browse Source
This will make their expansion easier and will also be useful for using typed properties laterreader
J. King
2 years ago
7 changed files with 341 additions and 287 deletions
@ -0,0 +1,46 @@ |
|||||
|
<?php |
||||
|
/** @license MIT |
||||
|
* Copyright 2017 J. King, Dustin Wilson et al. |
||||
|
* See LICENSE and AUTHORS files for details */ |
||||
|
|
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Context; |
||||
|
|
||||
|
abstract class AbstractContext { |
||||
|
protected $props = []; |
||||
|
protected $parent = null; |
||||
|
|
||||
|
public function __construct(self $c = null) { |
||||
|
$this->parent = $c; |
||||
|
} |
||||
|
|
||||
|
public function __clone() { |
||||
|
// if the context was cloned because its parent was cloned, change the parent to the clone |
||||
|
if ($this->parent) { |
||||
|
$t = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1]; |
||||
|
if (($t['object'] ?? null) instanceof self && $t['function'] === "__clone") { |
||||
|
$this->parent = $t['object']; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** @codeCoverageIgnore */ |
||||
|
public function __destruct() { |
||||
|
unset($this->parent); |
||||
|
} |
||||
|
|
||||
|
protected function act(string $prop, int $set, $value) { |
||||
|
if ($set) { |
||||
|
if (is_null($value)) { |
||||
|
unset($this->props[$prop]); |
||||
|
$this->$prop = (new \ReflectionClass($this))->getDefaultProperties()[$prop]; |
||||
|
} else { |
||||
|
$this->props[$prop] = true; |
||||
|
$this->$prop = $value; |
||||
|
} |
||||
|
return $this->parent ?? $this; |
||||
|
} else { |
||||
|
return isset($this->props[$prop]); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,29 @@ |
|||||
|
<?php |
||||
|
/** @license MIT |
||||
|
* Copyright 2017 J. King, Dustin Wilson et al. |
||||
|
* See LICENSE and AUTHORS files for details */ |
||||
|
|
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Context; |
||||
|
|
||||
|
trait BooleanMethods { |
||||
|
public function unread(bool $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function starred(bool $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function hidden(bool $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function labelled(bool $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function annotated(bool $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
<?php |
||||
|
/** @license MIT |
||||
|
* Copyright 2017 J. King, Dustin Wilson et al. |
||||
|
* See LICENSE and AUTHORS files for details */ |
||||
|
|
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Context; |
||||
|
|
||||
|
trait BooleanProperties { |
||||
|
public $unread = null; |
||||
|
public $starred = null; |
||||
|
public $hidden = null; |
||||
|
public $labelled = null; |
||||
|
public $annotated = null; |
||||
|
} |
@ -0,0 +1,202 @@ |
|||||
|
<?php |
||||
|
/** @license MIT |
||||
|
* Copyright 2017 J. King, Dustin Wilson et al. |
||||
|
* See LICENSE and AUTHORS files for details */ |
||||
|
|
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Context; |
||||
|
|
||||
|
use JKingWeb\Arsse\Misc\ValueInfo; |
||||
|
use JKingWeb\Arsse\Misc\Date; |
||||
|
|
||||
|
trait ExclusionMethods { |
||||
|
protected function cleanIdArray(array $spec, bool $allowZero = false): array { |
||||
|
$spec = array_values($spec); |
||||
|
for ($a = 0; $a < sizeof($spec); $a++) { |
||||
|
if (ValueInfo::id($spec[$a], $allowZero)) { |
||||
|
$spec[$a] = (int) $spec[$a]; |
||||
|
} else { |
||||
|
$spec[$a] = null; |
||||
|
} |
||||
|
} |
||||
|
return array_values(array_unique(array_filter($spec, function($v) { |
||||
|
return !is_null($v); |
||||
|
}))); |
||||
|
} |
||||
|
|
||||
|
protected function cleanStringArray(array $spec): array { |
||||
|
$spec = array_values($spec); |
||||
|
$stop = sizeof($spec); |
||||
|
for ($a = 0; $a < $stop; $a++) { |
||||
|
if (strlen($str = ValueInfo::normalize($spec[$a], ValueInfo::T_STRING | ValueInfo::M_DROP) ?? "")) { |
||||
|
$spec[$a] = $str; |
||||
|
} else { |
||||
|
unset($spec[$a]); |
||||
|
} |
||||
|
} |
||||
|
return array_values(array_unique($spec)); |
||||
|
} |
||||
|
|
||||
|
public function folder(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function folders(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanIdArray($spec, true); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function folderShallow(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function foldersShallow(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanIdArray($spec, true); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function tag(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function tags(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanIdArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function tagName(string $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function tagNames(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanStringArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function subscription(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function subscriptions(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanIdArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function edition(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function article(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function editions(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanIdArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function articles(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanIdArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function label(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function labels(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanIdArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function labelName(string $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function labelNames(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanStringArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function annotationTerms(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanStringArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function searchTerms(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanStringArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function titleTerms(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanStringArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function authorTerms(array $spec = null) { |
||||
|
if (isset($spec)) { |
||||
|
$spec = $this->cleanStringArray($spec); |
||||
|
} |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function latestArticle(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function oldestArticle(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function latestEdition(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function oldestEdition(int $spec = null) { |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function modifiedSince($spec = null) { |
||||
|
$spec = Date::normalize($spec); |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function notModifiedSince($spec = null) { |
||||
|
$spec = Date::normalize($spec); |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function markedSince($spec = null) { |
||||
|
$spec = Date::normalize($spec); |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
|
||||
|
public function notMarkedSince($spec = null) { |
||||
|
$spec = Date::normalize($spec); |
||||
|
return $this->act(__FUNCTION__, func_num_args(), $spec); |
||||
|
} |
||||
|
} |
@ -0,0 +1,40 @@ |
|||||
|
<?php |
||||
|
/** @license MIT |
||||
|
* Copyright 2017 J. King, Dustin Wilson et al. |
||||
|
* See LICENSE and AUTHORS files for details */ |
||||
|
|
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Context; |
||||
|
|
||||
|
trait ExclusionProperties { |
||||
|
public $folder = null; |
||||
|
public $folders = null; |
||||
|
public $folderShallow = null; |
||||
|
public $foldersShallow = null; |
||||
|
public $tag = null; |
||||
|
public $tags = null; |
||||
|
public $tagName = null; |
||||
|
public $tagNames = null; |
||||
|
public $subscription = null; |
||||
|
public $subscriptions = null; |
||||
|
public $edition = null; |
||||
|
public $editions = null; |
||||
|
public $article = null; |
||||
|
public $articles = null; |
||||
|
public $label = null; |
||||
|
public $labels = null; |
||||
|
public $labelName = null; |
||||
|
public $labelNames = null; |
||||
|
public $annotationTerms = null; |
||||
|
public $searchTerms = null; |
||||
|
public $titleTerms = null; |
||||
|
public $authorTerms = null; |
||||
|
public $oldestArticle = null; |
||||
|
public $latestArticle = null; |
||||
|
public $oldestEdition = null; |
||||
|
public $latestEdition = null; |
||||
|
public $modifiedSince = null; |
||||
|
public $notModifiedSince = null; |
||||
|
public $markedSince = null; |
||||
|
public $notMarkedSince = null; |
||||
|
} |
Loading…
Reference in new issue