lots of docs, and some internal changes

This commit is contained in:
Shish 2009-07-21 07:36:12 +01:00
parent 2471a8e2eb
commit 572f84511a
37 changed files with 198 additions and 167 deletions

View file

@ -1,5 +1,5 @@
<?php <?php
class DowntimeTest extends ShimmieWebTestCase { class DowntimeTest extends SCoreWebTestCase {
function testDowntime() { function testDowntime() {
$this->log_in_as_admin(); $this->log_in_as_admin();
$this->get_page("setup"); $this->get_page("setup");

View file

@ -1,7 +1,7 @@
<?php <?php
class DowntimeTheme Extends Themelet { class DowntimeTheme Extends Themelet {
/* /**
* Show the admin that downtime mode is enabled * Show the admin that downtime mode is enabled
*/ */
public function display_notification(Page $page) { 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)); "<span style='font-size: 1.5em'><b>DOWNTIME MODE IS ON!</b></span>", "left", 0));
} }
/* /**
* Display $message and exit * Display $message and exit
*/ */
public function display_message($message) { public function display_message($message) {

View file

@ -1,5 +1,5 @@
<?php <?php
class IPBanTest extends ShimmieWebTestCase { class IPBanTest extends SCoreWebTestCase {
function testIPBan() { function testIPBan() {
$this->get_page('ip_ban/list'); $this->get_page('ip_ban/list');
$this->assertResponse(403); $this->assertResponse(403);

View file

@ -1,5 +1,5 @@
<?php <?php
class NewsTest extends ShimmieWebTestCase { class NewsTest extends SCoreWebTestCase {
function testNews() { function testNews() {
$this->log_in_as_admin(); $this->log_in_as_admin();

View file

@ -1,5 +1,5 @@
<?php <?php
class PMTest extends ShimmieWebTestCase { class PMTest extends SCoreWebTestCase {
function testPM() { function testPM() {
$this->log_in_as_admin(); $this->log_in_as_admin();
$this->get_page("user/test"); $this->get_page("user/test");

View file

@ -19,14 +19,10 @@
* <code>/random_image/download/size:1024x768+cute</code> * <code>/random_image/download/size:1024x768+cute</code>
*/ */
class RandomImage implements Extension { class RandomImage extends SimpleExtension {
var $theme; public function onPageRequest($event) {
public function receive_event(Event $event) {
global $config, $database, $page, $user; global $config, $database, $page, $user;
if(is_null($this->theme)) $this->theme = get_theme_object($this); if($event->page_matches("random_image")) {
if(($event instanceof PageRequestEvent) && $event->page_matches("random_image")) {
if($event->count_args() == 1) { if($event->count_args() == 1) {
$action = $event->get_arg(0); $action = $event->get_arg(0);
$search_terms = array(); $search_terms = array();
@ -50,22 +46,22 @@ class RandomImage implements Extension {
} }
} }
} }
}
if(($event instanceof SetupBuildingEvent)) { public function onSetupBuilding($event) {
$sb = new SetupBlock("Random Image"); $sb = new SetupBlock("Random Image");
$sb->add_bool_option("show_random_block", "Show Random Block: "); $sb->add_bool_option("show_random_block", "Show Random Block: ");
$event->panel->add_block($sb); $event->panel->add_block($sb);
} }
if($event instanceof PostListBuildingEvent) { public function onPostListBuilding($event) {
if($config->get_bool("show_random_block")) { global $config, $page;
$image = Image::by_random($event->search_terms); if($config->get_bool("show_random_block")) {
if(!is_null($image)) { $image = Image::by_random($event->search_terms);
$this->theme->display_random($page, $image); if(!is_null($image)) {
} $this->theme->display_random($page, $image);
} }
} }
} }
} }
add_event_listener(new RandomImage());
?> ?>

View file

@ -11,7 +11,7 @@
* *
* Each extension should (although doesn't technically have to) come with a * Each extension should (although doesn't technically have to) come with a
* test.php file, for example ext/index/test.php. The SimpleSCoreTest * 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 * it finds inside them, then run them and report whether or not the test
* passes. * passes.
* *
@ -28,6 +28,9 @@ define('USER_PASS', "test");
define('ADMIN_NAME', "demo"); define('ADMIN_NAME', "demo");
define('ADMIN_PASS', "demo"); define('ADMIN_PASS', "demo");
/**
* A set of common SCore activities to test
*/
class SCoreWebTestCase extends WebTestCase { class SCoreWebTestCase extends WebTestCase {
protected function get_page($page) { protected function get_page($page) {
$url = "http://".$_SERVER["HTTP_HOST"].get_base_href().'/'.make_link($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 { class ShimmieWebTestCase extends SCoreWebTestCase {
protected function post_image($filename, $tags) { protected function post_image($filename, $tags) {
$image_id = -1; $image_id = -1;

View file

@ -2,6 +2,7 @@
class SimpleSCoreTestTheme extends Themelet { class SimpleSCoreTestTheme extends Themelet {
} }
/** @private */
class SCoreReporter extends HtmlReporter { class SCoreReporter extends HtmlReporter {
var $current_html = ""; var $current_html = "";
var $clear_modules = array(); var $clear_modules = array();

View file

@ -8,22 +8,19 @@
* This extension sets the "description" meta tag in the header * This extension sets the "description" meta tag in the header
* of pages so that search engines can pick it up * of pages so that search engines can pick it up
*/ */
class SiteDescription implements Extension { class SiteDescription extends SimpleExtension {
public function receive_event(Event $event) { public function onPageRequest(PageRequestEvent $event) {
global $config, $database, $page, $user; global $config, $page;
if($event instanceof PageRequestEvent) { if(strlen($config->get_string("site_description")) > 0) {
if(strlen($config->get_string("site_description")) > 0) { $description = $config->get_string("site_description");
$description = $config->get_string("site_description"); $page->add_header("<meta name=\"description\" content=\"$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);
} }
} }
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());
?> ?>

View file

@ -1,5 +1,5 @@
<?php <?php
class SiteDescriptionTest extends ShimmieWebTestCase { class SiteDescriptionTest extends SCoreWebTestCase {
function testSiteDescription() { function testSiteDescription() {
$this->log_in_as_admin(); $this->log_in_as_admin();
$this->get_page('setup'); $this->get_page('setup');

View file

@ -1,5 +1,5 @@
<?php <?php
class WikiTest extends ShimmieWebTestCase { class WikiTest extends SCoreWebTestCase {
function testWiki() { function testWiki() {
$this->log_in_as_admin(); $this->log_in_as_admin();
$this->get_page("wiki"); $this->get_page("wiki");

View file

@ -1,6 +1,6 @@
<?php <?php
class WikiTheme { class WikiTheme extends Themelet {
/* /*
* Show a page * Show a page
* *

View file

@ -1,8 +1,4 @@
<?php <?php
/**
* @package SCore
*/
/** /**
* A basic chunk of a page * A basic chunk of a page
*/ */
@ -10,20 +6,20 @@ class Block {
/** /**
* The block's title * The block's title
* *
* @var string * @retval string
*/ */
var $header; var $header;
/** /**
* The content * The content
* *
* @var string * @retval string
*/ */
var $body; var $body;
/** /**
* Where the block should be placed. The default theme supports * Where the block should be placed. The default theme supports
* "main" and "left", other themes can add their own areas * "main" and "left", other themes can add their own areas
* *
* @var string * @retval string
*/ */
var $section; var $section;
/** /**
@ -31,7 +27,7 @@ class Block {
* numbers appear lower. The scale is 0-100 by convention, * numbers appear lower. The scale is 0-100 by convention,
* though any number or string will work. * though any number or string will work.
* *
* @var int * @retval int
*/ */
var $position; var $position;

View file

@ -3,17 +3,13 @@
* Functions which are only in some versions of PHP, * Functions which are only in some versions of PHP,
* or only implemented on some platforms * or only implemented on some platforms
* *
* @ignore * \privatesection
* @package SCore
*/ */
# (PHP 5 >= 5.2.1) # (PHP 5 >= 5.2.1)
# Based on http://www.phpit.net/ # Based on http://www.phpit.net/
# article/creating-zip-tar-archives-dynamically-php/2/ # article/creating-zip-tar-archives-dynamically-php/2/
if(!function_exists('sys_get_temp_dir')) { if(!function_exists('sys_get_temp_dir')) {
/**
* @ignore
*/
function sys_get_temp_dir() { function sys_get_temp_dir() {
// Try to get from environment variable // Try to get from environment variable
if(!empty($_ENV['TMP'])) { if(!empty($_ENV['TMP'])) {
@ -46,9 +42,6 @@ function sys_get_temp_dir() {
# (PHP >= 5.1) # (PHP >= 5.1)
# from http://www.php.net/inet_pton # from http://www.php.net/inet_pton
if(!function_exists('inet_pton')) { if(!function_exists('inet_pton')) {
/**
* @ignore
*/
function inet_pton($ip) { function inet_pton($ip) {
# ipv4 # ipv4
if(strpos($ip, '.') !== FALSE) { if(strpos($ip, '.') !== FALSE) {
@ -70,9 +63,6 @@ function inet_pton($ip) {
# (PHP >= 5.1) # (PHP >= 5.1)
# from http://www.php.net/inet_ntop # from http://www.php.net/inet_ntop
if(!function_exists('inet_ntop')) { if(!function_exists('inet_ntop')) {
/**
* @ignore
*/
function inet_ntop($ip) { function inet_ntop($ip) {
if (strlen($ip)==4) { if (strlen($ip)==4) {
// ipv4 // ipv4

View file

@ -1,8 +1,4 @@
<?php <?php
/**
* @package SCore
*/
/** /**
* an abstract interface for altering a name:value pair list * 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 * Common methods for manipulating the list, loading and saving is
* left to the concrete implementation * left to the concrete implementation
*
* @ignore
*/ */
abstract class BaseConfig implements Config { abstract class BaseConfig implements Config {
var $values = array(); var $values = array();
@ -106,8 +100,6 @@ abstract class BaseConfig implements Config {
* $config['foo'] = "bar"; * $config['foo'] = "bar";
* $config['baz'] = "qux"; * $config['baz'] = "qux";
* ?> * ?>
*
* @ignore
*/ */
class StaticConfig extends BaseConfig { class StaticConfig extends BaseConfig {
public function __construct($filename) { 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 * Loads the config list from a table in a given database, the table should
* be called config and have the schema: * be called config and have the schema:
* *
* \code
* CREATE TABLE config( * CREATE TABLE config(
* name VARCHAR(255) NOT NULL, * name VARCHAR(255) NOT NULL,
* value TEXT * value TEXT
* ); * );
* * \endcode
* @ignore
*/ */
class DatabaseConfig extends BaseConfig { class DatabaseConfig extends BaseConfig {
var $database = null; var $database = null;

View file

@ -1,16 +1,10 @@
<?php <?php
/**
* @package SCore
*/
require_once "compat.inc.php"; require_once "compat.inc.php";
$ADODB_CACHE_DIR=sys_get_temp_dir(); $ADODB_CACHE_DIR=sys_get_temp_dir();
require_once "lib/adodb/adodb.inc.php"; require_once "lib/adodb/adodb.inc.php";
require_once "lib/adodb/adodb-exceptions.inc.php"; require_once "lib/adodb/adodb-exceptions.inc.php";
/**#@+ /** @privatesection */
* @ignore
*/
// Querylet {{{ // Querylet {{{
class Querylet { class Querylet {
var $sql; var $sql;
@ -202,7 +196,7 @@ class MemCache implements CacheEngine {
public function get_misses() {return $this->misses;} public function get_misses() {return $this->misses;}
} }
// }}} // }}}
/**#@-*/ /** @publicsection */
/** /**
* A class for controlled database access * A class for controlled database access

View file

@ -1,8 +1,4 @@
<?php <?php
/**
* @package SCore
*/
/** /**
* Generic parent class for all events. * Generic parent class for all events.
* *
@ -113,28 +109,28 @@ class LogEvent extends Event {
/** /**
* a category, normally the extension name * a category, normally the extension name
* *
* @var string * @retval string
*/ */
var $section; var $section;
/** /**
* See python... * See python...
* *
* @var int * @retval int
*/ */
var $priority = 0; var $priority = 0;
/** /**
* Free text to be logged * Free text to be logged
* *
* @var text * @retval text
*/ */
var $message; var $message;
/** /**
* The time that the event was created * The time that the event was created
* *
* @var int * @retval int
*/ */
var $time; var $time;

View file

@ -1,8 +1,4 @@
<?php <?php
/**
* @package SCore
*/
/** /**
* A base exception to be caught by the upper levels * A base exception to be caught by the upper levels
*/ */

View file

@ -1,6 +1,6 @@
<?php <?php
/** /**
* \page events Events and Extensions * \page eande Events and Extensions
* *
* An event is a little blob of data saying "something happened", possibly * An event is a little blob of data saying "something happened", possibly
* "something happened, here's the specific data". Events are sent with the * "something happened, here's the specific data". Events are sent with the
@ -20,6 +20,46 @@
* SimpleExtension subclasses are slightly different -- they are registered * SimpleExtension subclasses are slightly different -- they are registered
* automatically, and events are sent to a named method, eg PageRequestEvent * automatically, and events are sent to a named method, eg PageRequestEvent
* will be sent to onPageRequest() * 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()) * priority, so no need for register_extension(new Foo())
* *
* Hopefully this removes as much copy & paste code from the extension * 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 * The original concept came from Artanis's SimpleExtension extension
* --> http://github.com/Artanis/simple-extension/tree/master * --> http://github.com/Artanis/simple-extension/tree/master

View file

@ -2,8 +2,6 @@
/** /**
* All the imageboard-specific bits of code should be in this file, everything * All the imageboard-specific bits of code should be in this file, everything
* else in /core should be standard SCore bits. * else in /core should be standard SCore bits.
*
* @package SCore
*/ */
/** /**
@ -57,7 +55,7 @@ class Image {
/** /**
* Find an image by ID * Find an image by ID
* *
* @var Image * @retval Image
*/ */
public static function by_id($id) { public static function by_id($id) {
assert(is_numeric($id)); assert(is_numeric($id));
@ -70,7 +68,7 @@ class Image {
/** /**
* Find an image by hash * Find an image by hash
* *
* @var Image * @retval Image
*/ */
public static function by_hash($hash) { public static function by_hash($hash) {
assert(is_string($hash)); assert(is_string($hash));
@ -83,7 +81,7 @@ class Image {
/** /**
* Pick a random image out of a set * Pick a random image out of a set
* *
* @var Image * @retval Image
*/ */
public static function by_random($tags=array()) { public static function by_random($tags=array()) {
assert(is_array($tags)); assert(is_array($tags));
@ -160,7 +158,7 @@ class Image {
* Rather than simply $this_id + 1, one must take into account * Rather than simply $this_id + 1, one must take into account
* deleted images and search queries * deleted images and search queries
* *
* @var Image * @retval Image
*/ */
public function get_next($tags=array(), $next=true) { public function get_next($tags=array(), $next=true) {
assert(is_array($tags)); assert(is_array($tags));
@ -192,7 +190,7 @@ class Image {
/** /**
* The reverse of get_next * The reverse of get_next
* *
* @var Image * @retval Image
*/ */
public function get_prev($tags=array()) { public function get_prev($tags=array()) {
return $this->get_next($tags, false); return $this->get_next($tags, false);
@ -201,7 +199,7 @@ class Image {
/** /**
* Find the User who owns this Image * Find the User who owns this Image
* *
* @var User * @retval User
*/ */
public function get_owner() { public function get_owner() {
return User::by_id($this->owner_id); return User::by_id($this->owner_id);
@ -238,7 +236,7 @@ class Image {
/** /**
* Get the URL for the full size image * Get the URL for the full size image
* *
* @var string * @retval string
*/ */
public function get_image_link() { public function get_image_link() {
global $config; global $config;
@ -257,7 +255,7 @@ class Image {
* Get a short link to the full size image * Get a short link to the full size image
* *
* @deprecated * @deprecated
* @var string * @retval string
*/ */
public function get_short_link() { public function get_short_link() {
global $config; global $config;
@ -267,7 +265,7 @@ class Image {
/** /**
* Get the URL for the thumbnail * Get the URL for the thumbnail
* *
* @var string * @retval string
*/ */
public function get_thumb_link() { public function get_thumb_link() {
global $config; global $config;
@ -286,7 +284,7 @@ class Image {
* Get the tooltip for this image, formatted according to the * Get the tooltip for this image, formatted according to the
* configured template * configured template
* *
* @var string * @retval string
*/ */
public function get_tooltip() { public function get_tooltip() {
global $config; global $config;
@ -296,7 +294,7 @@ class Image {
/** /**
* Figure out where the full size image is on disk * Figure out where the full size image is on disk
* *
* @var string * @retval string
*/ */
public function get_image_filename() { public function get_image_filename() {
$hash = $this->hash; $hash = $this->hash;
@ -308,7 +306,7 @@ class Image {
/** /**
* Figure out where the thumbnail is on disk * Figure out where the thumbnail is on disk
* *
* @var string * @retval string
*/ */
public function get_thumb_filename() { public function get_thumb_filename() {
$hash = $this->hash; $hash = $this->hash;
@ -319,7 +317,7 @@ class Image {
/** /**
* Get the original filename * Get the original filename
* *
* @var string * @retval string
*/ */
public function get_filename() { public function get_filename() {
return $this->filename; return $this->filename;
@ -330,7 +328,7 @@ class Image {
* *
* FIXME: now we handle more than just images * FIXME: now we handle more than just images
* *
* @var string * @retval string
*/ */
public function get_mime_type() { public function get_mime_type() {
return "image/".($this->ext); return "image/".($this->ext);
@ -339,7 +337,7 @@ class Image {
/** /**
* Get the image's filename extension * Get the image's filename extension
* *
* @var string * @retval string
*/ */
public function get_ext() { public function get_ext() {
return $this->ext; return $this->ext;
@ -348,7 +346,7 @@ class Image {
/** /**
* Get the image's source URL * Get the image's source URL
* *
* @var string * @retval string
*/ */
public function get_source() { public function get_source() {
return $this->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") { public function parse_link_template($tmpl, $_escape="url_escape") {
global $config; global $config;

View file

@ -12,6 +12,18 @@
* wants to display something, it should pass the $page data structure along * 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 * with the data to be displayed to the theme object, and the theme will add
* the data into the page. * 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. * 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, * 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 $mode = "page";
var $type = "text/html"; var $type = "text/html";

View file

@ -1,11 +1,5 @@
<?php <?php
/** /** @private */
* @package SCore
*/
/**
* @ignore
*/
function _new_user($row) { function _new_user($row) {
return new User($row); return new User($row);
} }
@ -94,7 +88,7 @@ class User {
/** /**
* Test if this user is anonymous (not logged in) * Test if this user is anonymous (not logged in)
* *
* @var bool * @retval bool
*/ */
public function is_anonymous() { public function is_anonymous() {
global $config; global $config;
@ -104,7 +98,7 @@ class User {
/** /**
* Test if this user is an administrator * Test if this user is an administrator
* *
* @var bool * @retval bool
*/ */
public function is_admin() { public function is_admin() {
return $this->admin; return $this->admin;

View file

@ -1,9 +1,4 @@
<?php <?php
/**
* @package SCore
*/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* Input / Output Sanitising * * Input / Output Sanitising *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
@ -219,7 +214,7 @@ function get_theme_object(Extension $class, $fatal=true) {
* *
* @retval int * @retval int
*/ */
function blockcmp($a, $b) { function blockcmp(Block $a, Block $b) {
if($a->position == $b->position) { if($a->position == $b->position) {
return 0; return 0;
} }

View file

@ -7,7 +7,8 @@
* Description: A thing for point & click extension management * Description: A thing for point & click extension management
*/ */
class ExtensionInfo { // {{{ /** @private */
class ExtensionInfo {
var $ext_name, $name, $link, $author, $email, $description, $documentation, $version; var $ext_name, $name, $link, $author, $email, $description, $documentation, $version;
function ExtensionInfo($main) { function ExtensionInfo($main) {
@ -66,7 +67,7 @@ class ExtensionInfo { // {{{
private function is_enabled($fname) { private function is_enabled($fname) {
return file_exists("ext/$fname"); return file_exists("ext/$fname");
} }
} // }}} }
class ExtManager extends SimpleExtension { class ExtManager extends SimpleExtension {
public function onPageRequest($event) { public function onPageRequest($event) {

View file

@ -1,5 +1,5 @@
<?php <?php
class ExtManagerTest extends ShimmieWebTestCase { class ExtManagerTest extends SCoreWebTestCase {
function testAuth() { function testAuth() {
$this->get_page('ext_manager'); $this->get_page('ext_manager');
$this->assertResponse(403); $this->assertResponse(403);

View file

@ -1,5 +1,5 @@
<?php <?php
class Handle404Test extends ShimmieWebTestCase { class Handle404Test extends SCoreWebTestCase {
function test404Handler() { function test404Handler() {
$this->get_page('not/a/page'); $this->get_page('not/a/page');
$this->assertResponse(404); $this->assertResponse(404);

View file

@ -1,5 +1,5 @@
<?php <?php
class SetupTest extends ShimmieWebTestCase { class SetupTest extends SCoreWebTestCase {
function testAuth() { function testAuth() {
$this->get_page('setup'); $this->get_page('setup');
$this->assertResponse(403); $this->assertResponse(403);

View file

@ -1,5 +1,5 @@
<?php <?php
class UserPageTest extends ShimmieWebTestCase { class UserPageTest extends SCoreWebTestCase {
function testUserPage() { function testUserPage() {
$this->get_page('user'); $this->get_page('user');
$this->assertTitle("Not Logged In"); $this->assertTitle("Not Logged In");

View file

@ -1,16 +1,44 @@
<?php <?php
/** /**
* \mainpage Shimmie2 / SCore Documentation * \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 * 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 * and recieving Event subclasses. The topic of conversation is decided by the
* initial PageRequestEvent, and each extension puts its notes into the shared * 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 * 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 * current theme's Layout class which will tidy up the data and present it to
* the user. * 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: * 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 $database -- a Database object used to get raw SQL access
* \li $page -- a Page to holds all the loose bits of extension output * \li $page -- a Page to holds all the loose bits of extension output
* \li $user -- the currently logged in User * \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 // set up and purify the environment
@ -52,7 +82,7 @@ try {
// load the theme parts // load the theme parts
$_theme = $config->get_string("theme", "default"); $_theme = $config->get_string("theme", "default");
if(!file_exists("themes/$_theme")) $_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/layout.class.php";
require_once "themes/$_theme/themelet.class.php"; require_once "themes/$_theme/themelet.class.php";
@ -84,7 +114,7 @@ try {
// start the page generation waterfall // start the page generation waterfall
$page = new Page(); $page = class_exists("CustomPage") ? new CustomPage() : new Page();
$user = _get_user($config, $database); $user = _get_user($config, $database);
send_event(new InitExtEvent()); send_event(new InitExtEvent());
send_event(_get_page_request()); send_event(_get_page_request());

View file

@ -1,6 +1,6 @@
<?php <?php
class Page extends GenericPage { class CustomPage extends Page {
var $left_enabled = true; var $left_enabled = true;
public function disable_left() { public function disable_left() {
$this->left_enabled = false; $this->left_enabled = false;

View file

@ -1,7 +1,12 @@
<?php <?php
/**
* A class to turn a Page data structure into a blob of HTML
*/
class Layout { class Layout {
function display_page($page) { /**
* turns the Page into HTML
*/
public function display_page(Page $page) {
global $config; global $config;
$theme_name = $config->get_string('theme', 'default'); $theme_name = $config->get_string('theme', 'default');
@ -71,7 +76,10 @@ $header_html
EOD; 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; $h = $block->header;
$b = $block->body; $b = $block->body;
$html = ""; $html = "";

View file

@ -1,6 +0,0 @@
<?php
class Page extends GenericPage {
// no changes from default
}
?>

View file

@ -1,6 +1,11 @@
<?php <?php
/**
* A customised version of the Setup theme
*/
class CustomSetupTheme extends SetupTheme { class CustomSetupTheme extends SetupTheme {
/**
* Turn a SetupBlock into HTML... with rounded corners.
*/
protected function sb_to_html(SetupBlock $block) { protected function sb_to_html(SetupBlock $block) {
return " return "
<div class='rr setupblock'> <div class='rr setupblock'>

View file

@ -1,5 +1,7 @@
<?php <?php
/**
* A collection of common functions for theme parts
*/
class Themelet { class Themelet {
/** /**
* Generic error message display * Generic error message display

View file

@ -1,6 +1,6 @@
<?php <?php
class Page extends GenericPage { class CustomPage extends Page {
var $left_enabled = true; var $left_enabled = true;
public function disable_left() { public function disable_left() {
$this->left_enabled = false; $this->left_enabled = false;

View file

@ -1,6 +0,0 @@
<?php
class Page extends GenericPage {
// no changes from default
}
?>

View file

@ -1,6 +0,0 @@
<?php
class Page extends GenericPage {
// no changes from default
}
?>