diff --git a/core/imageboard/image.php b/core/imageboard/image.php index eab9e5d6..64ac27ab 100644 --- a/core/imageboard/image.php +++ b/core/imageboard/image.php @@ -283,12 +283,13 @@ class Image { $tag_conditions = []; $img_conditions = []; + $stpen = 0; // search term parse event number /* * Turn a bunch of strings into a bunch of TagCondition * and ImgCondition objects */ - $stpe = send_event(new SearchTermParseEvent(null, $terms)); + $stpe = send_event(new SearchTermParseEvent($stpen++, null, $terms)); if ($stpe->is_querylet_set()) { foreach ($stpe->get_querylets() as $querylet) { $img_conditions[] = new ImgCondition($querylet, true); @@ -305,7 +306,7 @@ class Image continue; } - $stpe = send_event(new SearchTermParseEvent($term, $terms)); + $stpe = send_event(new SearchTermParseEvent($stpen++, $term, $terms)); if ($stpe->is_querylet_set()) { foreach ($stpe->get_querylets() as $querylet) { $img_conditions[] = new ImgCondition($querylet, $positive); diff --git a/ext/index/events.php b/ext/index/events.php index cf085ec9..40a1f9b6 100644 --- a/ext/index/events.php +++ b/ext/index/events.php @@ -6,6 +6,8 @@ */ class SearchTermParseEvent extends Event { + /** @var int */ + public $id = 0; /** @var null|string */ public $term = null; /** @var string[] */ @@ -13,9 +15,10 @@ class SearchTermParseEvent extends Event /** @var Querylet[] */ public $querylets = []; - public function __construct(string $term=null, array $context=[]) + public function __construct(int $id, string $term=null, array $context=[]) { parent::__construct(); + $this->id = $id; $this->term = $term; $this->context = $context; } diff --git a/ext/index/main.php b/ext/index/main.php index e8b6fec5..2c4a5c1b 100644 --- a/ext/index/main.php +++ b/ext/index/main.php @@ -5,9 +5,6 @@ require_once "events.php"; class Index extends Extension { - /** @var int */ - private $stpen = 0; // search term parse event number - /** @var IndexTheme */ protected $theme; @@ -194,13 +191,13 @@ class Index extends Extension ); } elseif (preg_match("/^ratio([:]?<|[:]?>|[:]?<=|[:]?>=|[:|=])(\d+):(\d+)$/i", $event->term, $matches)) { $cmp = preg_replace('/^:/', '=', $matches[1]); - $args = ["width{$this->stpen}"=>int_escape($matches[2]), "height{$this->stpen}"=>int_escape($matches[3])]; - $event->add_querylet(new Querylet("width / :width{$this->stpen} $cmp height / :height{$this->stpen}", $args)); + $args = ["width{$event->id}"=>int_escape($matches[2]), "height{$event->id}"=>int_escape($matches[3])]; + $event->add_querylet(new Querylet("width / :width{$event->id} $cmp height / :height{$event->id}", $args)); } elseif (preg_match("/^(filesize|id)([:]?<|[:]?>|[:]?<=|[:]?>=|[:|=])(\d+[kmg]?b?)$/i", $event->term, $matches)) { $col = $matches[1]; $cmp = ltrim($matches[2], ":") ?: "="; $val = parse_shorthand_int($matches[3]); - $event->add_querylet(new Querylet("images.$col $cmp :val{$this->stpen}", ["val{$this->stpen}"=>$val])); + $event->add_querylet(new Querylet("images.$col $cmp :val{$event->id}", ["val{$event->id}"=>$val])); } elseif (preg_match("/^(hash|md5)[=|:]([0-9a-fA-F]*)$/i", $event->term, $matches)) { $hash = strtolower($matches[2]); $event->add_querylet(new Querylet('images.hash = :hash', ["hash" => $hash])); @@ -209,7 +206,7 @@ class Index extends Extension $event->add_querylet(new Querylet('images.phash = :phash', ["phash" => $phash])); } elseif (preg_match("/^(filename|name)[=|:](.+)$/i", $event->term, $matches)) { $filename = strtolower($matches[2]); - $event->add_querylet(new Querylet("lower(images.filename) LIKE :filename{$this->stpen}", ["filename{$this->stpen}"=>"%$filename%"])); + $event->add_querylet(new Querylet("lower(images.filename) LIKE :filename{$event->id}", ["filename{$event->id}"=>"%$filename%"])); } elseif (preg_match("/^(source)[=|:](.*)$/i", $event->term, $matches)) { $source = strtolower($matches[2]); @@ -223,17 +220,17 @@ class Index extends Extension // TODO Make this able to search = without needing a time component. $cmp = ltrim($matches[1], ":") ?: "="; $val = $matches[2]; - $event->add_querylet(new Querylet("images.posted $cmp :posted{$this->stpen}", ["posted{$this->stpen}"=>$val])); + $event->add_querylet(new Querylet("images.posted $cmp :posted{$event->id}", ["posted{$event->id}"=>$val])); } elseif (preg_match("/^size([:]?<|[:]?>|[:]?<=|[:]?>=|[:|=])(\d+)x(\d+)$/i", $event->term, $matches)) { $cmp = ltrim($matches[1], ":") ?: "="; - $args = ["width{$this->stpen}"=>int_escape($matches[2]), "height{$this->stpen}"=>int_escape($matches[3])]; - $event->add_querylet(new Querylet("width $cmp :width{$this->stpen} AND height $cmp :height{$this->stpen}", $args)); + $args = ["width{$event->id}"=>int_escape($matches[2]), "height{$event->id}"=>int_escape($matches[3])]; + $event->add_querylet(new Querylet("width $cmp :width{$event->id} AND height $cmp :height{$event->id}", $args)); } elseif (preg_match("/^width([:]?<|[:]?>|[:]?<=|[:]?>=|[:|=])(\d+)$/i", $event->term, $matches)) { $cmp = ltrim($matches[1], ":") ?: "="; - $event->add_querylet(new Querylet("width $cmp :width{$this->stpen}", ["width{$this->stpen}"=>int_escape($matches[2])])); + $event->add_querylet(new Querylet("width $cmp :width{$event->id}", ["width{$event->id}"=>int_escape($matches[2])])); } elseif (preg_match("/^height([:]?<|[:]?>|[:]?<=|[:]?>=|[:|=])(\d+)$/i", $event->term, $matches)) { $cmp = ltrim($matches[1], ":") ?: "="; - $event->add_querylet(new Querylet("height $cmp :height{$this->stpen}", ["height{$this->stpen}"=>int_escape($matches[2])])); + $event->add_querylet(new Querylet("height $cmp :height{$event->id}", ["height{$event->id}"=>int_escape($matches[2])])); } elseif (preg_match("/^order[=|:](id|width|height|length|filesize|filename)[_]?(desc|asc)?$/i", $event->term, $matches)) { $ord = strtolower($matches[1]); $default_order_for_column = preg_match("/^(id|filename)$/", $matches[1]) ? "ASC" : "DESC"; @@ -254,7 +251,5 @@ class Index extends Extension Image::$order_sql = "RAND($seed)"; $event->add_querylet(new Querylet("1=1")); } - - $this->stpen++; } }