Skip to content

Commit

Permalink
experimental new plugin system
Browse files Browse the repository at this point in the history
  • Loading branch information
cthu1hoo committed Dec 23, 2012
1 parent 83e6e31 commit 19c7350
Show file tree
Hide file tree
Showing 29 changed files with 204 additions and 164 deletions.
4 changes: 4 additions & 0 deletions backend.php
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ function stripslashes_deep($value) {
if ($handler->before($method)) {
if ($method && method_exists($handler, $method)) {
$handler->$method();
} else {
if (method_exists($handler, "catchall")) {
$handler->catchall($method);
}
}
$handler->after();
return;
Expand Down
11 changes: 0 additions & 11 deletions classes/button.php

This file was deleted.

31 changes: 0 additions & 31 deletions classes/button/tweet.php

This file was deleted.

10 changes: 6 additions & 4 deletions classes/feeds.php
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ private function format_headlines_list($feed, $method, $view_mode, $limit, $cat_

$headlines_count = db_num_rows($result);

if (get_pref($this->link, 'COMBINED_DISPLAY_MODE')) {
/* if (get_pref($this->link, 'COMBINED_DISPLAY_MODE')) {
$button_plugins = array();
foreach (explode(",", ARTICLE_BUTTON_PLUGINS) as $p) {
$pclass = "button_" . trim($p);
Expand All @@ -259,7 +259,9 @@ private function format_headlines_list($feed, $method, $view_mode, $limit, $cat_
array_push($button_plugins, $plugin);
}
}
}
} */

global $pluginhost;

if (db_num_rows($result) > 0) {

Expand Down Expand Up @@ -706,8 +708,8 @@ class=\"titleWrap$hlc_suffix\">

//$note_escaped = htmlspecialchars($line['note'], ENT_QUOTES);

foreach ($button_plugins as $p) {
$reply['content'] .= $p->render($id, $line);
foreach ($pluginhost->get_hooks($pluginhost::HOOK_ARTICLE_BUTTON) as $p) {
$reply['content'] .= $p->hook_article_button($line);
}

$reply['content'] .= "<img src=\"images/digest_checkbox.png\"
Expand Down
14 changes: 0 additions & 14 deletions classes/filter.php

This file was deleted.

18 changes: 18 additions & 0 deletions classes/pluginhandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php
class PluginHandler extends Handler_Protected {
function csrf_ignore($method) {
return true;
}

function catchall($method) {
global $pluginhost;

$plugin = $pluginhost->get_plugin($_REQUEST["plugin"]);

if (method_exists($plugin, $method)) {
$plugin->$method();
}
}
}

?>
71 changes: 71 additions & 0 deletions classes/pluginhost.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php
class PluginHost {
private $link;
private $hooks = array();
private $plugins = array();

const HOOK_ARTICLE_BUTTON = 1;
const HOOK_ARTICLE_FILTER = 2;

function __construct($link) {
$this->link = $link;
}

private function register_plugin($name, $plugin) {
//array_push($this->plugins, $plugin);
$this->plugins[$name] = $plugin;
}

function get_link() {
return $this->link;
}

function get_plugins() {
return $this->plugins;
}

function get_plugin($name) {
return $this->plugins[$name];
}

function add_hook($type, $sender) {
if (!is_array($this->hooks[$type])) {
$this->hooks[$type] = array();
}

array_push($this->hooks[$type], $sender);
}

function del_hook($type, $sender) {
if (is_array($this->hooks[$type])) {
$key = array_Search($this->hooks[$type], $sender);
if ($key !== FALSE) {
unset($this->hooks[$type][$key]);
}
}
}

function get_hooks($type) {
return $this->hooks[$type];
}

function load($classlist) {
$plugins = explode(",", $classlist);

foreach ($plugins as $class) {
$class = trim($class);
$class_file = str_replace("_", "/", strtolower(basename($class)));
$file = dirname(__FILE__)."/../plugins/$class_file/$class_file.php";

if (file_exists($file)) require_once $file;

if (class_exists($class)) {
$plugin = new $class($this);

$this->register_plugin($class, $plugin);
}
}
}

}
?>
4 changes: 2 additions & 2 deletions classes/rpc.php
Original file line number Diff line number Diff line change
Expand Up @@ -706,7 +706,7 @@ function verifyRegexp() {
print json_encode(array("status" => $status));
}

function buttonPlugin() {
/* function buttonPlugin() {
$pclass = "button_" . basename($_REQUEST['plugin']);
$method = $_REQUEST['plugin_method'];
Expand All @@ -716,7 +716,7 @@ function buttonPlugin() {
return $plugin->$method();
}
}
}
} */

function genHash() {
$hash = sha1(uniqid(rand(), true));
Expand Down
9 changes: 3 additions & 6 deletions config.php-dist
Original file line number Diff line number Diff line change
Expand Up @@ -176,16 +176,13 @@
// if you experience weird errors and tt-rss failing to start, blank pages
// after login, or content encoding errors, disable it.

define('PLUGINS', '');
// Plugins to load. Check plugins/ directory for additional information.

define('FEEDBACK_URL', '');
// Displays an URL for users to provide feedback or comments regarding
// this instance of tt-rss. Can lead to a forum, contact email, etc.

define('ARTICLE_BUTTON_PLUGINS', 'note,tweet,share,mail');
// Comma-separated list of additional article action button plugins
// to enable, like tweet button, etc.
// The following plugins are available: note, tweet, share, mail
// More plugins: http://tt-rss.org/wiki/Plugins

define('CONFIG_VERSION', 26);
// Expected config version. Please update this option in config.php
// if necessary (after migrating all new options from this file).
Expand Down
Binary file removed images/art-tweet.png
Binary file not shown.
24 changes: 9 additions & 15 deletions include/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,6 @@
function __autoload($class) {
$class_file = str_replace("_", "/", strtolower(basename($class)));

$file = dirname(__FILE__)."/../plugins/$class_file.php";

if (file_exists($file)) {
require $file;
return;
}

$file = dirname(__FILE__)."/../classes/$class_file.php";

if (file_exists($file)) {
Expand Down Expand Up @@ -3265,15 +3258,10 @@ class='tagsPic' style=\"cursor : pointer\"
onclick=\"postOpenInNewTab(event, $id)\"
alt='Zoom' title='".__('Open article in new tab')."'>";

$button_plugins = explode(",", ARTICLE_BUTTON_PLUGINS);
global $pluginhost;

foreach ($button_plugins as $p) {
$pclass = "button_" . trim($p);

if (class_exists($pclass)) {
$plugin = new $pclass($link);
$rv['content'] .= $plugin->render($id, $line);
}
foreach ($pluginhost->get_hooks($pluginhost::HOOK_ARTICLE_BUTTON) as $p) {
$rv['content'] .= $p->hook_article_button($line);
}

$rv['content'] .= "<img src=\"".theme_image($link, 'images/digest_checkbox.png')."\"
Expand Down Expand Up @@ -3568,6 +3556,12 @@ function init_connection($link) {
db_query($link, "SET NAMES " . MYSQL_CHARSET);
}
}

global $pluginhost;

$pluginhost = new PluginHost($link);
$pluginhost->load(PLUGINS);

return true;
} else {
print "Unable to connect to database:" . db_last_error();
Expand Down
23 changes: 4 additions & 19 deletions include/rssfuncs.php
Original file line number Diff line number Diff line change
Expand Up @@ -399,23 +399,6 @@ function update_rss_feed($link, $feed, $ignore_daemon = false, $no_cache = false
_debug("update_rss_feed: " . count($filters) . " filters loaded.");
}

$filter_plugins = array();

if (defined('_ARTICLE_FILTER_PLUGINS')) {
foreach (explode(",", _ARTICLE_FILTER_PLUGINS) as $p) {
$pclass = "filter_" . trim($p);

if (class_exists($pclass)) {
$plugin = new $pclass($link);
array_push($filter_plugins, $plugin);
}
}
}

if ($debug_enabled) {
_debug("update_rss_feed: " . count($filter_plugins) . " filter plugins loaded.");
}

if ($use_simplepie) {
$iterator = $rss->get_items();
} else {
Expand Down Expand Up @@ -782,7 +765,9 @@ function update_rss_feed($link, $feed, $ignore_daemon = false, $no_cache = false
}

// TODO: less memory-hungry implementation
if (count($filter_plugins) > 0) {
global $pluginhost;

foreach ($pluginhost->get_hooks($pluginhost::HOOK_ARTICLE_FILTER) as $p) {
if ($debug_enabled) {
_debug("update_rss_feed: applying plugin filters...");
}
Expand All @@ -795,7 +780,7 @@ function update_rss_feed($link, $feed, $ignore_daemon = false, $no_cache = false
"author" => $entry_author);

foreach ($filter_plugins as $plugin) {
$article = $plugin->filter_article($article);
$article = $plugin->hook_article_filter($article);
}

$entry_title = $article["title"];
Expand Down
4 changes: 2 additions & 2 deletions include/sanity_config.php
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<?php # This file has been generated at: Fri Sep 7 10:20:51 MSK 2012
<?php # This file has been generated at: Sun Dec 23 13:56:09 MSK 2012
define('GENERATED_CONFIG_CHECK', 26);
$requred_defines = array( 'DB_TYPE', 'DB_HOST', 'DB_USER', 'DB_NAME', 'DB_PASS', 'MYSQL_CHARSET', 'SELF_URL_PATH', 'SINGLE_USER_MODE', 'PHP_EXECUTABLE', 'LOCK_DIRECTORY', 'CACHE_DIR', 'ICONS_DIR', 'ICONS_URL', 'AUTH_MODULES', 'AUTH_AUTO_CREATE', 'AUTH_AUTO_LOGIN', 'DEFAULT_UPDATE_METHOD', 'FORCE_ARTICLE_PURGE', 'PUBSUBHUBBUB_HUB', 'PUBSUBHUBBUB_ENABLED', 'SPHINX_ENABLED', 'SPHINX_INDEX', 'ENABLE_REGISTRATION', 'REG_NOTIFY_ADDRESS', 'REG_MAX_USERS', 'SESSION_COOKIE_LIFETIME', 'SESSION_EXPIRE_TIME', 'SESSION_CHECK_ADDRESS', 'SMTP_FROM_NAME', 'SMTP_FROM_ADDRESS', 'DIGEST_SUBJECT', 'SMTP_HOST', 'SMTP_LOGIN', 'SMTP_PASSWORD', 'CHECK_FOR_NEW_VERSION', 'ENABLE_GZIP_OUTPUT', 'FEEDBACK_URL', 'ARTICLE_BUTTON_PLUGINS', 'CONFIG_VERSION'); ?>
$requred_defines = array( 'DB_TYPE', 'DB_HOST', 'DB_USER', 'DB_NAME', 'DB_PASS', 'MYSQL_CHARSET', 'SELF_URL_PATH', 'SINGLE_USER_MODE', 'PHP_EXECUTABLE', 'LOCK_DIRECTORY', 'CACHE_DIR', 'ICONS_DIR', 'ICONS_URL', 'AUTH_MODULES', 'AUTH_AUTO_CREATE', 'AUTH_AUTO_LOGIN', 'DEFAULT_UPDATE_METHOD', 'FORCE_ARTICLE_PURGE', 'PUBSUBHUBBUB_HUB', 'PUBSUBHUBBUB_ENABLED', 'SPHINX_ENABLED', 'SPHINX_INDEX', 'ENABLE_REGISTRATION', 'REG_NOTIFY_ADDRESS', 'REG_MAX_USERS', 'SESSION_COOKIE_LIFETIME', 'SESSION_EXPIRE_TIME', 'SESSION_CHECK_ADDRESS', 'SMTP_FROM_NAME', 'SMTP_FROM_ADDRESS', 'DIGEST_SUBJECT', 'SMTP_HOST', 'SMTP_LOGIN', 'SMTP_PASSWORD', 'CHECK_FOR_NEW_VERSION', 'ENABLE_GZIP_OUTPUT', 'FEEDBACK_URL', 'CONFIG_VERSION'); ?>
9 changes: 5 additions & 4 deletions index.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,11 @@
<?php
require 'lib/jsmin.php';

foreach (explode(",", ARTICLE_BUTTON_PLUGINS) as $p) {
$jsf = "js/".trim($p)."_button.js";
if (file_exists($jsf)) {
echo JSMin::minify(file_get_contents($jsf));
global $pluginhost;

foreach ($pluginhost->get_plugins() as $n => $p) {
if (method_exists($p, "get_js")) {
echo JSMin::minify($p->get_js());
}
}

Expand Down
31 changes: 0 additions & 31 deletions js/tweet_button.js

This file was deleted.

1 change: 1 addition & 0 deletions plugins/mail/README.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Shares article by email
4 changes: 2 additions & 2 deletions js/mail_button.js → plugins/mail/mail.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ function emailArticle(id) {
if (dijit.byId("emailArticleDlg"))
dijit.byId("emailArticleDlg").destroyRecursive();

var query = "backend.php?op=rpc&method=buttonPlugin&plugin=mail&plugin_method=emailArticle&param=" + param_escape(id);
var query = "backend.php?op=pluginhandler&plugin=mail&method=emailArticle&param=" + param_escape(id);

dialog = new dijit.Dialog({
id: "emailArticleDlg",
Expand Down Expand Up @@ -47,7 +47,7 @@ function emailArticle(id) {
dojo.disconnect(tmph);

new Ajax.Autocompleter('emailArticleDlg_destination', 'emailArticleDlg_dst_choices',
"backend.php?op=rpc&method=buttonPlugin&plugin=mail&plugin_method=completeEmails",
"backend.php?op=pluginhandler&plugin=mail&method=completeEmails",
{ tokens: '', paramName: "search" });
});

Expand Down
Loading

0 comments on commit 19c7350

Please sign in to comment.