formatting

This commit is contained in:
Shish 2019-09-29 14:32:51 +01:00
parent 4dce3a2f07
commit f5119b20a3
100 changed files with 406 additions and 409 deletions

View File

@ -192,14 +192,14 @@ class Cache
$_tracer->begin("Cache Query", ["key"=>$key]); $_tracer->begin("Cache Query", ["key"=>$key]);
$val = $this->engine->get($key); $val = $this->engine->get($key);
if ($val !== false) { if ($val !== false) {
$res = "hit"; $res = "hit";
$this->hits++; $this->hits++;
} else { } else {
$res = "miss"; $res = "miss";
$this->misses++; $this->misses++;
} }
$_tracer->end(null, ["result"=>$res]); $_tracer->end(null, ["result"=>$res]);
return $val; return $val;
} }
public function set(string $key, $val, int $time=0) public function set(string $key, $val, int $time=0)

View File

@ -159,7 +159,7 @@ abstract class BaseConfig implements Config
public function set_array(string $name, ?array $value): void public function set_array(string $name, ?array $value): void
{ {
if($value!=null) { if ($value!=null) {
$this->values[$name] = implode(",", $value); $this->values[$name] = implode(",", $value);
} else { } else {
$this->values[$name] = null; $this->values[$name] = null;
@ -313,16 +313,19 @@ class DatabaseConfig extends BaseConfig
private $sub_column; private $sub_column;
private $sub_value; private $sub_value;
public function __construct(Database $database, string $table_name = "config", public function __construct(
string $sub_column = null, string $sub_value = null) Database $database,
{ string $table_name = "config",
string $sub_column = null,
string $sub_value = null
) {
$this->database = $database; $this->database = $database;
$this->table_name = $table_name; $this->table_name = $table_name;
$this->sub_value = $sub_value; $this->sub_value = $sub_value;
$this->sub_column = $sub_column; $this->sub_column = $sub_column;
$cache_name = "config"; $cache_name = "config";
if(!empty($sub_value)) { if (!empty($sub_value)) {
$cache_name .= "_".$sub_value; $cache_name .= "_".$sub_value;
} }
@ -335,12 +338,12 @@ class DatabaseConfig extends BaseConfig
$query = "SELECT name, value FROM {$this->table_name}"; $query = "SELECT name, value FROM {$this->table_name}";
$args = []; $args = [];
if(!empty($sub_column)&&!empty($sub_value)) { if (!empty($sub_column)&&!empty($sub_value)) {
$query .= " WHERE $sub_column = :sub_value"; $query .= " WHERE $sub_column = :sub_value";
$args["sub_value"] = $sub_value; $args["sub_value"] = $sub_value;
} }
foreach ($this->database->get_all($query, $args ) as $row) { foreach ($this->database->get_all($query, $args) as $row) {
$this->values[$row["name"]] = $row["value"]; $this->values[$row["name"]] = $row["value"];
} }
$this->database->cache->set($cache_name, $this->values); $this->database->cache->set($cache_name, $this->values);
@ -359,7 +362,7 @@ class DatabaseConfig extends BaseConfig
$args = ["name"=>$name]; $args = ["name"=>$name];
$cols = ["name","value"]; $cols = ["name","value"];
$params = [":name",":value"]; $params = [":name",":value"];
if(!empty($this->sub_column)&&!empty($this->sub_value)) { if (!empty($this->sub_column)&&!empty($this->sub_value)) {
$query .= " AND $this->sub_column = :sub_value"; $query .= " AND $this->sub_column = :sub_value";
$args["sub_value"] = $this->sub_value; $args["sub_value"] = $this->sub_value;
$cols[] = $this->sub_column; $cols[] = $this->sub_column;
@ -370,8 +373,9 @@ class DatabaseConfig extends BaseConfig
$args["value"] =$this->values[$name]; $args["value"] =$this->values[$name];
$this->database->Execute( $this->database->Execute(
"INSERT INTO {$this->table_name} (".join(",",$cols).") VALUES (".join(",",$params).")", "INSERT INTO {$this->table_name} (".join(",", $cols).") VALUES (".join(",", $params).")",
$args); $args
);
} }
// rather than deleting and having some other request(s) do a thundering // rather than deleting and having some other request(s) do a thundering
// herd of race-conditioned updates, just save the updated version once here // herd of race-conditioned updates, just save the updated version once here

View File

@ -172,9 +172,9 @@ class Database
if (is_null($this->engine)) { if (is_null($this->engine)) {
$this->connect_engine(); $this->connect_engine();
} }
if($input===true) { if ($input===true) {
return $this->engine->BOOL_Y; return $this->engine->BOOL_Y;
} else if ($input===false) { } elseif ($input===false) {
return $this->engine->BOOL_N; return $this->engine->BOOL_N;
} }
return $input; return $input;
@ -190,13 +190,13 @@ class Database
private function count_time(string $method, float $start, string $query, ?array $args): void private function count_time(string $method, float $start, string $query, ?array $args): void
{ {
global $_tracer, $tracer_enabled; global $_tracer, $tracer_enabled;
$dur = microtime(true) - $start; $dur = microtime(true) - $start;
if($tracer_enabled) { if ($tracer_enabled) {
$query = trim(preg_replace('/^[\t ]+/m', '', $query)); // trim leading whitespace $query = trim(preg_replace('/^[\t ]+/m', '', $query)); // trim leading whitespace
$_tracer->complete($start * 1000000, $dur * 1000000, "DB Query", ["query"=>$query, "args"=>$args, "method"=>$method]); $_tracer->complete($start * 1000000, $dur * 1000000, "DB Query", ["query"=>$query, "args"=>$args, "method"=>$method]);
} }
$this->query_count++; $this->query_count++;
$this->dbtime += $dur; $this->dbtime += $dur;
} }
@ -226,7 +226,7 @@ class Database
return $stmt; return $stmt;
} catch (PDOException $pdoe) { } catch (PDOException $pdoe) {
throw new SCoreException($pdoe->getMessage()."<p><b>Query:</b> ".$query); throw new SCoreException($pdoe->getMessage()."<p><b>Query:</b> ".$query);
} }
} }
/** /**

View File

@ -1,5 +1,6 @@
<?php <?php
abstract class SCORE { abstract class SCORE
{
const AIPK = "SCORE_AIPK"; const AIPK = "SCORE_AIPK";
const INET = "SCORE_INET"; const INET = "SCORE_INET";
const BOOL_Y = "SCORE_BOOL_Y"; const BOOL_Y = "SCORE_BOOL_Y";

View File

@ -140,7 +140,7 @@ class Image
if (!$result) { if (!$result) {
$querylet = Image::build_search_querylet($tag_conditions, $img_conditions); $querylet = Image::build_search_querylet($tag_conditions, $img_conditions);
$querylet->append(new Querylet(" ORDER BY ".(Image::$order_sql ?: "images.".$config->get_string("index_order")))); $querylet->append(new Querylet(" ORDER BY ".(Image::$order_sql ?: "images.".$config->get_string("index_order"))));
if($limit!=null) { if ($limit!=null) {
$querylet->append(new Querylet(" LIMIT :limit ", ["limit" => $limit])); $querylet->append(new Querylet(" LIMIT :limit ", ["limit" => $limit]));
} }
$querylet->append(new Querylet(" OFFSET :offset ", ["offset"=>$start])); $querylet->append(new Querylet(" OFFSET :offset ", ["offset"=>$start]));
@ -228,7 +228,7 @@ class Image
$response = Image::query_accelerator($req); $response = Image::query_accelerator($req);
if ($response) { if ($response) {
$list = implode(",", $response); $list = implode(",", $response);
$result = $database->execute("SELECT * FROM images WHERE id IN ($list) ORDER BY images.id DESC"); $result = $database->execute("SELECT * FROM images WHERE id IN ($list) ORDER BY images.id DESC");
} else { } else {
$result = $database->execute("SELECT * FROM images WHERE 1=0 ORDER BY images.id DESC"); $result = $database->execute("SELECT * FROM images WHERE 1=0 ORDER BY images.id DESC");
@ -253,19 +253,19 @@ class Image
public static function query_accelerator($req) public static function query_accelerator($req)
{ {
global $_tracer; global $_tracer;
$fp = @fsockopen("127.0.0.1", 21212); $fp = @fsockopen("127.0.0.1", 21212);
if (!$fp) { if (!$fp) {
return null; return null;
} }
$req_str = json_encode($req); $req_str = json_encode($req);
$_tracer->begin("Accelerator Query", ["req"=>$req_str]); $_tracer->begin("Accelerator Query", ["req"=>$req_str]);
fwrite($fp, $req_str); fwrite($fp, $req_str);
$data = ""; $data = "";
while (($buffer = fgets($fp, 4096)) !== false) { while (($buffer = fgets($fp, 4096)) !== false) {
$data .= $buffer; $data .= $buffer;
} }
$_tracer->end(); $_tracer->end();
if (!feof($fp)) { if (!feof($fp)) {
die("Error: unexpected fgets() fail in query_accelerator($req_str)\n"); die("Error: unexpected fgets() fail in query_accelerator($req_str)\n");
} }
@ -299,7 +299,7 @@ class Image
["tag"=>$tags[0]] ["tag"=>$tags[0]]
); );
} else { } else {
if(ext_is_live("Ratings")) { if (ext_is_live("Ratings")) {
$tags[] = "rating:*"; $tags[] = "rating:*";
} }
list($tag_conditions, $img_conditions) = self::terms_to_conditions($tags); list($tag_conditions, $img_conditions) = self::terms_to_conditions($tags);
@ -833,10 +833,9 @@ class Image
$opts = $matches[2]; $opts = $matches[2];
$post = $matches[3]; $post = $matches[3];
if(isset($flexihashes[$opts])) { if (isset($flexihashes[$opts])) {
$flexihash = $flexihashes[$opts]; $flexihash = $flexihashes[$opts];
} } else {
else {
$flexihash = new Flexihash\Flexihash(); $flexihash = new Flexihash\Flexihash();
foreach (explode(",", $opts) as $opt) { foreach (explode(",", $opts) as $opt) {
$parts = explode("=", $opt); $parts = explode("=", $opt);
@ -964,7 +963,7 @@ class Image
FROM images FROM images
WHERE 1=0 WHERE 1=0
"); ");
} elseif($tag_count==1) { } elseif ($tag_count==1) {
// All wildcard terms that qualify for a single tag can be treated the same as non-wildcards // All wildcard terms that qualify for a single tag can be treated the same as non-wildcards
$positive_tag_id_array[] = $tag_ids[0]; $positive_tag_id_array[] = $tag_ids[0];
} else { } else {
@ -981,14 +980,14 @@ class Image
$sql = ""; $sql = "";
assert($positive_tag_id_array || $positive_wildcard_id_array || $negative_tag_id_array, @$_GET['q']); assert($positive_tag_id_array || $positive_wildcard_id_array || $negative_tag_id_array, @$_GET['q']);
if(!empty($positive_tag_id_array) || !empty($positive_wildcard_id_array)) { if (!empty($positive_tag_id_array) || !empty($positive_wildcard_id_array)) {
$inner_joins = []; $inner_joins = [];
if (!empty($positive_tag_id_array)) { if (!empty($positive_tag_id_array)) {
foreach($positive_tag_id_array as $tag) { foreach ($positive_tag_id_array as $tag) {
$inner_joins[] = "= $tag"; $inner_joins[] = "= $tag";
} }
} }
if(!empty($positive_wildcard_id_array)) { if (!empty($positive_wildcard_id_array)) {
foreach ($positive_wildcard_id_array as $tags) { foreach ($positive_wildcard_id_array as $tags) {
$positive_tag_id_list = join(', ', $tags); $positive_tag_id_list = join(', ', $tags);
$inner_joins[] = "IN ($positive_tag_id_list)"; $inner_joins[] = "IN ($positive_tag_id_list)";
@ -1002,12 +1001,12 @@ class Image
$i++; $i++;
$sub_query .= " INNER JOIN image_tags it$i ON it$i.image_id = it.image_id AND it$i.tag_id $inner_join "; $sub_query .= " INNER JOIN image_tags it$i ON it$i.image_id = it.image_id AND it$i.tag_id $inner_join ";
} }
if(!empty($negative_tag_id_array)) { if (!empty($negative_tag_id_array)) {
$negative_tag_id_list = join(', ', $negative_tag_id_array); $negative_tag_id_list = join(', ', $negative_tag_id_array);
$sub_query .= " LEFT JOIN image_tags negative ON negative.image_id = it.image_id AND negative.tag_id IN ($negative_tag_id_list) "; $sub_query .= " LEFT JOIN image_tags negative ON negative.image_id = it.image_id AND negative.tag_id IN ($negative_tag_id_list) ";
} }
$sub_query .= "WHERE it.tag_id $first "; $sub_query .= "WHERE it.tag_id $first ";
if(!empty($negative_tag_id_array)) { if (!empty($negative_tag_id_array)) {
$sub_query .= " AND negative.image_id IS NULL"; $sub_query .= " AND negative.image_id IS NULL";
} }
$sub_query .= " GROUP BY it.image_id "; $sub_query .= " GROUP BY it.image_id ";
@ -1018,7 +1017,7 @@ class Image
$sub_query $sub_query
) a on a.image_id = images.id ) a on a.image_id = images.id
"; ";
} elseif(!empty($negative_tag_id_array)) { } elseif (!empty($negative_tag_id_array)) {
$negative_tag_id_list = join(', ', $negative_tag_id_array); $negative_tag_id_list = join(', ', $negative_tag_id_array);
$sql = " $sql = "
SELECT images.* SELECT images.*

View File

@ -124,7 +124,7 @@ function get_thumbnail_size(int $orig_width, int $orig_height, bool $use_dpi_sca
} }
if($use_dpi_scaling) { if ($use_dpi_scaling) {
list($max_width, $max_height) = get_thumbnail_max_size_scaled(); list($max_width, $max_height) = get_thumbnail_max_size_scaled();
} else { } else {
$max_width = $config->get_int(ImageConfig::THUMB_WIDTH); $max_width = $config->get_int(ImageConfig::THUMB_WIDTH);
@ -138,7 +138,6 @@ function get_thumbnail_size(int $orig_width, int $orig_height, bool $use_dpi_sca
} else { } else {
return $output; return $output;
} }
} }
function get_scaled_by_aspect_ratio(int $original_width, int $original_height, int $max_width, int $max_height) : array function get_scaled_by_aspect_ratio(int $original_width, int $original_height, int $max_width, int $max_height) : array
@ -167,19 +166,20 @@ function get_thumbnail_max_size_scaled(): array
} }
function create_image_thumb(string $hash, string $type, string $engine = null) { function create_image_thumb(string $hash, string $type, string $engine = null)
{
global $config; global $config;
$inname = warehouse_path(Image::IMAGE_DIR, $hash); $inname = warehouse_path(Image::IMAGE_DIR, $hash);
$outname = warehouse_path(Image::THUMBNAIL_DIR, $hash); $outname = warehouse_path(Image::THUMBNAIL_DIR, $hash);
$tsize = get_thumbnail_max_size_scaled(); $tsize = get_thumbnail_max_size_scaled();
if(empty($engine)) { if (empty($engine)) {
$engine = $config->get_string(ImageConfig::THUMB_ENGINE); $engine = $config->get_string(ImageConfig::THUMB_ENGINE);
} }
$output_format = $config->get_string(ImageConfig::THUMB_TYPE); $output_format = $config->get_string(ImageConfig::THUMB_TYPE);
if($output_format=="webp") { if ($output_format=="webp") {
$output_format = Media::WEBP_LOSSY; $output_format = Media::WEBP_LOSSY;
} }
@ -206,14 +206,14 @@ function format_milliseconds(int $input): string
$remainder = floor($input / 1000); $remainder = floor($input / 1000);
foreach (TIME_UNITS AS $unit=>$conversion) { foreach (TIME_UNITS as $unit=>$conversion) {
$count = $remainder % $conversion; $count = $remainder % $conversion;
$remainder = floor($remainder / $conversion); $remainder = floor($remainder / $conversion);
if($count==0&&$remainder<1) { if ($count==0&&$remainder<1) {
break; break;
} }
$output = "$count".$unit." ".$output; $output = "$count".$unit." ".$output;
} }
return trim($output); return trim($output);
} }

View File

@ -307,14 +307,14 @@ class Page
$active_link = null; $active_link = null;
// To save on event calls, we check if one of the top-level links has already been marked as active // To save on event calls, we check if one of the top-level links has already been marked as active
foreach ($nav_links as $link) { foreach ($nav_links as $link) {
if($link->active===true) { if ($link->active===true) {
$active_link = $link; $active_link = $link;
break; break;
} }
} }
$sub_links = null; $sub_links = null;
// If one is, we just query for sub-menu options under that one tab // If one is, we just query for sub-menu options under that one tab
if($active_link!==null) { if ($active_link!==null) {
$psnbe = new PageSubNavBuildingEvent($active_link->name); $psnbe = new PageSubNavBuildingEvent($active_link->name);
send_event($psnbe); send_event($psnbe);
$sub_links = $psnbe->links; $sub_links = $psnbe->links;
@ -326,13 +326,13 @@ class Page
// Now we check for a current link so we can identify the sub-links to show // Now we check for a current link so we can identify the sub-links to show
foreach ($psnbe->links as $sub_link) { foreach ($psnbe->links as $sub_link) {
if($sub_link->active===true) { if ($sub_link->active===true) {
$sub_links = $psnbe->links; $sub_links = $psnbe->links;
break; break;
} }
} }
// If the active link has been detected, we break out // If the active link has been detected, we break out
if($sub_links!==null) { if ($sub_links!==null) {
$link->active = true; $link->active = true;
break; break;
} }
@ -372,7 +372,6 @@ class Page
header('Accept-Ranges: bytes'); header('Accept-Ranges: bytes');
if (isset($_SERVER['HTTP_RANGE'])) { if (isset($_SERVER['HTTP_RANGE'])) {
$c_start = $start; $c_start = $start;
$c_end = $end; $c_end = $end;
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2); list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
@ -418,8 +417,9 @@ class Page
// After flush, we can tell if the client browser has disconnected. // After flush, we can tell if the client browser has disconnected.
// This means we can start sending a large file, and if we detect they disappeared // This means we can start sending a large file, and if we detect they disappeared
// then we can just stop and not waste any more resources or bandwidth. // then we can just stop and not waste any more resources or bandwidth.
if (connection_status() != 0) if (connection_status() != 0) {
break; break;
}
} }
} finally { } finally {
fclose($fp); fclose($fp);
@ -541,7 +541,7 @@ class PageSubNavBuildingEvent extends Event
public function add_nav_link(string $name, Link $link, string $desc, ?bool $active = null, int $order = 50) public function add_nav_link(string $name, Link $link, string $desc, ?bool $active = null, int $order = 50)
{ {
$this->links[] = new NavLink($name, $link, $desc, $active,$order); $this->links[] = new NavLink($name, $link, $desc, $active, $order);
} }
} }
@ -553,7 +553,7 @@ class NavLink
public $order; public $order;
public $active = false; public $active = false;
public function __construct(String $name, Link $link, String $description, ?bool $active = null, int $order = 50) public function __construct(String $name, Link $link, String $description, ?bool $active = null, int $order = 50)
{ {
global $config; global $config;
@ -561,7 +561,7 @@ class NavLink
$this->link = $link; $this->link = $link;
$this->description = $description; $this->description = $description;
$this->order = $order; $this->order = $order;
if($active==null) { if ($active==null) {
$query = ltrim(_get_query(), "/"); $query = ltrim(_get_query(), "/");
if ($query === "") { if ($query === "") {
// This indicates the front page, so we check what's set as the front page // This indicates the front page, so we check what's set as the front page
@ -572,15 +572,14 @@ class NavLink
} else { } else {
$this->active = self::is_active([$link->page], $front_page); $this->active = self::is_active([$link->page], $front_page);
} }
} elseif($query===$link->page) { } elseif ($query===$link->page) {
$this->active = true; $this->active = true;
}else { } else {
$this->active = self::is_active([$link->page]); $this->active = self::is_active([$link->page]);
} }
} else { } else {
$this->active = $active; $this->active = $active;
} }
} }
public static function is_active(array $pages_matched, string $url = null): bool public static function is_active(array $pages_matched, string $url = null): bool

View File

@ -66,5 +66,4 @@ abstract class Permissions
public const VIEW_TRASH = "view_trash"; public const VIEW_TRASH = "view_trash";
public const PERFORM_BULK_ACTIONS = "perform_bulk_actions"; public const PERFORM_BULK_ACTIONS = "perform_bulk_actions";
}
}

View File

@ -759,7 +759,7 @@ function validate_input(array $inputs): array
*/ */
function sanitize_path(string $path): string function sanitize_path(string $path): string
{ {
return preg_replace('|[\\\\/]+|S',DIRECTORY_SEPARATOR,$path); return preg_replace('|[\\\\/]+|S', DIRECTORY_SEPARATOR, $path);
} }
/** /**
@ -770,11 +770,11 @@ function join_path(string ...$paths): string
{ {
$output = ""; $output = "";
foreach ($paths as $path) { foreach ($paths as $path) {
if(empty($path)) { if (empty($path)) {
continue; continue;
} }
$path = sanitize_path($path); $path = sanitize_path($path);
if(empty($output)) { if (empty($output)) {
$output = $path; $output = $path;
} else { } else {
$output = rtrim($output, DIRECTORY_SEPARATOR); $output = rtrim($output, DIRECTORY_SEPARATOR);
@ -790,8 +790,8 @@ function join_path(string ...$paths): string
*/ */
function iterator_map(callable $callback, iterator $iter): Generator function iterator_map(callable $callback, iterator $iter): Generator
{ {
foreach($iter as $i) { foreach ($iter as $i) {
yield call_user_func($callback,$i); yield call_user_func($callback, $i);
} }
} }
@ -801,4 +801,4 @@ function iterator_map(callable $callback, iterator $iter): Generator
function iterator_map_to_array(callable $callback, iterator $iter): array function iterator_map_to_array(callable $callback, iterator $iter): array
{ {
return iterator_to_array(iterator_map($callback, $iter)); return iterator_to_array(iterator_map($callback, $iter));
} }

View File

@ -26,7 +26,7 @@ function _load_event_listeners(): void
function _clear_cached_event_listeners(): void function _clear_cached_event_listeners(): void
{ {
if (file_exists(data_path("cache/shm_event_listeners.php"))) { if (file_exists(data_path("cache/shm_event_listeners.php"))) {
unlink(data_path("cache/shm_event_listeners.php")); unlink(data_path("cache/shm_event_listeners.php"));
} }
} }
@ -118,21 +118,29 @@ function send_event(Event $event): void
// send_event() is performance sensitive, and with the number // send_event() is performance sensitive, and with the number
// of times tracer gets called the time starts to add up // of times tracer gets called the time starts to add up
if ($tracer_enabled) $_tracer->begin(get_class($event)); if ($tracer_enabled) {
$_tracer->begin(get_class($event));
}
// SHIT: http://bugs.php.net/bug.php?id=35106 // SHIT: http://bugs.php.net/bug.php?id=35106
$my_event_listeners = $_shm_event_listeners[get_class($event)]; $my_event_listeners = $_shm_event_listeners[get_class($event)];
ksort($my_event_listeners); ksort($my_event_listeners);
foreach ($my_event_listeners as $listener) { foreach ($my_event_listeners as $listener) {
if ($tracer_enabled) $_tracer->begin(get_class($listener)); if ($tracer_enabled) {
$_tracer->begin(get_class($listener));
}
if (method_exists($listener, $method_name)) { if (method_exists($listener, $method_name)) {
$listener->$method_name($event); $listener->$method_name($event);
} }
if ($tracer_enabled) $_tracer->end(); if ($tracer_enabled) {
if($event->stop_processing===true) { $_tracer->end();
}
if ($event->stop_processing===true) {
break; break;
} }
} }
$_shm_event_count++; $_shm_event_count++;
if ($tracer_enabled) $_tracer->end(); if ($tracer_enabled) {
$_tracer->end();
}
} }

View File

@ -48,7 +48,6 @@ class PolyfillsTest extends \PHPUnit\Framework\TestCase
public function test_sanitize_path() public function test_sanitize_path()
{ {
$this->assertEquals( $this->assertEquals(
"one", "one",
sanitize_path("one") sanitize_path("one")
@ -88,7 +87,6 @@ class PolyfillsTest extends \PHPUnit\Framework\TestCase
DIRECTORY_SEPARATOR."one".DIRECTORY_SEPARATOR."two".DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR."one".DIRECTORY_SEPARATOR."two".DIRECTORY_SEPARATOR,
sanitize_path("\\/one/\\/\\/two\\/") sanitize_path("\\/one/\\/\\/two\\/")
); );
} }
public function test_join_path() public function test_join_path()
@ -100,22 +98,22 @@ class PolyfillsTest extends \PHPUnit\Framework\TestCase
$this->assertEquals( $this->assertEquals(
"one".DIRECTORY_SEPARATOR."two", "one".DIRECTORY_SEPARATOR."two",
join_path("one","two") join_path("one", "two")
); );
$this->assertEquals( $this->assertEquals(
"one".DIRECTORY_SEPARATOR."two".DIRECTORY_SEPARATOR."three", "one".DIRECTORY_SEPARATOR."two".DIRECTORY_SEPARATOR."three",
join_path("one","two","three") join_path("one", "two", "three")
); );
$this->assertEquals( $this->assertEquals(
"one".DIRECTORY_SEPARATOR."two".DIRECTORY_SEPARATOR."three", "one".DIRECTORY_SEPARATOR."two".DIRECTORY_SEPARATOR."three",
join_path("one/two","three") join_path("one/two", "three")
); );
$this->assertEquals( $this->assertEquals(
DIRECTORY_SEPARATOR."one".DIRECTORY_SEPARATOR."two".DIRECTORY_SEPARATOR."three".DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR."one".DIRECTORY_SEPARATOR."two".DIRECTORY_SEPARATOR."three".DIRECTORY_SEPARATOR,
join_path("\\/////\\\\one/\///"."\\//two\/\\//\\//","//\/\\\/three/\\/\/") join_path("\\/////\\\\one/\///"."\\//two\/\\//\\//", "//\/\\\/three/\\/\/")
); );
} }
} }

View File

@ -3,65 +3,63 @@ require_once "core/util.php";
class UtilTest extends \PHPUnit\Framework\TestCase class UtilTest extends \PHPUnit\Framework\TestCase
{ {
public function test_warehouse_path() public function test_warehouse_path()
{ {
$hash = "7ac19c10d6859415"; $hash = "7ac19c10d6859415";
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base",$hash), join_path(DATA_DIR, "base", $hash),
warehouse_path("base",$hash,false, 0) warehouse_path("base", $hash, false, 0)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a",$hash), join_path(DATA_DIR, "base", "7a", $hash),
warehouse_path("base",$hash,false, 1) warehouse_path("base", $hash, false, 1)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1",$hash), join_path(DATA_DIR, "base", "7a", "c1", $hash),
warehouse_path("base",$hash,false, 2) warehouse_path("base", $hash, false, 2)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1","9c",$hash), join_path(DATA_DIR, "base", "7a", "c1", "9c", $hash),
warehouse_path("base",$hash,false, 3) warehouse_path("base", $hash, false, 3)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1","9c","10",$hash), join_path(DATA_DIR, "base", "7a", "c1", "9c", "10", $hash),
warehouse_path("base",$hash,false, 4) warehouse_path("base", $hash, false, 4)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1","9c","10","d6",$hash), join_path(DATA_DIR, "base", "7a", "c1", "9c", "10", "d6", $hash),
warehouse_path("base",$hash,false, 5) warehouse_path("base", $hash, false, 5)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1","9c","10","d6","85",$hash), join_path(DATA_DIR, "base", "7a", "c1", "9c", "10", "d6", "85", $hash),
warehouse_path("base",$hash,false, 6) warehouse_path("base", $hash, false, 6)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1","9c","10","d6","85","94",$hash), join_path(DATA_DIR, "base", "7a", "c1", "9c", "10", "d6", "85", "94", $hash),
warehouse_path("base",$hash,false, 7) warehouse_path("base", $hash, false, 7)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1","9c","10","d6","85","94","15",$hash), join_path(DATA_DIR, "base", "7a", "c1", "9c", "10", "d6", "85", "94", "15", $hash),
warehouse_path("base",$hash,false, 8) warehouse_path("base", $hash, false, 8)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1","9c","10","d6","85","94","15",$hash), join_path(DATA_DIR, "base", "7a", "c1", "9c", "10", "d6", "85", "94", "15", $hash),
warehouse_path("base",$hash,false, 9) warehouse_path("base", $hash, false, 9)
); );
$this->assertEquals( $this->assertEquals(
join_path(DATA_DIR,"base","7a","c1","9c","10","d6","85","94","15",$hash), join_path(DATA_DIR, "base", "7a", "c1", "9c", "10", "d6", "85", "94", "15", $hash),
warehouse_path("base",$hash,false, 10) warehouse_path("base", $hash, false, 10)
); );
} }
} }

View File

@ -174,7 +174,7 @@ function warehouse_path(string $base, string $hash, bool $create=true, int $spli
{ {
$dirs =[DATA_DIR, $base]; $dirs =[DATA_DIR, $base];
$splits = min($splits, strlen($hash) / 2); $splits = min($splits, strlen($hash) / 2);
for($i = 0; $i < $splits; $i++) { for ($i = 0; $i < $splits; $i++) {
$dirs[] = substr($hash, $i * 2, 2); $dirs[] = substr($hash, $i * 2, 2);
} }
$dirs[] = $hash; $dirs[] = $hash;
@ -343,7 +343,7 @@ function join_url(string $base, string ...$paths)
{ {
$output = $base; $output = $base;
foreach ($paths as $path) { foreach ($paths as $path) {
$output = rtrim($output,"/"); $output = rtrim($output, "/");
$path = ltrim($path, "/"); $path = ltrim($path, "/");
$output .= "/".$path; $output .= "/".$path;
} }

View File

@ -111,7 +111,7 @@ class AdminPage extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::MANAGE_ADMINTOOLS)) { if ($user->can(Permissions::MANAGE_ADMINTOOLS)) {
$event->add_nav_link("admin", new Link('admin'), "Board Admin"); $event->add_nav_link("admin", new Link('admin'), "Board Admin");
} }

View File

@ -55,12 +55,11 @@ class AdminPageTheme extends Themelet
$html .= "<input type='submit' value='Set Tag Case'>"; $html .= "<input type='submit' value='Set Tag Case'>";
$html .= "</form>\n"; $html .= "</form>\n";
$page->add_block(new Block("Set Tag Case", $html)); $page->add_block(new Block("Set Tag Case", $html));
} }
public function dbq_html($terms) public function dbq_html($terms)
{ {
if(ext_is_live("Trash")) { if (ext_is_live("Trash")) {
$warning = "This delete method will bypass the trash<br/>"; $warning = "This delete method will bypass the trash<br/>";
} }
if (class_exists("ImageBan")) { if (class_exists("ImageBan")) {
@ -75,6 +74,4 @@ class AdminPageTheme extends Themelet
"; ";
return $html; return $html;
} }
} }

View File

@ -119,7 +119,7 @@ class AliasEditor extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="tags") { if ($event->parent=="tags") {
$event->add_nav_link("aliases", new Link('alias/list'), "Aliases", NavLink::is_active(["alias"])); $event->add_nav_link("aliases", new Link('alias/list'), "Aliases", NavLink::is_active(["alias"]));
} }
} }

View File

@ -55,7 +55,7 @@ class Artists extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Artist"; $block->header = "Artist";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();

View File

@ -38,8 +38,8 @@ class AutoComplete extends Extension
//$limit = 0; //$limit = 0;
$cache_key = "autocomplete-$s"; $cache_key = "autocomplete-$s";
$limitSQL = ""; $limitSQL = "";
$s = str_replace('_','\_', $s); $s = str_replace('_', '\_', $s);
$s = str_replace('%','\%', $s); $s = str_replace('%', '\%', $s);
$SQLarr = ["search"=>"$s%"]; #, "cat_search"=>"%:$s%"]; $SQLarr = ["search"=>"$s%"]; #, "cat_search"=>"%:$s%"];
if (isset($_GET["limit"]) && $_GET["limit"] !== 0) { if (isset($_GET["limit"]) && $_GET["limit"] !== 0) {
$limitSQL = "LIMIT :limit"; $limitSQL = "LIMIT :limit";

View File

@ -29,7 +29,7 @@ class Blocks extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::MANAGE_BLOCKS)) { if ($user->can(Permissions::MANAGE_BLOCKS)) {
$event->add_nav_link("blocks", new Link('blocks/list'), "Blocks Editor"); $event->add_nav_link("blocks", new Link('blocks/list'), "Blocks Editor");
} }

View File

@ -59,7 +59,7 @@ class Blotter extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->is_admin()) { if ($user->is_admin()) {
$event->add_nav_link("blotter", new Link('blotter/editor'), "Blotter Editor"); $event->add_nav_link("blotter", new Link('blotter/editor'), "Blotter Editor");
} }

View File

@ -22,10 +22,10 @@ class BulkActionBlockBuildingEvent extends Event
$block = ""; $block = "";
} }
if(!empty($access_key)) { if (!empty($access_key)) {
assert(strlen($access_key)==1); assert(strlen($access_key)==1);
foreach ($this->actions as $existing) { foreach ($this->actions as $existing) {
if($existing["access_key"]==$access_key) { if ($existing["access_key"]==$access_key) {
throw new SCoreException("Access key $access_key is already in use"); throw new SCoreException("Access key $access_key is already in use");
} }
} }
@ -90,18 +90,18 @@ class BulkActions extends Extension
} }
if ($user->can(Permissions::BULK_EDIT_IMAGE_TAG)) { if ($user->can(Permissions::BULK_EDIT_IMAGE_TAG)) {
$event->add_action( $event->add_action(
"bulk_tag", "bulk_tag",
"Tag", "Tag",
"t", "t",
"", "",
$this->theme->render_tag_input(), $this->theme->render_tag_input(),
10); 10
);
} }
if ($user->can(Permissions::BULK_EDIT_IMAGE_SOURCE)) { if ($user->can(Permissions::BULK_EDIT_IMAGE_SOURCE)) {
$event->add_action("bulk_source", "Set (S)ource", "s","", $this->theme->render_source_input(), 10); $event->add_action("bulk_source", "Set (S)ource", "s", "", $this->theme->render_source_input(), 10);
} }
} }
@ -186,7 +186,7 @@ class BulkActions extends Extension
foreach ($data as $id) { foreach ($data as $id) {
if (is_numeric($id)) { if (is_numeric($id)) {
$image = Image::by_id($id); $image = Image::by_id($id);
if($image!=null) { if ($image!=null) {
yield $image; yield $image;
} }
} }
@ -246,10 +246,10 @@ class BulkActions extends Extension
} }
} else { } else {
foreach ($items as $image) { foreach ($items as $image) {
$img_tags = array_map("strtolower",$image->get_tag_array()); $img_tags = array_map("strtolower", $image->get_tag_array());
if (!empty($neg_tag_array)) { if (!empty($neg_tag_array)) {
$neg_tag_array = array_map("strtolower",$neg_tag_array); $neg_tag_array = array_map("strtolower", $neg_tag_array);
$img_tags = array_merge($pos_tag_array, $img_tags); $img_tags = array_merge($pos_tag_array, $img_tags);
$img_tags = array_diff($img_tags, $neg_tag_array); $img_tags = array_diff($img_tags, $neg_tag_array);

View File

@ -166,7 +166,7 @@ class CommentList extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="comment") { if ($event->parent=="comment") {
$event->add_nav_link("comment_list", new Link('comment/list'), "All"); $event->add_nav_link("comment_list", new Link('comment/list'), "All");
$event->add_nav_link("comment_help", new Link('ext_doc/comment'), "Help"); $event->add_nav_link("comment_help", new Link('ext_doc/comment'), "Help");
} }
@ -368,7 +368,7 @@ class CommentList extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Comments"; $block->header = "Comments";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();

View File

@ -312,6 +312,5 @@ class CommentListTheme extends Themelet
<p>Returns images that have been commented on by user 123. </p> <p>Returns images that have been commented on by user 123. </p>
</div> </div>
'; ';
} }
} }

View File

@ -28,7 +28,7 @@ class ET extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::VIEW_SYSINTO)) { if ($user->can(Permissions::VIEW_SYSINTO)) {
$event->add_nav_link("system_info", new Link('system_info'), "System Info", null, 10); $event->add_nav_link("system_info", new Link('system_info'), "System Info", null, 10);
} }

View File

@ -165,7 +165,7 @@ class ExtManager extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::MANAGE_EXTENSION_LIST)) { if ($user->can(Permissions::MANAGE_EXTENSION_LIST)) {
$event->add_nav_link("ext_manager", new Link('ext_manager'), "Extension Manager"); $event->add_nav_link("ext_manager", new Link('ext_manager'), "Extension Manager");
} else { } else {

View File

@ -157,7 +157,7 @@ class Favorites extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Favorites"; $block->header = "Favorites";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();
@ -168,11 +168,11 @@ class Favorites extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent=="posts") { if ($event->parent=="posts") {
$event->add_nav_link("posts_favorites", new Link("post/list/favorited_by={$user->name}/1"), "My Favorites"); $event->add_nav_link("posts_favorites", new Link("post/list/favorited_by={$user->name}/1"), "My Favorites");
} }
if($event->parent==="user") { if ($event->parent==="user") {
if ($user->can(Permissions::MANAGE_ADMINTOOLS)) { if ($user->can(Permissions::MANAGE_ADMINTOOLS)) {
$username = url_escape($user->name); $username = url_escape($user->name);
$event->add_nav_link("favorites", new Link("post/list/favorited_by=$username/1"), "My Favorites"); $event->add_nav_link("favorites", new Link("post/list/favorited_by=$username/1"), "My Favorites");

View File

@ -56,6 +56,5 @@ class FavoritesTheme extends Themelet
<p>Returns images that have been favorited by user 123. </p> <p>Returns images that have been favorited by user 123. </p>
</div> </div>
'; ';
} }
} }

View File

@ -8,7 +8,6 @@
class FlashFileHandler extends DataHandlerExtension class FlashFileHandler extends DataHandlerExtension
{ {
public function onMediaCheckProperties(MediaCheckPropertiesEvent $event) public function onMediaCheckProperties(MediaCheckPropertiesEvent $event)
{ {
switch ($event->ext) { switch ($event->ext) {

View File

@ -12,7 +12,7 @@ class IcoFileHandler extends DataHandlerExtension
public function onMediaCheckProperties(MediaCheckPropertiesEvent $event) public function onMediaCheckProperties(MediaCheckPropertiesEvent $event)
{ {
if(in_array($event->ext, self::SUPPORTED_EXTENSIONS)) { if (in_array($event->ext, self::SUPPORTED_EXTENSIONS)) {
$event->lossless = true; $event->lossless = true;
$event->video = false; $event->video = false;
$event->audio = false; $event->audio = false;

View File

@ -17,7 +17,6 @@ class MP3FileHandler extends DataHandlerExtension
break; break;
} }
// TODO: Buff out audio format support, length scanning // TODO: Buff out audio format support, length scanning
} }
protected function create_thumb(string $hash, string $type): bool protected function create_thumb(string $hash, string $type): bool

View File

@ -13,14 +13,14 @@ class PixelFileHandler extends DataHandlerExtension
public function onMediaCheckProperties(MediaCheckPropertiesEvent $event) public function onMediaCheckProperties(MediaCheckPropertiesEvent $event)
{ {
if(in_array($event->ext, Media::LOSSLESS_FORMATS)) { if (in_array($event->ext, Media::LOSSLESS_FORMATS)) {
$event->lossless = true; $event->lossless = true;
} elseif($event->ext=="webp") { } elseif ($event->ext=="webp") {
$event->lossless = Media::is_lossless_webp($event->file_name); $event->lossless = Media::is_lossless_webp($event->file_name);
} }
if(in_array($event->ext,self::SUPPORTED_EXTENSIONS)) { if (in_array($event->ext, self::SUPPORTED_EXTENSIONS)) {
if($event->lossless==null) { if ($event->lossless==null) {
$event->lossless = false; $event->lossless = false;
} }
$event->audio = false; $event->audio = false;
@ -117,5 +117,4 @@ class PixelFileHandler extends DataHandlerExtension
</form> </form>
", 20); ", 20);
} }
} }

View File

@ -10,7 +10,6 @@ use enshrined\svgSanitize\Sanitizer;
class SVGFileHandler extends DataHandlerExtension class SVGFileHandler extends DataHandlerExtension
{ {
public function onMediaCheckProperties(MediaCheckPropertiesEvent $event) public function onMediaCheckProperties(MediaCheckPropertiesEvent $event)
{ {
switch ($event->ext) { switch ($event->ext) {

View File

@ -50,19 +50,19 @@ class VideoFileHandler extends DataHandlerExtension
public function onMediaCheckProperties(MediaCheckPropertiesEvent $event) public function onMediaCheckProperties(MediaCheckPropertiesEvent $event)
{ {
if(in_array($event->ext, self::SUPPORTED_EXT)) { if (in_array($event->ext, self::SUPPORTED_EXT)) {
$event->video = true; $event->video = true;
try { try {
$data = Media::get_ffprobe_data($event->file_name); $data = Media::get_ffprobe_data($event->file_name);
if(is_array($data)) { if (is_array($data)) {
if(array_key_exists("streams", $data)) { if (array_key_exists("streams", $data)) {
$video = false; $video = false;
$audio = true; $audio = true;
$streams = $data["streams"]; $streams = $data["streams"];
if (is_array($streams)) { if (is_array($streams)) {
foreach ($streams as $stream) { foreach ($streams as $stream) {
if(is_array($stream)) { if (is_array($stream)) {
if (array_key_exists("codec_type", $stream)) { if (array_key_exists("codec_type", $stream)) {
$type = $stream["codec_type"]; $type = $stream["codec_type"];
switch ($type) { switch ($type) {
@ -82,22 +82,20 @@ class VideoFileHandler extends DataHandlerExtension
&& is_numeric($stream["height"]) && intval($stream["height"]) > ($event->height) ?? 0) { && is_numeric($stream["height"]) && intval($stream["height"]) > ($event->height) ?? 0) {
$event->height = intval($stream["height"]); $event->height = intval($stream["height"]);
} }
} }
} }
$event->video = $video; $event->video = $video;
$event->audio = $audio; $event->audio = $audio;
} }
} }
if(array_key_exists("format", $data)&& is_array($data["format"])) { if (array_key_exists("format", $data)&& is_array($data["format"])) {
$format = $data["format"]; $format = $data["format"];
if(array_key_exists("duration", $format) && is_numeric($format["duration"])) { if (array_key_exists("duration", $format) && is_numeric($format["duration"])) {
$event->length = floor(floatval($format["duration"]) * 1000); $event->length = floor(floatval($format["duration"]) * 1000);
} }
} }
} }
} catch(MediaException $e) { } catch (MediaException $e) {
} }
} }
} }

View File

@ -14,11 +14,11 @@ class VideoFileHandlerTheme extends Themelet
$player = make_link('vendor/bower-asset/mediaelement/build/flashmediaelement.swf'); $player = make_link('vendor/bower-asset/mediaelement/build/flashmediaelement.swf');
$width="auto"; $width="auto";
if($image->width>1) { if ($image->width>1) {
$width = $image->width."px"; $width = $image->width."px";
} }
$height="auto"; $height="auto";
if($image->height>1) { if ($image->height>1) {
$height = $image->height."px"; $height = $image->height."px";
} }

View File

@ -14,7 +14,6 @@ class HelpPageListBuildingEvent extends Event
{ {
$this->pages[$key] = $name; $this->pages[$key] = $name;
} }
} }
class HelpPageBuildingEvent extends Event class HelpPageBuildingEvent extends Event
@ -27,10 +26,9 @@ class HelpPageBuildingEvent extends Event
$this->key = $key; $this->key = $key;
} }
function add_block(Block $block, int $position = 50) public function add_block(Block $block, int $position = 50)
{ {
if(!array_key_exists("$position",$this->blocks)) if (!array_key_exists("$position", $this->blocks)) {
{
$this->blocks["$position"] = []; $this->blocks["$position"] = [];
} }
$this->blocks["$position"][] = $block; $this->blocks["$position"][] = $block;
@ -55,7 +53,7 @@ class HelpPages extends Extension
} else { } else {
$name = $event->get_arg(0); $name = $event->get_arg(0);
$title = $name; $title = $name;
if(array_key_exists($name, $e->pages)) { if (array_key_exists($name, $e->pages)) {
$title = $e->pages[$name]; $title = $e->pages[$name];
} }
@ -66,7 +64,7 @@ class HelpPages extends Extension
asort($hpbe->blocks); asort($hpbe->blocks);
foreach ($hpbe->blocks as $key=>$value) { foreach ($hpbe->blocks as $key=>$value) {
foreach($value as $block) { foreach ($value as $block) {
$page->add_block($block); $page->add_block($block);
} }
} }
@ -89,6 +87,4 @@ class HelpPages extends Extension
global $user; global $user;
$event->add_link("Help", make_link("help")); $event->add_link("Help", make_link("help"));
} }
} }

View File

@ -2,7 +2,6 @@
class HelpPagesTheme extends Themelet class HelpPagesTheme extends Themelet
{ {
public function display_list_page(array $pages) public function display_list_page(array $pages)
{ {
global $page; global $page;
@ -27,5 +26,4 @@ class HelpPagesTheme extends Themelet
$page->set_title("Help - $title"); $page->set_title("Help - $title");
$page->set_heading("Help - $title"); $page->set_heading("Help - $title");
} }
} }

View File

@ -9,7 +9,8 @@
*/ */
abstract class ImageConfig { abstract class ImageConfig
{
const THUMB_ENGINE = 'thumb_engine'; const THUMB_ENGINE = 'thumb_engine';
const THUMB_WIDTH = 'thumb_width'; const THUMB_WIDTH = 'thumb_width';
const THUMB_HEIGHT = 'thumb_height'; const THUMB_HEIGHT = 'thumb_height';
@ -26,7 +27,6 @@ abstract class ImageConfig {
const COLLISION_MERGE = 'merge'; const COLLISION_MERGE = 'merge';
const COLLISION_ERROR = 'error'; const COLLISION_ERROR = 'error';
} }
/** /**
@ -34,7 +34,6 @@ abstract class ImageConfig {
*/ */
class ImageIO extends Extension class ImageIO extends Extension
{ {
const COLLISION_OPTIONS = ['Error'=>ImageConfig::COLLISION_ERROR, 'Merge'=>ImageConfig::COLLISION_MERGE]; const COLLISION_OPTIONS = ['Error'=>ImageConfig::COLLISION_ERROR, 'Merge'=>ImageConfig::COLLISION_MERGE];
const EXIF_READ_FUNCTION = "exif_read_data"; const EXIF_READ_FUNCTION = "exif_read_data";
@ -267,10 +266,9 @@ class ImageIO extends Extension
try { try {
Media::update_image_media_properties($image->hash, strtolower($image->ext)); Media::update_image_media_properties($image->hash, strtolower($image->ext));
} catch(MediaException $e) { } catch (MediaException $e) {
log_warning("add_image","Error while running update_image_media_properties: ".$e->getMessage()); log_warning("add_image", "Error while running update_image_media_properties: ".$e->getMessage());
} }
} }
// }}} end add // }}} end add
@ -349,7 +347,7 @@ class ImageIO extends Extension
$duplicate = Image::by_hash($image->hash); $duplicate = Image::by_hash($image->hash);
if(!is_null($duplicate) && $duplicate->id!=$id) { if (!is_null($duplicate) && $duplicate->id!=$id) {
$error = "Image <a href='" . make_link("post/view/{$duplicate->id}") . "'>{$duplicate->id}</a> " . $error = "Image <a href='" . make_link("post/view/{$duplicate->id}") . "'>{$duplicate->id}</a> " .
"already has hash {$image->hash}:<p>" . $this->theme->build_thumb_html($duplicate); "already has hash {$image->hash}:<p>" . $this->theme->build_thumb_html($duplicate);
throw new ImageReplaceException($error); throw new ImageReplaceException($error);
@ -388,8 +386,8 @@ class ImageIO extends Extension
try { try {
Media::update_image_media_properties($image->hash, $image->ext); Media::update_image_media_properties($image->hash, $image->ext);
} catch(MediaException $e) { } catch (MediaException $e) {
log_warning("image_replace","Error while running update_image_media_properties: ".$e->getMessage()); log_warning("image_replace", "Error while running update_image_media_properties: ".$e->getMessage());
} }
/* Generate new thumbnail */ /* Generate new thumbnail */

View File

@ -106,7 +106,7 @@ class ImageBan extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::BAN_IMAGE)) { if ($user->can(Permissions::BAN_IMAGE)) {
$event->add_nav_link("image_bans", new Link('image_hash_ban/list/1'), "Image Bans", NavLink::is_active(["image_hash_ban"])); $event->add_nav_link("image_bans", new Link('image_hash_ban/list/1'), "Image Bans", NavLink::is_active(["image_hash_ban"]));
} }

View File

@ -262,10 +262,13 @@ class Index extends Extension
if (SPEED_HAX) { if (SPEED_HAX) {
if (!$user->can("big_search")) { if (!$user->can("big_search")) {
$fast_page_limit = 500; $fast_page_limit = 500;
if ($total_pages > $fast_page_limit) $total_pages = $fast_page_limit; if ($total_pages > $fast_page_limit) {
$total_pages = $fast_page_limit;
}
if ($page_number > $fast_page_limit) { if ($page_number > $fast_page_limit) {
$this->theme->display_error( $this->theme->display_error(
404, "Search limit hit", 404,
"Search limit hit",
"Only $fast_page_limit pages of results are searchable - " . "Only $fast_page_limit pages of results are searchable - " .
"if you want to find older results, use more specific search terms" "if you want to find older results, use more specific search terms"
); );
@ -334,19 +337,19 @@ class Index extends Extension
public function onPageNavBuilding(PageNavBuildingEvent $event) public function onPageNavBuilding(PageNavBuildingEvent $event)
{ {
$event->add_nav_link("posts", new Link('post/list'), "Posts", NavLink::is_active(["post","view"]),20); $event->add_nav_link("posts", new Link('post/list'), "Posts", NavLink::is_active(["post","view"]), 20);
} }
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="posts") { if ($event->parent=="posts") {
$event->add_nav_link("posts_all", new Link('post/list'), "All"); $event->add_nav_link("posts_all", new Link('post/list'), "All");
} }
} }
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "General"; $block->header = "General";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();

View File

@ -339,6 +339,5 @@ and of course start organising your images :-)
</ul> </ul>
</p> </p>
'; ';
} }
} }

View File

@ -108,7 +108,7 @@ class IPBan extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::BAN_IP)) { if ($user->can(Permissions::BAN_IP)) {
$event->add_nav_link("ip_bans", new Link('ip_ban/list'), "IP Bans", NavLink::is_active(["ip_ban"])); $event->add_nav_link("ip_bans", new Link('ip_ban/list'), "IP Bans", NavLink::is_active(["ip_ban"]));
} }

View File

@ -123,7 +123,7 @@ class LogDatabase extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::VIEW_EVENTLOG)) { if ($user->can(Permissions::VIEW_EVENTLOG)) {
$event->add_nav_link("event_log", new Link('log/view'), "Event Log"); $event->add_nav_link("event_log", new Link('log/view'), "Event Log");
} }

View File

@ -18,7 +18,6 @@ abstract class MediaConfig
const CONVERT_PATH = "media_convert_path"; const CONVERT_PATH = "media_convert_path";
const VERSION = "ext_media_version"; const VERSION = "ext_media_version";
const MEM_LIMIT = 'media_mem_limit'; const MEM_LIMIT = 'media_mem_limit';
} }
abstract class MediaEngine abstract class MediaEngine
@ -105,14 +104,19 @@ class MediaResizeEvent extends Event
public $ignore_aspect_ratio; public $ignore_aspect_ratio;
public $allow_upscale; public $allow_upscale;
public function __construct(String $engine, string $input_path, string $input_type, string $output_path, public function __construct(
int $target_width, int $target_height, String $engine,
bool $ignore_aspect_ratio = false, string $input_path,
string $target_format = null, string $input_type,
int $target_quality = 80, string $output_path,
bool $minimize = false, int $target_width,
bool $allow_upscale = true) int $target_height,
{ bool $ignore_aspect_ratio = false,
string $target_format = null,
int $target_quality = 80,
bool $minimize = false,
bool $allow_upscale = true
) {
assert(in_array($engine, MediaEngine::ALL)); assert(in_array($engine, MediaEngine::ALL));
$this->engine = $engine; $this->engine = $engine;
$this->input_path = $input_path; $this->input_path = $input_path;
@ -144,7 +148,6 @@ class MediaCheckPropertiesEvent extends Event
$this->file_name = $file_name; $this->file_name = $file_name;
$this->ext = $ext; $this->ext = $ext;
} }
} }
@ -193,7 +196,7 @@ class Media extends Extension
[0x52, 0x49, 0x46, 0x46, null, null, null, null, 0x57, 0x45, 0x42, 0x50, 0x56, 0x50, 0x38, 0x4C]; [0x52, 0x49, 0x46, 0x46, null, null, null, null, 0x57, 0x45, 0x42, 0x50, 0x56, 0x50, 0x38, 0x4C];
static function imagick_available(): bool public static function imagick_available(): bool
{ {
return extension_loaded("imagick"); return extension_loaded("imagick");
} }
@ -293,7 +296,6 @@ class Media extends Extension
$sb->end_table(); $sb->end_table();
$event->panel->add_block($sb); $event->panel->add_block($sb);
} }
public function onAdminBuilding(AdminBuildingEvent $event) public function onAdminBuilding(AdminBuildingEvent $event)
@ -375,7 +377,8 @@ class Media extends Extension
$event->target_format, $event->target_format,
$event->ignore_aspect_ratio, $event->ignore_aspect_ratio,
$event->target_quality, $event->target_quality,
$event->allow_upscale); $event->allow_upscale
);
break; break;
case MediaEngine::IMAGICK: case MediaEngine::IMAGICK:
@ -391,7 +394,8 @@ class Media extends Extension
$event->ignore_aspect_ratio, $event->ignore_aspect_ratio,
$event->target_quality, $event->target_quality,
$event->minimize, $event->minimize,
$event->allow_upscale); $event->allow_upscale
);
//} //}
break; break;
default: default:
@ -421,7 +425,7 @@ class Media extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Media"; $block->header = "Media";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();
@ -480,7 +484,8 @@ class Media extends Extension
"video" => $database->scoresql_value_prepare($mcpe->video), "video" => $database->scoresql_value_prepare($mcpe->video),
"audio" => $database->scoresql_value_prepare($mcpe->audio), "audio" => $database->scoresql_value_prepare($mcpe->audio),
"length" => $mcpe->length "length" => $mcpe->length
]); ]
);
} }
public function get_images(String $ext = null) public function get_images(String $ext = null)
@ -736,11 +741,12 @@ class Media extends Extension
// } // }
// } // }
public static function is_lossless(string $filename, string $format) { public static function is_lossless(string $filename, string $format)
if(in_array($format, self::LOSSLESS_FORMATS)) { {
if (in_array($format, self::LOSSLESS_FORMATS)) {
return true; return true;
} }
switch($format) { switch ($format) {
case "webp": case "webp":
return self::is_lossless_webp($filename); return self::is_lossless_webp($filename);
break; break;
@ -759,8 +765,7 @@ class Media extends Extension
int $output_quality = 80, int $output_quality = 80,
bool $minimize = false, bool $minimize = false,
bool $allow_upscale = true bool $allow_upscale = true
): void ): void {
{
global $config; global $config;
$convert = $config->get_string(MediaConfig::CONVERT_PATH); $convert = $config->get_string(MediaConfig::CONVERT_PATH);
@ -773,7 +778,7 @@ class Media extends Extension
$output_type = $input_type; $output_type = $input_type;
} }
if($output_type=="webp" && self::is_lossless($input_path, $input_type)) { if ($output_type=="webp" && self::is_lossless($input_path, $input_type)) {
$output_type = self::WEBP_LOSSLESS; $output_type = self::WEBP_LOSSLESS;
} }
@ -847,8 +852,7 @@ class Media extends Extension
bool $ignore_aspect_ratio = false, bool $ignore_aspect_ratio = false,
int $output_quality = 80, int $output_quality = 80,
bool $allow_upscale = true bool $allow_upscale = true
) ) {
{
$width = $info[0]; $width = $info[0];
$height = $info[1]; $height = $info[1];
@ -949,16 +953,16 @@ class Media extends Extension
// Actually resize the image. // Actually resize the image.
if (imagecopyresampled( if (imagecopyresampled(
$image_resized, $image_resized,
$image, $image,
0, 0,
0, 0,
0, 0,
0, 0,
$new_width, $new_width,
$new_height, $new_height,
$width, $width,
$height $height
) === false) { ) === false) {
throw new MediaException("Unable to copy resized image data to new image"); throw new MediaException("Unable to copy resized image data to new image");
} }
@ -1047,7 +1051,6 @@ class Media extends Extension
} else { } else {
throw new MediaException("Unable to open file for byte check: $file_name"); throw new MediaException("Unable to open file for byte check: $file_name");
} }
} }
public static function is_animated_webp(String $image_filename): bool public static function is_animated_webp(String $image_filename): bool
@ -1091,7 +1094,7 @@ class Media extends Extension
* @param $format * @param $format
* @return string|null The format name that the media extension will recognize. * @return string|null The format name that the media extension will recognize.
*/ */
static public function normalize_format(string $format, ?bool $lossless = null): ?string public static function normalize_format(string $format, ?bool $lossless = null): ?string
{ {
if ($format == "webp") { if ($format == "webp") {
if ($lossless === true) { if ($lossless === true) {
@ -1114,7 +1117,7 @@ class Media extends Extension
* @param string $filename * @param string $filename
* @return array [width, height] * @return array [width, height]
*/ */
static public function video_size(string $filename): array public static function video_size(string $filename): array
{ {
global $config; global $config;
$ffmpeg = $config->get_string(MediaConfig::FFMPEG_PATH); $ffmpeg = $config->get_string(MediaConfig::FFMPEG_PATH);
@ -1139,5 +1142,4 @@ class Media extends Extension
log_debug('Media', "Getting video size with `$cmd`, returns $output -- $size[0], $size[1]"); log_debug('Media', "Getting video size with `$cmd`, returns $output -- $size[0], $size[1]");
return $size; return $size;
} }
} }

View File

@ -42,6 +42,5 @@ class MediaTheme extends Themelet
</div> </div>
<p>These search terms depend on the items being scanned for media content. Automatic scanning was implemented in mid-2019, so items uploaded before, or items uploaded on a system without ffmpeg, will require additional scanning before this will work.</p> <p>These search terms depend on the items being scanned for media content. Automatic scanning was implemented in mid-2019, so items uploaded before, or items uploaded on a system without ffmpeg, will require additional scanning before this will work.</p>
'; ';
} }
} }

View File

@ -61,7 +61,7 @@ class NotATag extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="tags") { if ($event->parent==="tags") {
if ($user->can(Permissions::BAN_IMAGE)) { if ($user->can(Permissions::BAN_IMAGE)) {
$event->add_nav_link("untags", new Link('untag/list/1'), "UnTags"); $event->add_nav_link("untags", new Link('untag/list/1'), "UnTags");
} }

View File

@ -218,7 +218,7 @@ class Notes extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Notes"; $block->header = "Notes";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();

View File

@ -269,7 +269,5 @@ class NotesTheme extends Themelet
<p>Returns images with note(s) by user 123.</p> <p>Returns images with note(s) by user 123.</p>
</div> </div>
'; ';
} }
} }

View File

@ -230,7 +230,7 @@ class NumericScore extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Numeric Score"; $block->header = "Numeric Score";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();
@ -306,11 +306,10 @@ class NumericScore extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="posts") { if ($event->parent=="posts") {
$event->add_nav_link("numeric_score_day", new Link('popular_by_day'), "Popular by Day"); $event->add_nav_link("numeric_score_day", new Link('popular_by_day'), "Popular by Day");
$event->add_nav_link("numeric_score_month", new Link('popular_by_month'), "Popular by Month"); $event->add_nav_link("numeric_score_month", new Link('popular_by_month'), "Popular by Month");
$event->add_nav_link("numeric_score_year", new Link('popular_by_year'), "Popular by Year"); $event->add_nav_link("numeric_score_year", new Link('popular_by_year'), "Popular by Year");
} }
} }

View File

@ -132,6 +132,5 @@ class NumericScoreTheme extends Themelet
<p>Sorts the search results by score, ascending.</p> <p>Sorts the search results by score, ascending.</p>
</div> </div>
'; ';
} }
} }

View File

@ -96,7 +96,7 @@ class PrivMsg extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="user") { if ($event->parent==="user") {
if (!$user->is_anonymous()) { if (!$user->is_anonymous()) {
$count = $this->count_pms($user); $count = $this->count_pms($user);
$h_count = $count > 0 ? " <span class='unread'>($count)</span>" : ""; $h_count = $count > 0 ? " <span class='unread'>($count)</span>" : "";

View File

@ -46,7 +46,6 @@ class PoolAddPostsEvent extends Event
$this->pool_id = $pool_id; $this->pool_id = $pool_id;
$this->posts = $posts; $this->posts = $posts;
} }
} }
class PoolCreationEvent extends Event class PoolCreationEvent extends Event
@ -67,7 +66,6 @@ class PoolCreationEvent extends Event
$this->public = $public; $this->public = $public;
$this->description = $description; $this->description = $description;
} }
} }
class Pools extends Extension class Pools extends Extension
@ -152,7 +150,7 @@ class Pools extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="pool") { if ($event->parent=="pool") {
$event->add_nav_link("pool_list", new Link('pool/list'), "List"); $event->add_nav_link("pool_list", new Link('pool/list'), "List");
$event->add_nav_link("pool_new", new Link('pool/new'), "Create"); $event->add_nav_link("pool_new", new Link('pool/new'), "Create");
$event->add_nav_link("pool_updated", new Link('pool/updated'), "Changes"); $event->add_nav_link("pool_updated", new Link('pool/updated'), "Changes");
@ -198,7 +196,8 @@ class Pools extends Extension
$title, $title,
$user, $user,
$_POST["public"] === "Y", $_POST["public"] === "Y",
$_POST["description"]); $_POST["description"]
);
send_event($event); send_event($event);
$page->set_mode(PageMode::REDIRECT); $page->set_mode(PageMode::REDIRECT);
@ -374,7 +373,7 @@ class Pools extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Pools"; $block->header = "Pools";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();
@ -443,8 +442,8 @@ class Pools extends Extension
$pools = $database->get_all("SELECT * FROM pools ORDER BY title "); $pools = $database->get_all("SELECT * FROM pools ORDER BY title ");
$event->add_action("bulk_pool_add_existing", "Add To (P)ool", "p","", $this->theme->get_bulk_pool_selector($pools)); $event->add_action("bulk_pool_add_existing", "Add To (P)ool", "p", "", $this->theme->get_bulk_pool_selector($pools));
$event->add_action("bulk_pool_add_new", "Create Pool", "","", $this->theme->get_bulk_pool_input($event->search_terms)); $event->add_action("bulk_pool_add_new", "Create Pool", "", "", $this->theme->get_bulk_pool_input($event->search_terms));
} }
public function onBulkAction(BulkActionEvent $event) public function onBulkAction(BulkActionEvent $event)
@ -461,7 +460,8 @@ class Pools extends Extension
if ($this->have_permission($user, $pool)) { if ($this->have_permission($user, $pool)) {
send_event( send_event(
new PoolAddPostsEvent($pool_id,iterator_map_to_array("image_to_id", $event->items))); new PoolAddPostsEvent($pool_id, iterator_map_to_array("image_to_id", $event->items))
);
} }
break; break;
case "bulk_pool_add_new": case "bulk_pool_add_new":
@ -809,7 +809,7 @@ class Pools extends Extension
if (ext_is_live("Ratings")) { if (ext_is_live("Ratings")) {
$query .= "AND i.rating IN (".Ratings::privs_to_sql(Ratings::get_user_class_privs($user)).")"; $query .= "AND i.rating IN (".Ratings::privs_to_sql(Ratings::get_user_class_privs($user)).")";
} }
if(ext_is_live("trash")) { if (ext_is_live("trash")) {
$query .= $database->scoreql_to_sql(" AND trash = SCORE_BOOL_N "); $query .= $database->scoreql_to_sql(" AND trash = SCORE_BOOL_N ");
} }
@ -823,10 +823,10 @@ class Pools extends Extension
); );
$totalPages = ceil($database->get_one( $totalPages = ceil($database->get_one(
" "
SELECT COUNT(*) FROM pool_images p SELECT COUNT(*) FROM pool_images p
$query", $query",
["pid" => $poolID] ["pid" => $poolID]
) / $imagesPerPage); ) / $imagesPerPage);

View File

@ -401,7 +401,7 @@ class PoolsTheme extends Themelet
public function get_bulk_pool_input(array $search_terms) public function get_bulk_pool_input(array $search_terms)
{ {
return "<input type='text' name='bulk_pool_new' placeholder='New pool' required='required' value='".(implode(" ",$search_terms))."' />"; return "<input type='text' name='bulk_pool_new' placeholder='New pool' required='required' value='".(implode(" ", $search_terms))."' />";
} }
@ -429,6 +429,5 @@ class PoolsTheme extends Themelet
<p>Returns images in the "swimming pool" pool. Note that the underscore becomes a space</p> <p>Returns images in the "swimming pool" pool. Note that the underscore becomes a space</p>
</div> </div>
'; ';
} }
} }

View File

@ -6,4 +6,4 @@ abstract class PostTitlesConfig
public const VERSION = "ext_post_titles_version"; public const VERSION = "ext_post_titles_version";
public const DEFAULT_TO_FILENAME = "post_titles_default_to_filename"; public const DEFAULT_TO_FILENAME = "post_titles_default_to_filename";
public const SHOW_IN_WINDOW_TITLE = "post_titles_show_in_window_title"; public const SHOW_IN_WINDOW_TITLE = "post_titles_show_in_window_title";
} }

View File

@ -10,4 +10,4 @@ class PostTitleSetEvent extends Event
$this->image = $image; $this->image = $image;
$this->title = $title; $this->title = $title;
} }
} }

View File

@ -42,7 +42,7 @@ class PostTitles extends Extension
{ {
global $config; global $config;
if($config->get_bool(PostTitlesConfig::SHOW_IN_WINDOW_TITLE)) { if ($config->get_bool(PostTitlesConfig::SHOW_IN_WINDOW_TITLE)) {
$event->set_title(self::get_title($event->get_image())); $event->set_title(self::get_title($event->get_image()));
} }
} }
@ -73,8 +73,8 @@ class PostTitles extends Extension
{ {
$sb = new SetupBlock("Post Titles"); $sb = new SetupBlock("Post Titles");
$sb->start_table(); $sb->start_table();
$sb->add_bool_option(PostTitlesConfig::DEFAULT_TO_FILENAME,"Default to filename", true); $sb->add_bool_option(PostTitlesConfig::DEFAULT_TO_FILENAME, "Default to filename", true);
$sb->add_bool_option(PostTitlesConfig::SHOW_IN_WINDOW_TITLE,"Show in window title", true); $sb->add_bool_option(PostTitlesConfig::SHOW_IN_WINDOW_TITLE, "Show in window title", true);
$sb->end_table(); $sb->end_table();
$event->panel->add_block($sb); $event->panel->add_block($sb);
@ -94,9 +94,9 @@ class PostTitles extends Extension
global $config; global $config;
$title = $image->title??""; $title = $image->title??"";
if(empty($title) && $config->get_bool(PostTitlesConfig::DEFAULT_TO_FILENAME)) { if (empty($title) && $config->get_bool(PostTitlesConfig::DEFAULT_TO_FILENAME)) {
$info = pathinfo($image->filename); $info = pathinfo($image->filename);
if(array_key_exists("extension",$info)) { if (array_key_exists("extension", $info)) {
$title = basename($image->filename, '.' . $info['extension']); $title = basename($image->filename, '.' . $info['extension']);
} else { } else {
$title = $image->filename; $title = $image->filename;

View File

@ -3,8 +3,6 @@ class PostTitlesTheme extends Themelet
{ {
public function get_title_set_html(string $title, bool $can_set): string public function get_title_set_html(string $title, bool $can_set): string
{ {
$html = " $html = "
<tr> <tr>
<th>Title</th> <th>Title</th>

View File

@ -78,7 +78,7 @@ class RandomImage extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="posts") { if ($event->parent=="posts") {
$event->add_nav_link("posts_random", new Link('random_image/view'), "Random Image"); $event->add_nav_link("posts_random", new Link('random_image/view'), "Random Image");
} }
} }

View File

@ -77,7 +77,7 @@ class RandomList extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="posts") { if ($event->parent=="posts") {
$event->add_nav_link("posts_random", new Link('random'), "Shuffle"); $event->add_nav_link("posts_random", new Link('random'), "Shuffle");
} }
} }

View File

@ -25,7 +25,8 @@
global $_shm_ratings; global $_shm_ratings;
$_shm_ratings = []; $_shm_ratings = [];
class ImageRating { class ImageRating
{
/** /**
* @var string * @var string
*/ */
@ -46,9 +47,9 @@ class ImageRating {
*/ */
public $order = 0; public $order = 0;
public function __construct( string $code, string $name, string $search_term, int $order) public function __construct(string $code, string $name, string $search_term, int $order)
{ {
if(strlen($code)!=1) { if (strlen($code)!=1) {
throw new Exception("Rating code must be exactly one character"); throw new Exception("Rating code must be exactly one character");
} }
@ -56,29 +57,30 @@ class ImageRating {
$this->code = $code; $this->code = $code;
$this->search_term = $search_term; $this->search_term = $search_term;
$this->order = $order; $this->order = $order;
} }
} }
function clear_ratings() { function clear_ratings()
{
global $_shm_ratings; global $_shm_ratings;
$keys = array_keys($_shm_ratings); $keys = array_keys($_shm_ratings);
foreach ($keys as $key){ foreach ($keys as $key) {
if($key=="?") { if ($key=="?") {
continue; continue;
} }
unset($_shm_ratings[$key]); unset($_shm_ratings[$key]);
} }
} }
function add_rating(ImageRating $rating) { function add_rating(ImageRating $rating)
{
global $_shm_ratings; global $_shm_ratings;
if($rating->code=="?"&&array_key_exists("?",$_shm_ratings)) { if ($rating->code=="?"&&array_key_exists("?", $_shm_ratings)) {
throw new Exception("? is a reserved rating code that cannot be overridden"); throw new Exception("? is a reserved rating code that cannot be overridden");
} }
if($rating->code!="?"&&in_array(strtolower($rating->search_term), Ratings::UNRATED_KEYWORDS)) { if ($rating->code!="?"&&in_array(strtolower($rating->search_term), Ratings::UNRATED_KEYWORDS)) {
throw new Exception("$rating->search_term is a reserved search term"); throw new Exception("$rating->search_term is a reserved search term");
} }
@ -110,7 +112,8 @@ class RatingSetEvent extends Event
} }
} }
abstract class RatingsConfig { abstract class RatingsConfig
{
const VERSION = "ext_ratings2_version"; const VERSION = "ext_ratings2_version";
const USER_DEFAULTS = "ratings_default"; const USER_DEFAULTS = "ratings_default";
} }
@ -136,7 +139,7 @@ class Ratings extends Extension
array_push($search_terms, $rating->search_term); array_push($search_terms, $rating->search_term);
} }
$this->search_regexp = "/^rating[=|:](?:(\*|[" . $codes . "]+)|(" . $this->search_regexp = "/^rating[=|:](?:(\*|[" . $codes . "]+)|(" .
implode("|", $search_terms) . "|".implode("|",self::UNRATED_KEYWORDS)."))$/D"; implode("|", $search_terms) . "|".implode("|", self::UNRATED_KEYWORDS)."))$/D";
} }
public function get_priority(): int public function get_priority(): int
@ -160,7 +163,8 @@ class Ratings extends Extension
} }
} }
public function onInitUserConfig(InitUserConfigEvent $event) { public function onInitUserConfig(InitUserConfigEvent $event)
{
$event->user_config->set_default_array(RatingsConfig::USER_DEFAULTS, self::get_user_class_privs($event->user)); $event->user_config->set_default_array(RatingsConfig::USER_DEFAULTS, self::get_user_class_privs($event->user));
} }
@ -169,9 +173,12 @@ class Ratings extends Extension
global $user, $user_config; global $user, $user_config;
$event->add__html( $event->add__html(
$this->theme->get_user_options($user, $this->theme->get_user_options(
$user,
self::get_user_default_ratings($user), self::get_user_default_ratings($user),
self::get_user_class_privs($user))); self::get_user_class_privs($user)
)
);
} }
public function onSetupBuilding(SetupBuildingEvent $event) public function onSetupBuilding(SetupBuildingEvent $event)
@ -254,7 +261,7 @@ class Ratings extends Extension
{ {
global $user; global $user;
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Ratings"; $block->header = "Ratings";
@ -279,7 +286,7 @@ class Ratings extends Extension
if (preg_match($this->search_regexp, strtolower($event->term), $matches)) { if (preg_match($this->search_regexp, strtolower($event->term), $matches)) {
$ratings = $matches[1] ? $matches[1] : $matches[2][0]; $ratings = $matches[1] ? $matches[1] : $matches[2][0];
if(count($matches)>2&&in_array($matches[2], self::UNRATED_KEYWORDS)) { if (count($matches)>2&&in_array($matches[2], self::UNRATED_KEYWORDS)) {
$ratings = "?"; $ratings = "?";
} }
@ -302,7 +309,7 @@ class Ratings extends Extension
if (preg_match($this->search_regexp, strtolower($event->term), $matches) && $event->parse) { if (preg_match($this->search_regexp, strtolower($event->term), $matches) && $event->parse) {
$ratings = $matches[1] ? $matches[1] : $matches[2][0]; $ratings = $matches[1] ? $matches[1] : $matches[2][0];
if(count($matches)>2&&in_array($matches[2], self::UNRATED_KEYWORDS)) { if (count($matches)>2&&in_array($matches[2], self::UNRATED_KEYWORDS)) {
$ratings = "?"; $ratings = "?";
} }
@ -348,16 +355,16 @@ class Ratings extends Extension
switch ($action) { switch ($action) {
case "update_ratings": case "update_ratings":
$event->redirect = true; $event->redirect = true;
if(!array_key_exists("rating_old", $_POST) || empty($_POST["rating_old"])) { if (!array_key_exists("rating_old", $_POST) || empty($_POST["rating_old"])) {
return; return;
} }
if(!array_key_exists("rating_new", $_POST) || empty($_POST["rating_new"])) { if (!array_key_exists("rating_new", $_POST) || empty($_POST["rating_new"])) {
return; return;
} }
$old = $_POST["rating_old"]; $old = $_POST["rating_old"];
$new = $_POST["rating_new"]; $new = $_POST["rating_new"];
if($user->can("bulk_edit_image_rating")) { if ($user->can("bulk_edit_image_rating")) {
$database->execute("UPDATE images SET rating = :new WHERE rating = :old", ["new"=>$new, "old"=>$old ]); $database->execute("UPDATE images SET rating = :new WHERE rating = :old", ["new"=>$new, "old"=>$old ]);
} }
@ -371,7 +378,7 @@ class Ratings extends Extension
global $user; global $user;
if ($user->can(Permissions::BULK_EDIT_IMAGE_RATING)) { if ($user->can(Permissions::BULK_EDIT_IMAGE_RATING)) {
$event->add_action("bulk_rate", "Set (R)ating", "r","", $this->theme->get_selection_rater_html(["?"])); $event->add_action("bulk_rate", "Set (R)ating", "r", "", $this->theme->get_selection_rater_html(["?"]));
} }
} }
@ -455,7 +462,6 @@ class Ratings extends Extension
break; break;
} }
} }
} }
public static function get_sorted_ratings(): array public static function get_sorted_ratings(): array
@ -490,10 +496,10 @@ class Ratings extends Extension
public static function privs_to_sql(array $privs): string public static function privs_to_sql(array $privs): string
{ {
$arr = []; $arr = [];
foreach($privs as $i) { foreach ($privs as $i) {
$arr[] = "'" . $i . "'"; $arr[] = "'" . $i . "'";
} }
if(sizeof($arr)==0) { if (sizeof($arr)==0) {
return "' '"; return "' '";
} }
$set = join(', ', $arr); $set = join(', ', $arr);
@ -504,7 +510,7 @@ class Ratings extends Extension
{ {
global $_shm_ratings; global $_shm_ratings;
if(array_key_exists($rating, $_shm_ratings)) { if (array_key_exists($rating, $_shm_ratings)) {
return $_shm_ratings[$rating]->name; return $_shm_ratings[$rating]->name;
} }
return "Unknown"; return "Unknown";
@ -557,7 +563,7 @@ class Ratings extends Extension
$config->set_int(RatingsConfig::VERSION, 2); $config->set_int(RatingsConfig::VERSION, 2);
} }
if($config->get_int(RatingsConfig::VERSION) < 3) { if ($config->get_int(RatingsConfig::VERSION) < 3) {
$database->Execute("UPDATE images SET rating = 'u' WHERE rating is null"); $database->Execute("UPDATE images SET rating = 'u' WHERE rating is null");
switch ($database->get_driver_name()) { switch ($database->get_driver_name()) {
case DatabaseDriver::MYSQL: case DatabaseDriver::MYSQL:
@ -568,20 +574,20 @@ class Ratings extends Extension
$database->Execute("ALTER TABLE images ALTER COLUMN rating SET NOT NULL"); $database->Execute("ALTER TABLE images ALTER COLUMN rating SET NOT NULL");
break; break;
} }
$config->set_int(RatingsConfig::VERSION, 3); $config->set_int(RatingsConfig::VERSION, 3);
} }
if ($config->get_int(RatingsConfig::VERSION) < 4) { if ($config->get_int(RatingsConfig::VERSION) < 4) {
$value = $config->get_string("ext_rating_anon_privs"); $value = $config->get_string("ext_rating_anon_privs");
if(!empty($value)) { if (!empty($value)) {
$config->set_array("ext_rating_anonymous_privs", str_split($value)); $config->set_array("ext_rating_anonymous_privs", str_split($value));
} }
$value = $config->get_string("ext_rating_user_privs"); $value = $config->get_string("ext_rating_user_privs");
if(!empty($value)) { if (!empty($value)) {
$config->set_array("ext_rating_user_privs", str_split($value)); $config->set_array("ext_rating_user_privs", str_split($value));
} }
$value = $config->get_string("ext_rating_admin_privs"); $value = $config->get_string("ext_rating_admin_privs");
if(!empty($value)) { if (!empty($value)) {
$config->set_array("ext_rating_admin_privs", str_split($value)); $config->set_array("ext_rating_admin_privs", str_split($value));
} }

View File

@ -30,9 +30,9 @@ class RatingsTheme extends Themelet
$html = make_form(make_link("admin/update_ratings"))."<table class='form'><tr> $html = make_form(make_link("admin/update_ratings"))."<table class='form'><tr>
<th>Change</th><td><select name='rating_old' required='required'><option></option>"; <th>Change</th><td><select name='rating_old' required='required'><option></option>";
foreach ($current_ratings as $key=>$value) { foreach ($current_ratings as $key=>$value) {
$html .= "<option value='$key'>$value</option>"; $html .= "<option value='$key'>$value</option>";
} }
$html .= "</select></td></tr> $html .= "</select></td></tr>
<tr><th>To</th><td><select name='rating_new' required='required'><option></option>"; <tr><th>To</th><td><select name='rating_new' required='required'><option></option>";
foreach ($available_ratings as $value) { foreach ($available_ratings as $value) {
@ -50,37 +50,38 @@ class RatingsTheme extends Themelet
// { // {
// global $page; // global $page;
// $html = " // $html = "
// ".make_form(make_link("admin/bulk_rate"))." // ".make_form(make_link("admin/bulk_rate"))."
// <input type='hidden' name='query' value='".html_escape($terms)."'> // <input type='hidden' name='query' value='".html_escape($terms)."'>
// <select name='rating'> // <select name='rating'>
// <option value='s'>Safe</option> // <option value='s'>Safe</option>
// <option value='q'>Questionable</option> // <option value='q'>Questionable</option>
// <option value='e'>Explicit</option> // <option value='e'>Explicit</option>
// <option value='u'>Unrated</option> // <option value='u'>Unrated</option>
// </select> // </select>
// <input type='submit' value='Go'> // <input type='submit' value='Go'>
// </form> // </form>
// "; // ";
// $page->add_block(new Block("List Controls", $html, "left")); // $page->add_block(new Block("List Controls", $html, "left"));
// } // }
public function get_selection_rater_html(array $selected_options, bool $multiple = false, array $available_options = null) { public function get_selection_rater_html(array $selected_options, bool $multiple = false, array $available_options = null)
{
global $_shm_ratings; global $_shm_ratings;
$output = "<select name='rating".($multiple ? "[]' multiple='multiple'" : "' ")." >"; $output = "<select name='rating".($multiple ? "[]' multiple='multiple'" : "' ")." >";
$options = Ratings::get_sorted_ratings(); $options = Ratings::get_sorted_ratings();
foreach($options as $option) { foreach ($options as $option) {
if($available_options!=null && !in_array($option->code, $available_options)) { if ($available_options!=null && !in_array($option->code, $available_options)) {
continue; continue;
} }
$output .= "<option value='".$option->code."' ". $output .= "<option value='".$option->code."' ".
(in_array($option->code,$selected_options) ? "selected='selected'": "") (in_array($option->code, $selected_options) ? "selected='selected'": "")
.">".$option->name."</option>"; .">".$option->name."</option>";
} }
return $output."</select>"; return $output."</select>";
} }
public function get_help_html(array $ratings) public function get_help_html(array $ratings)

View File

@ -69,7 +69,7 @@ class RegenThumb extends Extension
global $user; global $user;
if ($user->can(Permissions::DELETE_IMAGE)) { if ($user->can(Permissions::DELETE_IMAGE)) {
$event->add_action("bulk_regen", "Regen Thumbnails", "","", $this->theme->bulk_html()); $event->add_action("bulk_regen", "Regen Thumbnails", "", "", $this->theme->bulk_html());
} }
} }

View File

@ -12,7 +12,7 @@ class ImageRelationshipSetEvent extends Event
public $parent_id; public $parent_id;
public function __construct(int $child_id, int $parent_id) public function __construct(int $child_id, int $parent_id)
{ {
$this->child_id = $child_id; $this->child_id = $child_id;
$this->parent_id = $parent_id; $this->parent_id = $parent_id;
@ -51,7 +51,7 @@ class Relationships extends Extension
{ {
if (isset($_POST['tag_edit__tags']) ? !preg_match('/parent[=|:]/', $_POST["tag_edit__tags"]) : true) { //Ignore tag_edit__parent if tags contain parent metatag if (isset($_POST['tag_edit__tags']) ? !preg_match('/parent[=|:]/', $_POST["tag_edit__tags"]) : true) { //Ignore tag_edit__parent if tags contain parent metatag
if (isset($_POST["tag_edit__parent"]) ? ctype_digit($_POST["tag_edit__parent"]) : false) { if (isset($_POST["tag_edit__parent"]) ? ctype_digit($_POST["tag_edit__parent"]) : false) {
send_event(new ImageRelationshipSetEvent($event->image->id,(int) $_POST["tag_edit__parent"])); send_event(new ImageRelationshipSetEvent($event->image->id, (int) $_POST["tag_edit__parent"]));
} else { } else {
$this->remove_parent($event->image->id); $this->remove_parent($event->image->id);
} }
@ -83,7 +83,7 @@ class Relationships extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Relationships"; $block->header = "Relationships";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();
@ -139,15 +139,14 @@ class Relationships extends Extension
$old_parent = $database->get_one("SELECT parent_id FROM images WHERE id = :cid", ["cid"=>$event->child_id]); $old_parent = $database->get_one("SELECT parent_id FROM images WHERE id = :cid", ["cid"=>$event->child_id]);
if($old_parent!=$event->parent_id) { if ($old_parent!=$event->parent_id) {
if ($database->get_row("SELECT 1 FROM images WHERE id = :pid", ["pid" => $event->parent_id])) { if ($database->get_row("SELECT 1 FROM images WHERE id = :pid", ["pid" => $event->parent_id])) {
$result = $database->execute("UPDATE images SET parent_id = :pid WHERE id = :cid", ["pid" => $event->parent_id, "cid" => $event->child_id]); $result = $database->execute("UPDATE images SET parent_id = :pid WHERE id = :cid", ["pid" => $event->parent_id, "cid" => $event->child_id]);
if ($result->rowCount() > 0) { if ($result->rowCount() > 0) {
$database->execute("UPDATE images SET has_children = TRUE WHERE id = :pid", ["pid" => $event->parent_id]); $database->execute("UPDATE images SET has_children = TRUE WHERE id = :pid", ["pid" => $event->parent_id]);
if($old_parent!=null) { if ($old_parent!=null) {
$this->set_has_children($old_parent); $this->set_has_children($old_parent);
} }
} }
@ -162,7 +161,7 @@ class Relationships extends Extension
$results = $database->get_all_iterable("SELECT * FROM images WHERE parent_id = :pid ", ["pid"=>$image->id]); $results = $database->get_all_iterable("SELECT * FROM images WHERE parent_id = :pid ", ["pid"=>$image->id]);
$output = []; $output = [];
foreach ($results as $result) { foreach ($results as $result) {
if($result["id"]==$omit) { if ($result["id"]==$omit) {
continue; continue;
} }
$output[] = new Image($result); $output[] = new Image($result);
@ -187,13 +186,11 @@ class Relationships extends Extension
// Doesn't work on pgsql // Doesn't work on pgsql
// $database->execute("UPDATE images SET has_children = (SELECT * FROM (SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END FROM images WHERE parent_id = :pid) AS sub) // $database->execute("UPDATE images SET has_children = (SELECT * FROM (SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END FROM images WHERE parent_id = :pid) AS sub)
// WHERE id = :pid", ["pid"=>$parentID]); // WHERE id = :pid", ["pid"=>$parentID]);
$database->execute( $database->execute(
"UPDATE images SET has_children = EXISTS (SELECT 1 FROM images WHERE parent_id = :pid) WHERE id = :pid", "UPDATE images SET has_children = EXISTS (SELECT 1 FROM images WHERE parent_id = :pid) WHERE id = :pid",
["pid"=>$parent_id]); ["pid"=>$parent_id]
);
} }
} }

View File

@ -34,7 +34,7 @@ class RelationshipTest extends ShimmiePHPUnitTestCase
$image_3 = Image::by_id($image_id_3); $image_3 = Image::by_id($image_id_3);
$this->assertNull($image_1->parent_id); $this->assertNull($image_1->parent_id);
$this->assertEquals($image_id_1,$image_2->parent_id); $this->assertEquals($image_id_1, $image_2->parent_id);
$this->assertNull($image_3->parent_id); $this->assertNull($image_3->parent_id);
$this->assertTrue($image_1->has_children); $this->assertTrue($image_1->has_children);
$this->assertFalse($image_2->has_children); $this->assertFalse($image_2->has_children);
@ -56,7 +56,7 @@ class RelationshipTest extends ShimmiePHPUnitTestCase
$image_3 = Image::by_id($image_id_3); $image_3 = Image::by_id($image_id_3);
$this->assertNull($image_1->parent_id); $this->assertNull($image_1->parent_id);
$this->assertEquals($image_id_3,$image_2->parent_id); $this->assertEquals($image_id_3, $image_2->parent_id);
$this->assertNull($image_3->parent_id); $this->assertNull($image_3->parent_id);
$this->assertFalse($image_2->has_children); $this->assertFalse($image_2->has_children);
$this->assertFalse($image_2->has_children); $this->assertFalse($image_2->has_children);
@ -129,7 +129,7 @@ class RelationshipTest extends ShimmiePHPUnitTestCase
$image_3 = Image::by_id($image_id_3); $image_3 = Image::by_id($image_id_3);
$this->assertNull($image_1->parent_id); $this->assertNull($image_1->parent_id);
$this->assertEquals($image_id_1,$image_2->parent_id); $this->assertEquals($image_id_1, $image_2->parent_id);
$this->assertNull($image_3->parent_id); $this->assertNull($image_3->parent_id);
$this->assertTrue($image_1->has_children); $this->assertTrue($image_1->has_children);
$this->assertFalse($image_2->has_children); $this->assertFalse($image_2->has_children);
@ -151,8 +151,8 @@ class RelationshipTest extends ShimmiePHPUnitTestCase
$image_2 = Image::by_id($image_id_2); $image_2 = Image::by_id($image_id_2);
$image_3 = Image::by_id($image_id_3); $image_3 = Image::by_id($image_id_3);
$this->assertEquals($image_id_3,$image_1->parent_id); $this->assertEquals($image_id_3, $image_1->parent_id);
$this->assertEquals($image_id_1,$image_2->parent_id); $this->assertEquals($image_id_1, $image_2->parent_id);
$this->assertNull($image_3->parent_id); $this->assertNull($image_3->parent_id);
$this->assertTrue($image_1->has_children); $this->assertTrue($image_1->has_children);
$this->assertFalse($image_2->has_children); $this->assertFalse($image_2->has_children);
@ -175,7 +175,7 @@ class RelationshipTest extends ShimmiePHPUnitTestCase
$image_3 = Image::by_id($image_id_3); $image_3 = Image::by_id($image_id_3);
$this->assertNull($image_1->parent_id); $this->assertNull($image_1->parent_id);
$this->assertEquals($image_id_1,$image_2->parent_id); $this->assertEquals($image_id_1, $image_2->parent_id);
$this->assertNull($image_3->parent_id); $this->assertNull($image_3->parent_id);
$this->assertTrue($image_1->has_children); $this->assertTrue($image_1->has_children);
$this->assertFalse($image_2->has_children); $this->assertFalse($image_2->has_children);

View File

@ -72,6 +72,5 @@ class RelationshipsTheme extends Themelet
<p>Returns images that have no children.</p> <p>Returns images that have no children.</p>
</div> </div>
'; ';
} }
} }

View File

@ -136,7 +136,7 @@ class ReportImage extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::VIEW_IMAGE_REPORT)) { if ($user->can(Permissions::VIEW_IMAGE_REPORT)) {
$count = $this->count_reported_images(); $count = $this->count_reported_images();
$h_count = $count > 0 ? " ($count)" : ""; $h_count = $count > 0 ? " ($count)" : "";

View File

@ -59,7 +59,7 @@ class ResizeImage extends Extension
{ {
$sb = new SetupBlock("Image Resize"); $sb = new SetupBlock("Image Resize");
$sb->start_table(); $sb->start_table();
$sb->add_choice_option(ResizeConfig::ENGINE, Media::IMAGE_MEDIA_ENGINES, "Engine: ", true); $sb->add_choice_option(ResizeConfig::ENGINE, Media::IMAGE_MEDIA_ENGINES, "Engine: ", true);
$sb->add_bool_option(ResizeConfig::ENABLED, "Allow resizing images: ", true); $sb->add_bool_option(ResizeConfig::ENABLED, "Allow resizing images: ", true);
$sb->add_bool_option(ResizeConfig::UPLOAD, "Resize on upload: ", true); $sb->add_bool_option(ResizeConfig::UPLOAD, "Resize on upload: ", true);
$sb->end_table(); $sb->end_table();
@ -192,7 +192,7 @@ class ResizeImage extends Extension
$engine = $config->get_string(ResizeConfig::ENGINE); $engine = $config->get_string(ResizeConfig::ENGINE);
if(!$this->can_resize_format($image_obj->ext, $image_obj->lossless)) { if (!$this->can_resize_format($image_obj->ext, $image_obj->lossless)) {
throw new ImageResizeException("Engine $engine cannot resize selected image"); throw new ImageResizeException("Engine $engine cannot resize selected image");
} }

View File

@ -82,9 +82,8 @@ EOD;
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="comment") { if ($event->parent=="comment") {
$event->add_nav_link("comment_rss", new Link('rss/comments'), "Feed"); $event->add_nav_link("comment_rss", new Link('rss/comments'), "Feed");
} }
} }
} }

View File

@ -119,7 +119,7 @@ class RSS_Images extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="posts") { if ($event->parent=="posts") {
$event->add_nav_link("posts_rss", new Link('rss/images'), "Feed"); $event->add_nav_link("posts_rss", new Link('rss/images'), "Feed");
} }
} }

View File

@ -9,4 +9,4 @@ class SetupConfig
public const THEME = "theme"; public const THEME = "theme";
public const WORD_WRAP = "word_wrap"; public const WORD_WRAP = "word_wrap";
public const COMMENT_CAPTCHA = "comment_captcha"; public const COMMENT_CAPTCHA = "comment_captcha";
} }

View File

@ -142,20 +142,33 @@ class SetupBlock extends Block
private function format_option(string $name, $html, ?string $label, bool $table_row) { private function format_option(string $name, $html, ?string $label, bool $table_row)
{
global $config; global $config;
if($table_row) $this->start_table_row(); if ($table_row) {
if($table_row) $this->start_table_header_cell(); $this->start_table_row();
}
if ($table_row) {
$this->start_table_header_cell();
}
if (!is_null($label)) { if (!is_null($label)) {
$this->body .= "<label for='{$name}'>{$label}</label>"; $this->body .= "<label for='{$name}'>{$label}</label>";
} }
if($table_row) $this->end_table_header_cell(); if ($table_row) {
$this->end_table_header_cell();
}
if($table_row) $this->start_table_cell(); if ($table_row) {
$this->start_table_cell();
}
$this->body .= $html; $this->body .= $html;
if($table_row) $this->end_table_cell(); if ($table_row) {
if($table_row) $this->end_table_row(); $this->end_table_cell();
}
if ($table_row) {
$this->end_table_row();
}
} }
public function add_text_option(string $name, string $label=null, bool $table_row = false) public function add_text_option(string $name, string $label=null, bool $table_row = false)
@ -187,7 +200,7 @@ class SetupBlock extends Block
$checked = $config->get_bool($name) ? " checked" : ""; $checked = $config->get_bool($name) ? " checked" : "";
$html = ""; $html = "";
if(!$table_row&&!is_null($label)) { if (!$table_row&&!is_null($label)) {
$html .= "<label for='{$name}'>{$label}</label>"; $html .= "<label for='{$name}'>{$label}</label>";
} }
@ -216,7 +229,6 @@ class SetupBlock extends Block
$html .= "<input type='hidden' name='_type_$name' value='int'>\n"; $html .= "<input type='hidden' name='_type_$name' value='int'>\n";
$this->format_option($name, $html, $label, $table_row); $this->format_option($name, $html, $label, $table_row);
} }
public function add_shorthand_int_option(string $name, string $label=null, bool $table_row = false) public function add_shorthand_int_option(string $name, string $label=null, bool $table_row = false)
@ -414,7 +426,7 @@ class Setup extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::CHANGE_SETTING)) { if ($user->can(Permissions::CHANGE_SETTING)) {
$event->add_nav_link("setup", new Link('setup'), "Board Config", null, 0); $event->add_nav_link("setup", new Link('setup'), "Board Config", null, 0);
} }

View File

@ -85,7 +85,7 @@ class Source_History extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::BULK_EDIT_IMAGE_TAG)) { if ($user->can(Permissions::BULK_EDIT_IMAGE_TAG)) {
$event->add_nav_link("source_history", new Link('source_history/all/1'), "Source Changes", NavLink::is_active(["source_history"])); $event->add_nav_link("source_history", new Link('source_history/all/1'), "Source Changes", NavLink::is_active(["source_history"]));
} }

View File

@ -26,6 +26,4 @@ class System extends Extension
{ {
$event->add_nav_link("system", new Link('system'), "System"); $event->add_nav_link("system", new Link('system'), "System");
} }
} }

View File

@ -5,4 +5,4 @@ abstract class TagCategoriesConfig
public const VERSION = "ext_tag_categories_version"; public const VERSION = "ext_tag_categories_version";
public const SPLIT_ON_VIEW = "tag_categories_split_on_view"; public const SPLIT_ON_VIEW = "tag_categories_split_on_view";
} }

View File

@ -75,7 +75,8 @@ class TagCategories extends Extension
$count = $matches[3]; $count = $matches[3];
$types = $database->get_col( $types = $database->get_col(
$database->scoreql_to_sql('SELECT SCORE_STRNORM(category) FROM image_tag_categories')); $database->scoreql_to_sql('SELECT SCORE_STRNORM(category) FROM image_tag_categories')
);
if (in_array($type, $types)) { if (in_array($type, $types)) {
$event->add_querylet( $event->add_querylet(
new Querylet($database->scoreql_to_sql("EXISTS ( new Querylet($database->scoreql_to_sql("EXISTS (
@ -93,7 +94,7 @@ class TagCategories extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Tag Categories"; $block->header = "Tag Categories";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();

View File

@ -113,6 +113,5 @@ class TagCategoriesTheme extends Themelet
<p>Can use &lt;, &lt;=, &gt;, &gt;=, or =.</p> <p>Can use &lt;, &lt;=, &gt;, &gt;=, or =.</p>
<p>Category name is not case sensitive, category must exist for search to work.</p> <p>Category name is not case sensitive, category must exist for search to work.</p>
'; ';
} }
} }

View File

@ -258,7 +258,7 @@ class TagEdit extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="tags") { if ($event->parent=="tags") {
$event->add_nav_link("tags_help", new Link('ext_doc/tag_edit'), "Help"); $event->add_nav_link("tags_help", new Link('ext_doc/tag_edit'), "Help");
} }
} }

View File

@ -85,7 +85,7 @@ class Tag_History extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::BULK_EDIT_IMAGE_TAG)) { if ($user->can(Permissions::BULK_EDIT_IMAGE_TAG)) {
$event->add_nav_link("tag_history", new Link('tag_history/all/1'), "Tag Changes", NavLink::is_active(["tag_history"])); $event->add_nav_link("tag_history", new Link('tag_history/all/1'), "Tag Changes", NavLink::is_active(["tag_history"]));
} }

View File

@ -100,7 +100,7 @@ class TagList extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="tags") { if ($event->parent=="tags") {
$event->add_nav_link("tags_map", new Link('tags/map'), "Map"); $event->add_nav_link("tags_map", new Link('tags/map'), "Map");
$event->add_nav_link("tags_alphabetic", new Link('tags/alphabetic'), "Alphabetic"); $event->add_nav_link("tags_alphabetic", new Link('tags/alphabetic'), "Alphabetic");
$event->add_nav_link("tags_popularity", new Link('tags/popularity'), "Popularity"); $event->add_nav_link("tags_popularity", new Link('tags/popularity'), "Popularity");

View File

@ -76,7 +76,7 @@ class Tips extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->is_admin()) { if ($user->is_admin()) {
$event->add_nav_link("tips", new Link('tips/list'), "Tips Editor"); $event->add_nav_link("tips", new Link('tips/list'), "Tips Editor");
} }

View File

@ -98,7 +98,7 @@ class TranscodeImage extends Extension
$sb->start_table(); $sb->start_table();
$sb->add_bool_option(TranscodeConfig::ENABLED, "Allow transcoding images: ", true); $sb->add_bool_option(TranscodeConfig::ENABLED, "Allow transcoding images: ", true);
$sb->add_bool_option(TranscodeConfig::UPLOAD, "Transcode on upload: ", true); $sb->add_bool_option(TranscodeConfig::UPLOAD, "Transcode on upload: ", true);
$sb->add_choice_option(TranscodeConfig::ENGINE, Media::IMAGE_MEDIA_ENGINES, "Engine", true); $sb->add_choice_option(TranscodeConfig::ENGINE, Media::IMAGE_MEDIA_ENGINES, "Engine", true);
foreach (self::INPUT_FORMATS as $display=>$format) { foreach (self::INPUT_FORMATS as $display=>$format) {
if (in_array($format, MediaEngine::INPUT_SUPPORT[$engine])) { if (in_array($format, MediaEngine::INPUT_SUPPORT[$engine])) {
$outputs = $this->get_supported_output_formats($engine, $format); $outputs = $this->get_supported_output_formats($engine, $format);
@ -181,7 +181,7 @@ class TranscodeImage extends Extension
$engine = $config->get_string(TranscodeConfig::ENGINE); $engine = $config->get_string(TranscodeConfig::ENGINE);
if ($user->is_admin()) { if ($user->is_admin()) {
$event->add_action(self::ACTION_BULK_TRANSCODE, "Transcode", null,"", $this->theme->get_transcode_picker_html($this->get_supported_output_formats($engine))); $event->add_action(self::ACTION_BULK_TRANSCODE, "Transcode", null, "", $this->theme->get_transcode_picker_html($this->get_supported_output_formats($engine)));
} }
} }
@ -230,7 +230,7 @@ class TranscodeImage extends Extension
private function get_supported_output_formats($engine, ?String $omit_format = null, ?bool $lossless = null): array private function get_supported_output_formats($engine, ?String $omit_format = null, ?bool $lossless = null): array
{ {
if($omit_format!=null) { if ($omit_format!=null) {
$omit_format = Media::normalize_format($omit_format, $lossless); $omit_format = Media::normalize_format($omit_format, $lossless);
} }
$output = []; $output = [];
@ -241,7 +241,7 @@ class TranscodeImage extends Extension
$output[$key] = $value; $output[$key] = $value;
continue; continue;
} }
if(Media::is_output_supported($engine, $value) if (Media::is_output_supported($engine, $value)
&&(empty($omit_format)||$omit_format!=$value)) { &&(empty($omit_format)||$omit_format!=$value)) {
$output[$key] = $value; $output[$key] = $value;
} }

View File

@ -10,8 +10,13 @@ class TranscodeImageTheme extends Themelet
global $config; global $config;
$html = " $html = "
".make_form(make_link("transcode/{$image->id}"), 'POST', false, "", ".make_form(
"return transcodeSubmit()")." make_link("transcode/{$image->id}"),
'POST',
false,
"",
"return transcodeSubmit()"
)."
<input type='hidden' name='image_id' value='{$image->id}'> <input type='hidden' name='image_id' value='{$image->id}'>
<input type='hidden' id='image_lossless' name='image_lossless' value='{$image->lossless}'> <input type='hidden' id='image_lossless' name='image_lossless' value='{$image->lossless}'>
".$this->get_transcode_picker_html($options)." ".$this->get_transcode_picker_html($options)."

View File

@ -14,7 +14,6 @@ abstract class TrashConfig
class Trash extends Extension class Trash extends Extension
{ {
protected $db_support = [DatabaseDriver::MYSQL, DatabaseDriver::PGSQL]; protected $db_support = [DatabaseDriver::MYSQL, DatabaseDriver::PGSQL];
public function get_priority(): int public function get_priority(): int
@ -59,7 +58,7 @@ class Trash extends Extension
{ {
global $user, $page; global $user, $page;
if($event->image->trash===true && !$user->can(Permissions::VIEW_TRASH)) { if ($event->image->trash===true && !$user->can(Permissions::VIEW_TRASH)) {
$page->set_mode(PageMode::REDIRECT); $page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("post/list")); $page->set_redirect(make_link("post/list"));
} }
@ -67,7 +66,7 @@ class Trash extends Extension
public function onImageDeletion(ImageDeletionEvent $event) public function onImageDeletion(ImageDeletionEvent $event)
{ {
if($event->force!==true && $event->image->trash!==true) { if ($event->force!==true && $event->image->trash!==true) {
self::set_trash($event->image->id, true); self::set_trash($event->image->id, true);
$event->stop_processing = true; $event->stop_processing = true;
} }
@ -87,7 +86,7 @@ class Trash extends Extension
if (preg_match(self::SEARCH_REGEXP, strtolower($event->term), $matches)) { if (preg_match(self::SEARCH_REGEXP, strtolower($event->term), $matches)) {
if($user->can(Permissions::VIEW_TRASH)) { if ($user->can(Permissions::VIEW_TRASH)) {
$event->add_querylet(new Querylet($database->scoreql_to_sql("trash = SCORE_BOOL_Y "))); $event->add_querylet(new Querylet($database->scoreql_to_sql("trash = SCORE_BOOL_Y ")));
} }
} }
@ -96,8 +95,8 @@ class Trash extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
global $user; global $user;
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
if($user->can(Permissions::VIEW_TRASH)) { if ($user->can(Permissions::VIEW_TRASH)) {
$block = new Block(); $block = new Block();
$block->header = "Trash"; $block->header = "Trash";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();
@ -117,18 +116,19 @@ class Trash extends Extension
return true; return true;
} }
public static function set_trash($image_id, $trash) { public static function set_trash($image_id, $trash)
{
global $database; global $database;
$database->execute("UPDATE images SET trash = :trash WHERE id = :id", $database->execute(
["trash"=>$database->scoresql_value_prepare($trash),"id"=>$image_id]); "UPDATE images SET trash = :trash WHERE id = :id",
["trash"=>$database->scoresql_value_prepare($trash),"id"=>$image_id]
);
} }
public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event)
{ {
global $config, $database, $user; global $config, $database, $user;
if($event->image->trash===true && $user->can(Permissions::VIEW_TRASH)) { if ($event->image->trash===true && $user->can(Permissions::VIEW_TRASH)) {
$event->add_part($this->theme->get_image_admin_html($event->image->id)); $event->add_part($this->theme->get_image_admin_html($event->image->id));
} }
} }
@ -138,7 +138,7 @@ class Trash extends Extension
global $user; global $user;
if ($user->can(Permissions::VIEW_TRASH)&&in_array("in:trash", $event->search_terms)) { if ($user->can(Permissions::VIEW_TRASH)&&in_array("in:trash", $event->search_terms)) {
$event->add_action("bulk_trash_restore","(U)ndelete", "u"); $event->add_action("bulk_trash_restore", "(U)ndelete", "u");
} }
} }
@ -172,7 +172,5 @@ class Trash extends Extension
$database->Execute("CREATE INDEX images_trash_idx ON images(trash)"); $database->Execute("CREATE INDEX images_trash_idx ON images(trash)");
$config->set_int(TrashConfig::VERSION, 1); $config->set_int(TrashConfig::VERSION, 1);
} }
} }
} }

View File

@ -2,7 +2,8 @@
class TrashTheme extends Themelet class TrashTheme extends Themelet
{ {
function get_image_admin_html(int $image_id) { public function get_image_admin_html(int $image_id)
{
$html = " $html = "
".make_form(make_link('trash_restore/'.$image_id), 'POST')." ".make_form(make_link('trash_restore/'.$image_id), 'POST')."
<input type='hidden' name='image_id' value='$image_id'> <input type='hidden' name='image_id' value='$image_id'>
@ -10,7 +11,8 @@ class TrashTheme extends Themelet
</form> </form>
"; ";
return $html; } return $html;
}
public function get_help_html() public function get_help_html()
@ -21,6 +23,5 @@ class TrashTheme extends Themelet
<p>Returns images that are in the trash.</p> <p>Returns images that are in the trash.</p>
</div> </div>
'; ';
} }
} }

View File

@ -187,7 +187,7 @@ class Upgrade extends Extension
$database->execute("ALTER TABLE images ADD COLUMN length INTEGER NULL "); $database->execute("ALTER TABLE images ADD COLUMN length INTEGER NULL ");
log_info("upgrade", "Setting indexes for media columns"); log_info("upgrade", "Setting indexes for media columns");
switch($database->get_driver_name()) { switch ($database->get_driver_name()) {
case DatabaseDriver::PGSQL: case DatabaseDriver::PGSQL:
case DatabaseDriver::SQLITE: case DatabaseDriver::SQLITE:
$database->execute('CREATE INDEX images_video_idx ON images(video) WHERE video IS NOT NULL'); $database->execute('CREATE INDEX images_video_idx ON images(video) WHERE video IS NOT NULL');
@ -223,7 +223,6 @@ class Upgrade extends Extension
log_info("upgrade", "Database at version 17"); log_info("upgrade", "Database at version 17");
$config->set_bool("in_upgrade", false); $config->set_bool("in_upgrade", false);
} }
} }
public function get_priority(): int public function get_priority(): int

View File

@ -141,12 +141,12 @@ class Upload extends Extension
public function onPageNavBuilding(PageNavBuildingEvent $event) public function onPageNavBuilding(PageNavBuildingEvent $event)
{ {
$event->add_nav_link("upload",new Link('upload'), "Upload"); $event->add_nav_link("upload", new Link('upload'), "Upload");
} }
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="upload") { if ($event->parent=="upload") {
if (class_exists("Wiki")) { if (class_exists("Wiki")) {
$event->add_nav_link("upload_guidelines", new Link('wiki/upload_guidelines'), "Guidelines"); $event->add_nav_link("upload_guidelines", new Link('wiki/upload_guidelines'), "Guidelines");
} }

View File

@ -341,7 +341,7 @@ class UserPage extends Extension
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
global $user; global $user;
if($event->parent==="system") { if ($event->parent==="system") {
if ($user->can(Permissions::EDIT_USER_CLASS)) { if ($user->can(Permissions::EDIT_USER_CLASS)) {
$event->add_nav_link("user_admin", new Link('user_admin/list'), "User List", NavLink::is_active(["user_admin"])); $event->add_nav_link("user_admin", new Link('user_admin/list'), "User List", NavLink::is_active(["user_admin"]));
} }
@ -388,7 +388,7 @@ class UserPage extends Extension
public function onHelpPageBuilding(HelpPageBuildingEvent $event) public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{ {
if($event->key===HelpPages::SEARCH) { if ($event->key===HelpPages::SEARCH) {
$block = new Block(); $block = new Block();
$block->header = "Users"; $block->header = "Users";
$block->body = $this->theme->get_help_html(); $block->body = $this->theme->get_help_html();

View File

@ -242,7 +242,6 @@ class UserPageTheme extends Themelet
$page->set_heading(html_escape($duser->name)."'s Page"); $page->set_heading(html_escape($duser->name)."'s Page");
$page->add_block(new NavBlock()); $page->add_block(new NavBlock());
$page->add_block(new Block("Stats", join("<br>", $stats), "main", 10)); $page->add_block(new Block("Stats", join("<br>", $stats), "main", 10));
} }
public function build_options(User $duser, UserOptionsBuildingEvent $event) public function build_options(User $duser, UserOptionsBuildingEvent $event)
@ -337,7 +336,6 @@ class UserPageTheme extends Themelet
foreach ($event->parts as $part) { foreach ($event->parts as $part) {
$html .= $part; $html .= $part;
} }
} }
return $html; return $html;
} }

View File

@ -27,12 +27,13 @@ class UserConfig extends Extension
{ {
global $config; global $config;
if ($config->get_int(self::VERSION,0)<1) { if ($config->get_int(self::VERSION, 0)<1) {
$this->install(); $this->install();
} }
} }
public function onInitUserConfig(InitUserConfigEvent $event) { public function onInitUserConfig(InitUserConfigEvent $event)
{
global $database, $user_config; global $database, $user_config;
$user_config = new DatabaseConfig($database, "user_config", "user_id", $event->user->id); $user_config = new DatabaseConfig($database, "user_config", "user_id", $event->user->id);
@ -43,8 +44,7 @@ class UserConfig extends Extension
{ {
global $config, $database; global $config, $database;
if ($config->get_int(self::VERSION,0) < 1) { if ($config->get_int(self::VERSION, 0) < 1) {
log_info("upgrade", "Adding user config table"); log_info("upgrade", "Adding user config table");
$database->create_table("user_config", " $database->create_table("user_config", "

View File

@ -17,7 +17,8 @@ class DisplayingImageEvent extends Event
return $this->image; return $this->image;
} }
public function set_title(String $title) { public function set_title(String $title)
{
$this->title = $title; $this->title = $title;
} }
} }

View File

@ -22,4 +22,4 @@ class ImageAdminBlockBuildingEvent extends Event
} }
$this->parts[$position] = $html; $this->parts[$position] = $html;
} }
} }

View File

@ -22,4 +22,4 @@ class ImageInfoBoxBuildingEvent extends Event
} }
$this->parts[$position] = $html; $this->parts[$position] = $html;
} }
} }

View File

@ -9,4 +9,4 @@ class ImageInfoSetEvent extends Event
{ {
$this->image = $image; $this->image = $image;
} }
} }

View File

@ -179,13 +179,13 @@ class Wiki extends Extension
public function onPageNavBuilding(PageNavBuildingEvent $event) public function onPageNavBuilding(PageNavBuildingEvent $event)
{ {
$event->add_nav_link("wiki",new Link('wiki'), "Wiki"); $event->add_nav_link("wiki", new Link('wiki'), "Wiki");
} }
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{ {
if($event->parent=="wiki") { if ($event->parent=="wiki") {
$event->add_nav_link("wiki_rules", new Link('wiki/rules'), "Rules"); $event->add_nav_link("wiki_rules", new Link('wiki/rules'), "Rules");
$event->add_nav_link("wiki_help", new Link('ext_doc/wiki'), "Help"); $event->add_nav_link("wiki_help", new Link('ext_doc/wiki'), "Help");
} }

View File

@ -100,7 +100,7 @@ try {
$page->display(); $page->display();
} }
if($database->transaction===true) { if ($database->transaction===true) {
$database->commit(); $database->commit();
} }
@ -117,7 +117,7 @@ try {
$_tracer->end(); $_tracer->end();
if (TRACE_FILE) { if (TRACE_FILE) {
if((microtime(true) - $_shm_load_start) > TRACE_THRESHOLD) { if ((microtime(true) - $_shm_load_start) > TRACE_THRESHOLD) {
$_tracer->flush(TRACE_FILE); $_tracer->flush(TRACE_FILE);
} }
} }

View File

@ -101,7 +101,7 @@ class Layout
} }
$custom_sublinks = ""; $custom_sublinks = "";
if(!empty($sub_links)) { if (!empty($sub_links)) {
$custom_sublinks = "<div class='sbar'>"; $custom_sublinks = "<div class='sbar'>";
foreach ($sub_links as $nav_link) { foreach ($sub_links as $nav_link) {
$custom_sublinks .= "<li>".$this->navlinks($nav_link->link, $nav_link->description, $nav_link->active)."</li>"; $custom_sublinks .= "<li>".$this->navlinks($nav_link->link, $nav_link->description, $nav_link->active)."</li>";

View File

@ -33,7 +33,7 @@ class CustomViewImageTheme extends ViewImageTheme
<br>Filesize: $h_filesize <br>Filesize: $h_filesize
<br>Type: $h_type"; <br>Type: $h_type";
if($image->length!=null) { if ($image->length!=null) {
$h_length = format_milliseconds($image->length); $h_length = format_milliseconds($image->length);
$html .= "<br/>Length: $h_length"; $html .= "<br/>Length: $h_length";
} }

View File

@ -101,7 +101,7 @@ class Layout
} }
$custom_sublinks = ""; $custom_sublinks = "";
if(!empty($sub_links)) { if (!empty($sub_links)) {
$custom_sublinks = "<div class='sbar'>"; $custom_sublinks = "<div class='sbar'>";
foreach ($sub_links as $nav_link) { foreach ($sub_links as $nav_link) {
$custom_sublinks .= "<li>".$this->navlinks($nav_link->link, $nav_link->description, $nav_link->active)."</li>"; $custom_sublinks .= "<li>".$this->navlinks($nav_link->link, $nav_link->description, $nav_link->active)."</li>";

View File

@ -33,7 +33,7 @@ class CustomViewImageTheme extends ViewImageTheme
<br>Type: $h_type <br>Type: $h_type
"; ";
if($image->length!=null) { if ($image->length!=null) {
$h_length = format_milliseconds($image->length); $h_length = format_milliseconds($image->length);
$html .= "<br/>Length: $h_length"; $html .= "<br/>Length: $h_length";
} }

View File

@ -57,7 +57,7 @@ class Layout
} }
$custom_sublinks = ""; $custom_sublinks = "";
if(!empty($sub_links)) { if (!empty($sub_links)) {
$custom_sublinks = "<div class='sbar'>"; $custom_sublinks = "<div class='sbar'>";
foreach ($sub_links as $nav_link) { foreach ($sub_links as $nav_link) {
$custom_sublinks .= $this->navlinks($nav_link->link, $nav_link->description, $nav_link->active); $custom_sublinks .= $this->navlinks($nav_link->link, $nav_link->description, $nav_link->active);

View File

@ -33,7 +33,7 @@ class CustomViewImageTheme extends ViewImageTheme
<br>Filesize: $h_filesize <br>Filesize: $h_filesize
<br>Type: ".$h_type." <br>Type: ".$h_type."
"; ";
if($image->length!=null) { if ($image->length!=null) {
$h_length = format_milliseconds($image->length); $h_length = format_milliseconds($image->length);
$html .= "<br/>Length: $h_length"; $html .= "<br/>Length: $h_length";
} }