diff options
| author | Michael Walker <mike@barrucadu.co.uk> | 2015-01-26 22:31:23 +0000 |
|---|---|---|
| committer | Michael Walker <mike@barrucadu.co.uk> | 2015-01-26 22:31:23 +0000 |
| commit | 9c091aaa4700fda3e2d03a2f1e42f6338a4d7cbc (patch) | |
| tree | 373e83d0d86eacebb39e80ab2e3970f267217612 | |
| parent | e8737b23d5c4242d6b199998fde692dbfd5f032f (diff) | |
Add random theme. Like Ukko, but sorts threads randomly.
| -rw-r--r-- | templates/themes/rand/info.php | 54 | ||||
| -rw-r--r-- | templates/themes/rand/rand.js | 116 | ||||
| -rw-r--r-- | templates/themes/rand/theme.php | 104 | ||||
| -rw-r--r-- | templates/themes/rand/thumb.png | bin | 0 -> 13085 bytes |
4 files changed, 274 insertions, 0 deletions
diff --git a/templates/themes/rand/info.php b/templates/themes/rand/info.php new file mode 100644 index 00000000..c226e2e4 --- /dev/null +++ b/templates/themes/rand/info.php @@ -0,0 +1,54 @@ +<?php + $theme = array(); + + // Theme name + $theme['name'] = 'Random Overboard'; + // Description (you can use Tinyboard markup here) + $theme['description'] = 'Board with threads and messages from all boards, sorted randomly'; + $theme['version'] = 'v0.2'; + + // Theme configuration + $theme['config'] = array(); + + $theme['config'][] = array( + 'title' => 'Board name', + 'name' => 'title', + 'type' => 'text', + 'default' => 'Random' + ); + $theme['config'][] = array( + 'title' => 'Board URI', + 'name' => 'uri', + 'type' => 'text', + 'default' => '.', + 'comment' => '(rand for example)' + ); + $theme['config'][] = array( + 'title' => 'Subtitle', + 'name' => 'subtitle', + 'type' => 'text', + 'comment' => '(%s = thread limit. for example "%s freshly bumped threads")' + ); + $theme['config'][] = array( + 'title' => 'Excluded boards', + 'name' => 'exclude', + 'type' => 'text', + 'comment' => '(space seperated)' + ); + $theme['config'][] = array( + 'title' => 'Number of threads', + 'name' => 'thread_limit', + 'type' => 'text', + 'default' => '15', + ); + // Unique function name for building everything + $theme['build_function'] = 'rand_build'; + $theme['install_callback'] = 'rand_install'; + + if(!function_exists('rand_install')) { + function rand_install($settings) { + if (!file_exists($settings['uri'])) + @mkdir($settings['uri'], 0777) or error("Couldn't create " . $settings['uri'] . ". Check permissions.", true); + } + } + diff --git a/templates/themes/rand/rand.js b/templates/themes/rand/rand.js new file mode 100644 index 00000000..b2668e0b --- /dev/null +++ b/templates/themes/rand/rand.js @@ -0,0 +1,116 @@ +(function(){ + +var cache = new Array(), + thread = false, + loading = false, + ukkotimer = false; + +if (localStorage.hiddenboards === undefined) { + localStorage.hiddenboards = "{}"; +} + +// Load data from HTML5 localStorage +var hiddenboards = JSON.parse(localStorage.hiddenboards); + +var storeboards = function() { + localStorage.hiddenboards = JSON.stringify(hiddenboards); +}; + +$(document).ready(function() { + var addukkohide = function() { + var ukkohide = $('<a href="javascript:void(0);" class="unimportant ukkohide"></a>'); + var board = $(this).next().data("board"); + var hr = $("<hr />"); + + $(this).append(ukkohide); + $(this).append(hr); + + if (hiddenboards[board] !== true) { + ukkohide.html(_("(hide threads from this board)")); + hr.hide(); + } + else { + ukkohide.html(_("(show threads from this board)")); + $(this).next().hide(); + } + ukkohide.click(function() { + hiddenboards[board] = (hiddenboards[board] !== true); + if (hiddenboards[board] !== true) { + $('[data-board="'+board+'"]:not([data-cached="yes"])').show().prev(). + find('.ukkohide').html(_("(hide threads from this board)")). + parent().find('hr').hide(); + } + else { + $('[data-board="'+board+'"]:not([data-cached="yes"])').hide().prev(). + find('.ukkohide').html(_("(show threads from this board)")) + .parent().find('hr').show(); + } + storeboards(); + return false; + }); + + }; + $("h2").each(addukkohide); + + $('.pages').hide(); + var loadnext = function() { + if (overflow.length == 0) { + $('.pages').show().html(_("No more threads to display")); + } + while($(window).scrollTop() + $(window).height() + 1000 > $(document).height() && !loading && overflow.length > 0) { + var page = modRoot + overflow[0].board + '/' + overflow[0].page; + thread = $('div#thread_' + overflow[0].id + '[data-board="' + overflow[0].board + '"]'); + if (thread.length > 0 && thread.attr("data-cached") !== 'yes') { // already present + overflow.shift(); + continue; + } + + var boardheader = $('<h2><a href="/' + overflow[0].board + '/">/' + overflow[0].board + '/</a> </h2>'); + + if($.inArray(page, cache) != -1) { + if (thread.length > 0) { + $('div[id*="thread_"]').last().after(thread.attr('data-board', overflow[0].board).attr("data-cached", "no").css('display', 'block')); + boardheader.insertBefore(thread); + addukkohide.call(boardheader); + $(document).trigger('new_post', thread); + } + overflow.shift(); + } else { + loading = true; + $('.pages').show().html(_("Loading...")); + $.get(page, function(data) { + cache.push(page); + + $(data).find('div[id*="thread_"]').each(function() { + var checkout = $(this).attr('id').replace('thread_', ''); + if ($('div#thread_' + checkout + '[data-board="' + overflow[0].board + '"]').length == 0) { + $('form[name="postcontrols"]').prepend($(this).css('display', 'none').attr("data-cached", "yes").attr('data-board', overflow[0].board)); + } + }); + + thread = $('div#thread_' + overflow[0].id + '[data-board="' + overflow[0].board + '"][data-cached="yes"]'); + + if(thread.length > 0) { + $('div[id*="thread_"]').last().after(thread.attr('data-board', overflow[0].board).attr("data-cached", "no").css('display', 'block')); + boardheader.insertBefore(thread); + addukkohide.call(boardheader); + $(document).trigger('new_post', thread); + } + overflow.shift(); + + loading = false; + $('.pages').hide().html(""); + }); + break; + } + } + clearTimeout(ukkotimer); + ukkotimer = setTimeout(loadnext, 1000); + }; + + $(window).on('scroll', loadnext); + + ukkotimer = setTimeout(loadnext, 1000); +}); + +})(); diff --git a/templates/themes/rand/theme.php b/templates/themes/rand/theme.php new file mode 100644 index 00000000..b4cfb4ff --- /dev/null +++ b/templates/themes/rand/theme.php @@ -0,0 +1,104 @@ +<?php + require 'info.php'; + + function rand_build($action, $settings) { + $rand = new rand(); + $rand->settings = $settings; + + file_write($settings['uri'] . '/index.html', $rand->build()); + file_write($settings['uri'] . '/rand.js', Element('themes/rand/rand.js', array())); + } + + class rand { + public $settings; + public function build($mod = false) { + global $config; + $boards = listBoards(); + + $body = ''; + $overflow = array(); + $board = array( + 'url' => $this->settings['uri'], + 'name' => $this->settings['title'], + 'title' => sprintf($this->settings['subtitle'], $this->settings['thread_limit']) + ); + + $query = ''; + foreach($boards as &$_board) { + if(in_array($_board['uri'], explode(' ', $this->settings['exclude']))) + continue; + $query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` WHERE `thread` IS NULL UNION ALL ", $_board['uri'], $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', 'ORDER BY RAND()', $query); + $query = query($query) or error(db_error()); + + $count = 0; + $threads = array(); + while($post = $query->fetch()) { + + if(!isset($threads[$post['board']])) { + $threads[$post['board']] = 1; + } else { + $threads[$post['board']] += 1; + } + + if($count < $this->settings['thread_limit']) { + openBoard($post['board']); + $thread = new Thread($post, $mod ? '?/' : $config['root'], $mod); + + $posts = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE `thread` = :id ORDER BY `id` DESC LIMIT :limit", $post['board'])); + $posts->bindValue(':id', $post['id']); + $posts->bindValue(':limit', ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']), PDO::PARAM_INT); + $posts->execute() or error(db_error($posts)); + + $num_images = 0; + while ($po = $posts->fetch()) { + if ($po['files']) + $num_images++; + + $thread->add(new Post($po, $mod ? '?/' : $config['root'], $mod)); + + } + if ($posts->rowCount() == ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview'])) { + $ct = prepare(sprintf("SELECT COUNT(`id`) as `num` FROM ``posts_%s`` WHERE `thread` = :thread UNION ALL SELECT COUNT(`id`) FROM ``posts_%s`` WHERE `files` IS NOT NULL AND `thread` = :thread", $post['board'], $post['board'])); + $ct->bindValue(':thread', $post['id'], PDO::PARAM_INT); + $ct->execute() or error(db_error($count)); + + $c = $ct->fetch(); + $thread->omitted = $c['num'] - ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']); + + $c = $ct->fetch(); + $thread->omitted_images = $c['num'] - $num_images; + } + + + $thread->posts = array_reverse($thread->posts); + $body .= '<h2><a href="' . $config['root'] . $post['board'] . '">/' . $post['board'] . '/</a></h2>'; + $body .= $thread->build(true); + } else { + $page = 'index'; + if(floor($threads[$post['board']] / $config['threads_per_page']) > 0) { + $page = floor($threads[$post['board']] / $config['threads_per_page']) + 1; + } + $overflow[] = array('id' => $post['id'], 'board' => $post['board'], 'page' => $page . '.html'); + } + + $count += 1; + } + + $body .= '<script> var overflow = ' . json_encode($overflow) . '</script>'; + $body .= '<script type="text/javascript" src="/'.$this->settings['uri'].'/rand.js"></script>'; + + return Element('index.html', array( + 'config' => $config, + 'board' => $board, + 'no_post_form' => true, + 'body' => $body, + 'mod' => $mod, + 'boardlist' => createBoardlist($mod), + )); + } + + }; + +?> diff --git a/templates/themes/rand/thumb.png b/templates/themes/rand/thumb.png Binary files differnew file mode 100644 index 00000000..eb616ef7 --- /dev/null +++ b/templates/themes/rand/thumb.png |
