lots of docs, and some internal changes
This commit is contained in:
parent
2471a8e2eb
commit
572f84511a
37 changed files with 198 additions and 167 deletions
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class DowntimeTest extends ShimmieWebTestCase {
|
||||
class DowntimeTest extends SCoreWebTestCase {
|
||||
function testDowntime() {
|
||||
$this->log_in_as_admin();
|
||||
$this->get_page("setup");
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
class DowntimeTheme Extends Themelet {
|
||||
/*
|
||||
/**
|
||||
* Show the admin that downtime mode is enabled
|
||||
*/
|
||||
public function display_notification(Page $page) {
|
||||
|
@ -9,7 +9,7 @@ class DowntimeTheme Extends Themelet {
|
|||
"<span style='font-size: 1.5em'><b>DOWNTIME MODE IS ON!</b></span>", "left", 0));
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Display $message and exit
|
||||
*/
|
||||
public function display_message($message) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class IPBanTest extends ShimmieWebTestCase {
|
||||
class IPBanTest extends SCoreWebTestCase {
|
||||
function testIPBan() {
|
||||
$this->get_page('ip_ban/list');
|
||||
$this->assertResponse(403);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class NewsTest extends ShimmieWebTestCase {
|
||||
class NewsTest extends SCoreWebTestCase {
|
||||
function testNews() {
|
||||
$this->log_in_as_admin();
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class PMTest extends ShimmieWebTestCase {
|
||||
class PMTest extends SCoreWebTestCase {
|
||||
function testPM() {
|
||||
$this->log_in_as_admin();
|
||||
$this->get_page("user/test");
|
||||
|
|
|
@ -19,14 +19,10 @@
|
|||
* <code>/random_image/download/size:1024x768+cute</code>
|
||||
*/
|
||||
|
||||
class RandomImage implements Extension {
|
||||
var $theme;
|
||||
|
||||
public function receive_event(Event $event) {
|
||||
class RandomImage extends SimpleExtension {
|
||||
public function onPageRequest($event) {
|
||||
global $config, $database, $page, $user;
|
||||
if(is_null($this->theme)) $this->theme = get_theme_object($this);
|
||||
|
||||
if(($event instanceof PageRequestEvent) && $event->page_matches("random_image")) {
|
||||
if($event->page_matches("random_image")) {
|
||||
if($event->count_args() == 1) {
|
||||
$action = $event->get_arg(0);
|
||||
$search_terms = array();
|
||||
|
@ -50,22 +46,22 @@ class RandomImage implements Extension {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(($event instanceof SetupBuildingEvent)) {
|
||||
$sb = new SetupBlock("Random Image");
|
||||
$sb->add_bool_option("show_random_block", "Show Random Block: ");
|
||||
$event->panel->add_block($sb);
|
||||
}
|
||||
public function onSetupBuilding($event) {
|
||||
$sb = new SetupBlock("Random Image");
|
||||
$sb->add_bool_option("show_random_block", "Show Random Block: ");
|
||||
$event->panel->add_block($sb);
|
||||
}
|
||||
|
||||
if($event instanceof PostListBuildingEvent) {
|
||||
if($config->get_bool("show_random_block")) {
|
||||
$image = Image::by_random($event->search_terms);
|
||||
if(!is_null($image)) {
|
||||
$this->theme->display_random($page, $image);
|
||||
}
|
||||
public function onPostListBuilding($event) {
|
||||
global $config, $page;
|
||||
if($config->get_bool("show_random_block")) {
|
||||
$image = Image::by_random($event->search_terms);
|
||||
if(!is_null($image)) {
|
||||
$this->theme->display_random($page, $image);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
add_event_listener(new RandomImage());
|
||||
?>
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*
|
||||
* Each extension should (although doesn't technically have to) come with a
|
||||
* test.php file, for example ext/index/test.php. The SimpleSCoreTest
|
||||
* extension will look for these files and load any ScoreWebTestCase classes
|
||||
* extension will look for these files and load any SCoreWebTestCase classes
|
||||
* it finds inside them, then run them and report whether or not the test
|
||||
* passes.
|
||||
*
|
||||
|
@ -28,6 +28,9 @@ define('USER_PASS', "test");
|
|||
define('ADMIN_NAME', "demo");
|
||||
define('ADMIN_PASS', "demo");
|
||||
|
||||
/**
|
||||
* A set of common SCore activities to test
|
||||
*/
|
||||
class SCoreWebTestCase extends WebTestCase {
|
||||
protected function get_page($page) {
|
||||
$url = "http://".$_SERVER["HTTP_HOST"].get_base_href().'/'.make_link($page);
|
||||
|
@ -62,6 +65,9 @@ class SCoreWebTestCase extends WebTestCase {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A set of common Shimmie activities to test
|
||||
*/
|
||||
class ShimmieWebTestCase extends SCoreWebTestCase {
|
||||
protected function post_image($filename, $tags) {
|
||||
$image_id = -1;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
class SimpleSCoreTestTheme extends Themelet {
|
||||
}
|
||||
|
||||
/** @private */
|
||||
class SCoreReporter extends HtmlReporter {
|
||||
var $current_html = "";
|
||||
var $clear_modules = array();
|
||||
|
|
|
@ -8,22 +8,19 @@
|
|||
* This extension sets the "description" meta tag in the header
|
||||
* of pages so that search engines can pick it up
|
||||
*/
|
||||
class SiteDescription implements Extension {
|
||||
public function receive_event(Event $event) {
|
||||
global $config, $database, $page, $user;
|
||||
if($event instanceof PageRequestEvent) {
|
||||
if(strlen($config->get_string("site_description")) > 0) {
|
||||
$description = $config->get_string("site_description");
|
||||
$page->add_header("<meta name=\"description\" content=\"$description\">");
|
||||
}
|
||||
}
|
||||
|
||||
if($event instanceof SetupBuildingEvent) {
|
||||
$sb = new SetupBlock("Site Description");
|
||||
$sb->add_longtext_option("site_description");
|
||||
$event->panel->add_block($sb);
|
||||
class SiteDescription extends SimpleExtension {
|
||||
public function onPageRequest(PageRequestEvent $event) {
|
||||
global $config, $page;
|
||||
if(strlen($config->get_string("site_description")) > 0) {
|
||||
$description = $config->get_string("site_description");
|
||||
$page->add_header("<meta name=\"description\" content=\"$description\">");
|
||||
}
|
||||
}
|
||||
|
||||
public function onSetupBuilding(SetupBuildingEvent $event) {
|
||||
$sb = new SetupBlock("Site Description");
|
||||
$sb->add_longtext_option("site_description");
|
||||
$event->panel->add_block($sb);
|
||||
}
|
||||
}
|
||||
add_event_listener(new SiteDescription());
|
||||
?>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class SiteDescriptionTest extends ShimmieWebTestCase {
|
||||
class SiteDescriptionTest extends SCoreWebTestCase {
|
||||
function testSiteDescription() {
|
||||
$this->log_in_as_admin();
|
||||
$this->get_page('setup');
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class WikiTest extends ShimmieWebTestCase {
|
||||
class WikiTest extends SCoreWebTestCase {
|
||||
function testWiki() {
|
||||
$this->log_in_as_admin();
|
||||
$this->get_page("wiki");
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
class WikiTheme {
|
||||
class WikiTheme extends Themelet {
|
||||
/*
|
||||
* Show a page
|
||||
*
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
<?php
|
||||
/**
|
||||
* @package SCore
|
||||
*/
|
||||
|
||||
/**
|
||||
* A basic chunk of a page
|
||||
*/
|
||||
|
@ -10,20 +6,20 @@ class Block {
|
|||
/**
|
||||
* The block's title
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
var $header;
|
||||
/**
|
||||
* The content
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
var $body;
|
||||
/**
|
||||
* Where the block should be placed. The default theme supports
|
||||
* "main" and "left", other themes can add their own areas
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
var $section;
|
||||
/**
|
||||
|
@ -31,7 +27,7 @@ class Block {
|
|||
* numbers appear lower. The scale is 0-100 by convention,
|
||||
* though any number or string will work.
|
||||
*
|
||||
* @var int
|
||||
* @retval int
|
||||
*/
|
||||
var $position;
|
||||
|
||||
|
|
|
@ -3,17 +3,13 @@
|
|||
* Functions which are only in some versions of PHP,
|
||||
* or only implemented on some platforms
|
||||
*
|
||||
* @ignore
|
||||
* @package SCore
|
||||
* \privatesection
|
||||
*/
|
||||
|
||||
# (PHP 5 >= 5.2.1)
|
||||
# Based on http://www.phpit.net/
|
||||
# article/creating-zip-tar-archives-dynamically-php/2/
|
||||
if(!function_exists('sys_get_temp_dir')) {
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
function sys_get_temp_dir() {
|
||||
// Try to get from environment variable
|
||||
if(!empty($_ENV['TMP'])) {
|
||||
|
@ -46,9 +42,6 @@ function sys_get_temp_dir() {
|
|||
# (PHP >= 5.1)
|
||||
# from http://www.php.net/inet_pton
|
||||
if(!function_exists('inet_pton')) {
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
function inet_pton($ip) {
|
||||
# ipv4
|
||||
if(strpos($ip, '.') !== FALSE) {
|
||||
|
@ -70,9 +63,6 @@ function inet_pton($ip) {
|
|||
# (PHP >= 5.1)
|
||||
# from http://www.php.net/inet_ntop
|
||||
if(!function_exists('inet_ntop')) {
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
function inet_ntop($ip) {
|
||||
if (strlen($ip)==4) {
|
||||
// ipv4
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
<?php
|
||||
/**
|
||||
* @package SCore
|
||||
*/
|
||||
|
||||
/**
|
||||
* an abstract interface for altering a name:value pair list
|
||||
*/
|
||||
|
@ -29,8 +25,6 @@ interface Config {
|
|||
/**
|
||||
* Common methods for manipulating the list, loading and saving is
|
||||
* left to the concrete implementation
|
||||
*
|
||||
* @ignore
|
||||
*/
|
||||
abstract class BaseConfig implements Config {
|
||||
var $values = array();
|
||||
|
@ -106,8 +100,6 @@ abstract class BaseConfig implements Config {
|
|||
* $config['foo'] = "bar";
|
||||
* $config['baz'] = "qux";
|
||||
* ?>
|
||||
*
|
||||
* @ignore
|
||||
*/
|
||||
class StaticConfig extends BaseConfig {
|
||||
public function __construct($filename) {
|
||||
|
@ -135,12 +127,12 @@ class StaticConfig extends BaseConfig {
|
|||
* Loads the config list from a table in a given database, the table should
|
||||
* be called config and have the schema:
|
||||
*
|
||||
* \code
|
||||
* CREATE TABLE config(
|
||||
* name VARCHAR(255) NOT NULL,
|
||||
* value TEXT
|
||||
* );
|
||||
*
|
||||
* @ignore
|
||||
* \endcode
|
||||
*/
|
||||
class DatabaseConfig extends BaseConfig {
|
||||
var $database = null;
|
||||
|
|
|
@ -1,16 +1,10 @@
|
|||
<?php
|
||||
/**
|
||||
* @package SCore
|
||||
*/
|
||||
|
||||
require_once "compat.inc.php";
|
||||
$ADODB_CACHE_DIR=sys_get_temp_dir();
|
||||
require_once "lib/adodb/adodb.inc.php";
|
||||
require_once "lib/adodb/adodb-exceptions.inc.php";
|
||||
|
||||
/**#@+
|
||||
* @ignore
|
||||
*/
|
||||
/** @privatesection */
|
||||
// Querylet {{{
|
||||
class Querylet {
|
||||
var $sql;
|
||||
|
@ -202,7 +196,7 @@ class MemCache implements CacheEngine {
|
|||
public function get_misses() {return $this->misses;}
|
||||
}
|
||||
// }}}
|
||||
/**#@-*/
|
||||
/** @publicsection */
|
||||
|
||||
/**
|
||||
* A class for controlled database access
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
<?php
|
||||
/**
|
||||
* @package SCore
|
||||
*/
|
||||
|
||||
/**
|
||||
* Generic parent class for all events.
|
||||
*
|
||||
|
@ -113,28 +109,28 @@ class LogEvent extends Event {
|
|||
/**
|
||||
* a category, normally the extension name
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
var $section;
|
||||
|
||||
/**
|
||||
* See python...
|
||||
*
|
||||
* @var int
|
||||
* @retval int
|
||||
*/
|
||||
var $priority = 0;
|
||||
|
||||
/**
|
||||
* Free text to be logged
|
||||
*
|
||||
* @var text
|
||||
* @retval text
|
||||
*/
|
||||
var $message;
|
||||
|
||||
/**
|
||||
* The time that the event was created
|
||||
*
|
||||
* @var int
|
||||
* @retval int
|
||||
*/
|
||||
var $time;
|
||||
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
<?php
|
||||
/**
|
||||
* @package SCore
|
||||
*/
|
||||
|
||||
/**
|
||||
* A base exception to be caught by the upper levels
|
||||
*/
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* \page events Events and Extensions
|
||||
* \page eande Events and Extensions
|
||||
*
|
||||
* An event is a little blob of data saying "something happened", possibly
|
||||
* "something happened, here's the specific data". Events are sent with the
|
||||
|
@ -20,6 +20,46 @@
|
|||
* SimpleExtension subclasses are slightly different -- they are registered
|
||||
* automatically, and events are sent to a named method, eg PageRequestEvent
|
||||
* will be sent to onPageRequest()
|
||||
*
|
||||
*
|
||||
* \page hello The Hello World Extension
|
||||
*
|
||||
* \code
|
||||
* // ext/hello/main.php
|
||||
* public class Hello extends SimpleExtension {
|
||||
* public void onPageRequest(PageRequestEvent $event) {
|
||||
* global $page, $user;
|
||||
* $this->theme->display_hello($page, $user);
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* // ext/hello/theme.php
|
||||
* public class HelloTheme extends Themelet {
|
||||
* public void display_hello(Page $page, User $user) {
|
||||
* $page->add_block(new Block("Hello!", "Hello there ".html_escape($user->name));
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* // ext/hello/test.php
|
||||
* public class HelloTest extends ShimmieWebTestCase {
|
||||
* public void testHello() {
|
||||
* $this->get_page("post/list");
|
||||
* $this->assertText("Hello there");
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* // themes/mytheme/hello.theme.php
|
||||
* public class CustomHelloTheme extends HelloTheme {
|
||||
* public function display_hello(Page $page, User $user) {
|
||||
* $h_user = html_escape($user->name);
|
||||
* $page->add_block(new Block(
|
||||
* "Hello!",
|
||||
* "Hello there $h_user, look at my snazzy custom theme!"
|
||||
* );
|
||||
* }
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -38,7 +78,7 @@ interface Extension {
|
|||
* priority, so no need for register_extension(new Foo())
|
||||
*
|
||||
* Hopefully this removes as much copy & paste code from the extension
|
||||
* files as possible \o/
|
||||
* files as possible~
|
||||
*
|
||||
* The original concept came from Artanis's SimpleExtension extension
|
||||
* --> http://github.com/Artanis/simple-extension/tree/master
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
/**
|
||||
* All the imageboard-specific bits of code should be in this file, everything
|
||||
* else in /core should be standard SCore bits.
|
||||
*
|
||||
* @package SCore
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -57,7 +55,7 @@ class Image {
|
|||
/**
|
||||
* Find an image by ID
|
||||
*
|
||||
* @var Image
|
||||
* @retval Image
|
||||
*/
|
||||
public static function by_id($id) {
|
||||
assert(is_numeric($id));
|
||||
|
@ -70,7 +68,7 @@ class Image {
|
|||
/**
|
||||
* Find an image by hash
|
||||
*
|
||||
* @var Image
|
||||
* @retval Image
|
||||
*/
|
||||
public static function by_hash($hash) {
|
||||
assert(is_string($hash));
|
||||
|
@ -83,7 +81,7 @@ class Image {
|
|||
/**
|
||||
* Pick a random image out of a set
|
||||
*
|
||||
* @var Image
|
||||
* @retval Image
|
||||
*/
|
||||
public static function by_random($tags=array()) {
|
||||
assert(is_array($tags));
|
||||
|
@ -160,7 +158,7 @@ class Image {
|
|||
* Rather than simply $this_id + 1, one must take into account
|
||||
* deleted images and search queries
|
||||
*
|
||||
* @var Image
|
||||
* @retval Image
|
||||
*/
|
||||
public function get_next($tags=array(), $next=true) {
|
||||
assert(is_array($tags));
|
||||
|
@ -192,7 +190,7 @@ class Image {
|
|||
/**
|
||||
* The reverse of get_next
|
||||
*
|
||||
* @var Image
|
||||
* @retval Image
|
||||
*/
|
||||
public function get_prev($tags=array()) {
|
||||
return $this->get_next($tags, false);
|
||||
|
@ -201,7 +199,7 @@ class Image {
|
|||
/**
|
||||
* Find the User who owns this Image
|
||||
*
|
||||
* @var User
|
||||
* @retval User
|
||||
*/
|
||||
public function get_owner() {
|
||||
return User::by_id($this->owner_id);
|
||||
|
@ -238,7 +236,7 @@ class Image {
|
|||
/**
|
||||
* Get the URL for the full size image
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_image_link() {
|
||||
global $config;
|
||||
|
@ -257,7 +255,7 @@ class Image {
|
|||
* Get a short link to the full size image
|
||||
*
|
||||
* @deprecated
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_short_link() {
|
||||
global $config;
|
||||
|
@ -267,7 +265,7 @@ class Image {
|
|||
/**
|
||||
* Get the URL for the thumbnail
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_thumb_link() {
|
||||
global $config;
|
||||
|
@ -286,7 +284,7 @@ class Image {
|
|||
* Get the tooltip for this image, formatted according to the
|
||||
* configured template
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_tooltip() {
|
||||
global $config;
|
||||
|
@ -296,7 +294,7 @@ class Image {
|
|||
/**
|
||||
* Figure out where the full size image is on disk
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_image_filename() {
|
||||
$hash = $this->hash;
|
||||
|
@ -308,7 +306,7 @@ class Image {
|
|||
/**
|
||||
* Figure out where the thumbnail is on disk
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_thumb_filename() {
|
||||
$hash = $this->hash;
|
||||
|
@ -319,7 +317,7 @@ class Image {
|
|||
/**
|
||||
* Get the original filename
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_filename() {
|
||||
return $this->filename;
|
||||
|
@ -330,7 +328,7 @@ class Image {
|
|||
*
|
||||
* FIXME: now we handle more than just images
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_mime_type() {
|
||||
return "image/".($this->ext);
|
||||
|
@ -339,7 +337,7 @@ class Image {
|
|||
/**
|
||||
* Get the image's filename extension
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_ext() {
|
||||
return $this->ext;
|
||||
|
@ -348,7 +346,7 @@ class Image {
|
|||
/**
|
||||
* Get the image's source URL
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function get_source() {
|
||||
return $this->source;
|
||||
|
@ -433,9 +431,9 @@ class Image {
|
|||
}
|
||||
|
||||
/**
|
||||
* ...?
|
||||
* Someone please explain this
|
||||
*
|
||||
* @var string
|
||||
* @retval string
|
||||
*/
|
||||
public function parse_link_template($tmpl, $_escape="url_escape") {
|
||||
global $config;
|
||||
|
|
|
@ -12,6 +12,18 @@
|
|||
* wants to display something, it should pass the $page data structure along
|
||||
* with the data to be displayed to the theme object, and the theme will add
|
||||
* the data into the page.
|
||||
*
|
||||
* A page should make sure that all the data it outputs is free from dangerous
|
||||
* data by using html_escape(), url_escape(), or int_escape() as appropriate.
|
||||
*
|
||||
* Because some HTML can be placed anywhere according to the theme, coming up
|
||||
* with the correct way to link to a page can be hard -- thus we have the
|
||||
* make_link() function, which will take a path like "post/list" and turn it
|
||||
* into a full and correct link, eg /myboard/post/list, /foo/index.php?q=post/list,
|
||||
* etc depending on how things are set up. This should always be used to link
|
||||
* to pages rather than hardcoding a path.
|
||||
*
|
||||
* Various other common functions are available as part of the Themelet class.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -19,9 +31,9 @@
|
|||
* A data structure for holding all the bits of data that make up a page.
|
||||
*
|
||||
* The various extensions all add whatever they want to this structure,
|
||||
* then layout.class.php turns it into HTML
|
||||
* then Layout turns it into HTML
|
||||
*/
|
||||
class GenericPage {
|
||||
class Page {
|
||||
var $mode = "page";
|
||||
var $type = "text/html";
|
||||
|
||||
|
|
|
@ -1,11 +1,5 @@
|
|||
<?php
|
||||
/**
|
||||
* @package SCore
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
/** @private */
|
||||
function _new_user($row) {
|
||||
return new User($row);
|
||||
}
|
||||
|
@ -94,7 +88,7 @@ class User {
|
|||
/**
|
||||
* Test if this user is anonymous (not logged in)
|
||||
*
|
||||
* @var bool
|
||||
* @retval bool
|
||||
*/
|
||||
public function is_anonymous() {
|
||||
global $config;
|
||||
|
@ -104,7 +98,7 @@ class User {
|
|||
/**
|
||||
* Test if this user is an administrator
|
||||
*
|
||||
* @var bool
|
||||
* @retval bool
|
||||
*/
|
||||
public function is_admin() {
|
||||
return $this->admin;
|
||||
|
|
|
@ -1,9 +1,4 @@
|
|||
<?php
|
||||
/**
|
||||
* @package SCore
|
||||
*/
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
|
||||
* Input / Output Sanitising *
|
||||
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
@ -219,7 +214,7 @@ function get_theme_object(Extension $class, $fatal=true) {
|
|||
*
|
||||
* @retval int
|
||||
*/
|
||||
function blockcmp($a, $b) {
|
||||
function blockcmp(Block $a, Block $b) {
|
||||
if($a->position == $b->position) {
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
* Description: A thing for point & click extension management
|
||||
*/
|
||||
|
||||
class ExtensionInfo { // {{{
|
||||
/** @private */
|
||||
class ExtensionInfo {
|
||||
var $ext_name, $name, $link, $author, $email, $description, $documentation, $version;
|
||||
|
||||
function ExtensionInfo($main) {
|
||||
|
@ -66,7 +67,7 @@ class ExtensionInfo { // {{{
|
|||
private function is_enabled($fname) {
|
||||
return file_exists("ext/$fname");
|
||||
}
|
||||
} // }}}
|
||||
}
|
||||
|
||||
class ExtManager extends SimpleExtension {
|
||||
public function onPageRequest($event) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class ExtManagerTest extends ShimmieWebTestCase {
|
||||
class ExtManagerTest extends SCoreWebTestCase {
|
||||
function testAuth() {
|
||||
$this->get_page('ext_manager');
|
||||
$this->assertResponse(403);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class Handle404Test extends ShimmieWebTestCase {
|
||||
class Handle404Test extends SCoreWebTestCase {
|
||||
function test404Handler() {
|
||||
$this->get_page('not/a/page');
|
||||
$this->assertResponse(404);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class SetupTest extends ShimmieWebTestCase {
|
||||
class SetupTest extends SCoreWebTestCase {
|
||||
function testAuth() {
|
||||
$this->get_page('setup');
|
||||
$this->assertResponse(403);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class UserPageTest extends ShimmieWebTestCase {
|
||||
class UserPageTest extends SCoreWebTestCase {
|
||||
function testUserPage() {
|
||||
$this->get_page('user');
|
||||
$this->assertTitle("Not Logged In");
|
||||
|
|
38
index.php
38
index.php
|
@ -1,16 +1,44 @@
|
|||
<?php
|
||||
/**
|
||||
* \mainpage Shimmie2 / SCore Documentation
|
||||
*
|
||||
* SCore is a framework designed for writing flexible, extendable applications.
|
||||
* Whereas most PHP apps are built monolithicly, score's event-based nature
|
||||
* allows parts to be mixed and matched. For instance, the most famous
|
||||
* collection of score extensions is the Shimmie image board, which includes
|
||||
* user management, a wiki, a private messaging system, etc. But one could
|
||||
* easily remove the image board bits and simply have a wiki with users and
|
||||
* PMs; or one could replace it with a blog module; or one could have a blog
|
||||
* which links to images on an image board, with no wiki or messaging, and so
|
||||
* on and so on...
|
||||
*
|
||||
* To learn about the innards of SCore, start with the \ref overview.
|
||||
*
|
||||
*
|
||||
* \page overview High Level Overview
|
||||
*
|
||||
* Dijkstra will kill me for personifying my architecture, but I can't think
|
||||
* of a better way without going into all the little details.
|
||||
*
|
||||
* There are a bunch of Extension subclasses, they talk to eachother by sending
|
||||
* and recieving Event subclasses. The topic of conversation is decided by the
|
||||
* initial PageRequestEvent, and each extension puts its notes into the shared
|
||||
* Page data store. Once the conversation is over, the Page is passed to the
|
||||
* current theme's Layout class which will tidy up the data and present it to
|
||||
* the user.
|
||||
*
|
||||
*
|
||||
* \page globals Globals
|
||||
* To learn more about the architecture:
|
||||
*
|
||||
* \li \ref eande
|
||||
* \li \ref themes
|
||||
*
|
||||
* To learn more about practical development:
|
||||
*
|
||||
* \li \ref scglobals
|
||||
* \li \ref unittests
|
||||
* \li \ref hello
|
||||
*
|
||||
* \page scglobals SCore Globals
|
||||
*
|
||||
* There are four global variables which are pretty essential to most extensions:
|
||||
*
|
||||
|
@ -18,6 +46,8 @@
|
|||
* \li $database -- a Database object used to get raw SQL access
|
||||
* \li $page -- a Page to holds all the loose bits of extension output
|
||||
* \li $user -- the currently logged in User
|
||||
*
|
||||
* Each of these can be imported at the start of a function with eg "global $page, $user;"
|
||||
*/
|
||||
|
||||
// set up and purify the environment
|
||||
|
@ -52,7 +82,7 @@ try {
|
|||
// load the theme parts
|
||||
$_theme = $config->get_string("theme", "default");
|
||||
if(!file_exists("themes/$_theme")) $_theme = "default";
|
||||
require_once "themes/$_theme/page.class.php";
|
||||
if(file_exists("themes/$_theme/page.class.php")) require_once "themes/$_theme/page.class.php";
|
||||
require_once "themes/$_theme/layout.class.php";
|
||||
require_once "themes/$_theme/themelet.class.php";
|
||||
|
||||
|
@ -84,7 +114,7 @@ try {
|
|||
|
||||
|
||||
// start the page generation waterfall
|
||||
$page = new Page();
|
||||
$page = class_exists("CustomPage") ? new CustomPage() : new Page();
|
||||
$user = _get_user($config, $database);
|
||||
send_event(new InitExtEvent());
|
||||
send_event(_get_page_request());
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
class Page extends GenericPage {
|
||||
class CustomPage extends Page {
|
||||
var $left_enabled = true;
|
||||
public function disable_left() {
|
||||
$this->left_enabled = false;
|
|
@ -1,7 +1,12 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* A class to turn a Page data structure into a blob of HTML
|
||||
*/
|
||||
class Layout {
|
||||
function display_page($page) {
|
||||
/**
|
||||
* turns the Page into HTML
|
||||
*/
|
||||
public function display_page(Page $page) {
|
||||
global $config;
|
||||
|
||||
$theme_name = $config->get_string('theme', 'default');
|
||||
|
@ -71,7 +76,10 @@ $header_html
|
|||
EOD;
|
||||
}
|
||||
|
||||
function block_to_html($block, $hidable=false, $salt="") {
|
||||
/**
|
||||
* A handy function which does exactly what it says in the method name
|
||||
*/
|
||||
private function block_to_html($block, $hidable=false, $salt="") {
|
||||
$h = $block->header;
|
||||
$b = $block->body;
|
||||
$html = "";
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
<?php
|
||||
|
||||
class Page extends GenericPage {
|
||||
// no changes from default
|
||||
}
|
||||
?>
|
|
@ -1,6 +1,11 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* A customised version of the Setup theme
|
||||
*/
|
||||
class CustomSetupTheme extends SetupTheme {
|
||||
/**
|
||||
* Turn a SetupBlock into HTML... with rounded corners.
|
||||
*/
|
||||
protected function sb_to_html(SetupBlock $block) {
|
||||
return "
|
||||
<div class='rr setupblock'>
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* A collection of common functions for theme parts
|
||||
*/
|
||||
class Themelet {
|
||||
/**
|
||||
* Generic error message display
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
class Page extends GenericPage {
|
||||
class CustomPage extends Page {
|
||||
var $left_enabled = true;
|
||||
public function disable_left() {
|
||||
$this->left_enabled = false;
|
|
@ -1,6 +0,0 @@
|
|||
<?php
|
||||
|
||||
class Page extends GenericPage {
|
||||
// no changes from default
|
||||
}
|
||||
?>
|
|
@ -1,6 +0,0 @@
|
|||
<?php
|
||||
|
||||
class Page extends GenericPage {
|
||||
// no changes from default
|
||||
}
|
||||
?>
|
Reference in a new issue