127 lines
3.8 KiB
PHP
127 lines
3.8 KiB
PHP
<?php
|
|
class ReadMore extends Modules {
|
|
private $routing = false;
|
|
|
|
public static function __install(): void {
|
|
Config::current()->set(
|
|
"module_read_more",
|
|
array(
|
|
"apply_to_feeds" => false,
|
|
"default_text" => ""
|
|
)
|
|
);
|
|
}
|
|
|
|
public static function __uninstall(): void {
|
|
Config::current()->remove("module_read_more");
|
|
}
|
|
|
|
public function __init(): void {
|
|
# Truncate in "markup_post_text"
|
|
# before Markdown filtering in "markup_text".
|
|
$this->setPriority("markup_post_text", 1);
|
|
}
|
|
|
|
public function admin_read_more_settings($admin): void {
|
|
if (!Visitor::current()->group->can("change_settings"))
|
|
show_403(
|
|
__("Access Denied"),
|
|
__("You do not have sufficient privileges to change settings.")
|
|
);
|
|
|
|
if (empty($_POST)) {
|
|
$admin->display("pages".DIR."read_more_settings");
|
|
return;
|
|
}
|
|
|
|
if (!isset($_POST['hash']) or !Session::check_token($_POST['hash']))
|
|
show_403(
|
|
__("Access Denied"),
|
|
__("Invalid authentication token.")
|
|
);
|
|
|
|
fallback($_POST['default_text'], "");
|
|
|
|
Config::current()->set(
|
|
"module_read_more",
|
|
array(
|
|
"apply_to_feeds" => isset($_POST['apply_to_feeds']),
|
|
"default_text" => $_POST['default_text']
|
|
)
|
|
);
|
|
|
|
Flash::notice(
|
|
__("Settings updated."),
|
|
"read_more_settings"
|
|
);
|
|
}
|
|
|
|
public function settings_nav($navs): array {
|
|
if (Visitor::current()->group->can("change_settings"))
|
|
$navs["read_more_settings"] = array(
|
|
"title" => __("Read More", "read_more")
|
|
);
|
|
|
|
return $navs;
|
|
}
|
|
|
|
public function markup_post_text($text, $post = null): string {
|
|
if (!preg_match("/<!-- *more([^>]*)?-->/i", $text, $matches))
|
|
return $text;
|
|
|
|
if (!isset($post) or !$this->eligible())
|
|
return preg_replace("/<!-- *more([^>]*)?-->/i", "", $text, 1);
|
|
|
|
$settings = Config::current()->module_read_more;
|
|
|
|
$more = oneof(
|
|
trim(fallback($matches[1], "")),
|
|
$settings["default_text"],
|
|
__("…more", "read_more")
|
|
);
|
|
|
|
$url = (!$post->no_results) ? $post->url() : "#" ;
|
|
$split = preg_split("/<!-- *more([^>]*)?-->/i", $text, 2);
|
|
|
|
return $split[0].
|
|
'<a class="read_more" href="'.$url.'">'.
|
|
fix($more).
|
|
'</a>';
|
|
}
|
|
|
|
public function title_from_excerpt($text): string {
|
|
$split = preg_split('/<a class="read_more"/', $text, 2);
|
|
return $split[0];
|
|
}
|
|
|
|
public function route_init() {
|
|
$this->routing = true;
|
|
}
|
|
|
|
public function route_done() {
|
|
$this->routing = false;
|
|
}
|
|
|
|
private function eligible(): bool {
|
|
$route = Route::current();
|
|
$settings = Config::current()->module_read_more;
|
|
|
|
if (!isset($route))
|
|
return false;
|
|
|
|
if (!$this->routing)
|
|
return false;
|
|
|
|
if (!$route->controller instanceof MainController)
|
|
return false;
|
|
|
|
if ($route->action == "view")
|
|
return false;
|
|
|
|
if ($route->controller->feed and !$settings["apply_to_feeds"])
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
}
|