towards_a_new_leftypol
4 years ago
committed by
towards-a-new-leftypol
23 changed files with 261 additions and 1340 deletions
@ -0,0 +1,213 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/* |
||||
|
* Instance Configuration |
||||
|
* ---------------------- |
||||
|
* Edit this file and not config.php for imageboard configuration. |
||||
|
* |
||||
|
* You can copy values from config.php (defaults) and paste them here. |
||||
|
*/ |
||||
|
|
||||
|
$config['boards'] = array( |
||||
|
array('leftypol', 'b'), |
||||
|
array('GET', 'ref'), |
||||
|
array('gulag' => 'http://status.example.org/') |
||||
|
); |
||||
|
// Board categories. Only used in the "Categories" theme. |
||||
|
$config['categories'] = array( |
||||
|
'Leftypol' => array('leftypol', 'b'), |
||||
|
'GET' => array('GET', 'ref'), |
||||
|
'Meta' => array('gulag') |
||||
|
); |
||||
|
// Optional for the Categories theme. This is an array of name => (title, url) groups for categories |
||||
|
// with non-board links. |
||||
|
$config['custom_categories'] = array( |
||||
|
'Links' => array( |
||||
|
'Leftypedia' => 'http://example.org', |
||||
|
'Staff application' => 'staff_applications.html', |
||||
|
'FAQ' => 'faq.html', |
||||
|
'Donate' => 'donate.html' |
||||
|
) |
||||
|
); |
||||
|
|
||||
|
|
||||
|
$config['db']['server'] = 'localhost'; |
||||
|
$config['db']['database'] = 'lainchan'; |
||||
|
$config['db']['prefix'] = ''; |
||||
|
$config['db']['user'] = 'lainchan'; |
||||
|
$config['db']['password'] = 'oijrljqqwjr242kjn'; |
||||
|
|
||||
|
|
||||
|
$config['cookies']['mod'] = 'mod'; |
||||
|
$config['cookies']['salt'] = 'ZGZkYWU3NGUwZDNiYjU2MDEwZmRkMW'; |
||||
|
|
||||
|
$config['flood_time'] = 10; |
||||
|
$config['flood_time_ip'] = 120; |
||||
|
$config['flood_time_same'] = 30; |
||||
|
$config['max_body'] = 1800; |
||||
|
$config['reply_limit'] = 250; |
||||
|
$config['max_links'] = 20; |
||||
|
$config['max_filesize'] = 10485760; |
||||
|
$config['thumb_width'] = 255; |
||||
|
$config['thumb_height'] = 255; |
||||
|
$config['max_width'] = 10000; |
||||
|
$config['max_height'] = 10000; |
||||
|
$config['max_images'] = 4; |
||||
|
$config['threads_per_page'] = 10; |
||||
|
$config['max_pages'] = 10; |
||||
|
$config['threads_preview'] = 5; |
||||
|
$config['root'] = '/'; |
||||
|
$config['secure_trip_salt'] = 'MzdhNTJiMjNkMTM5Nzc5NDcwOGViMD'; |
||||
|
|
||||
|
$config['thumb_method'] = 'gm+gifsicle'; |
||||
|
$config['gnu_md5'] = '1'; |
||||
|
|
||||
|
// < Added by Zero > |
||||
|
// Sun Aug 30 17:44:19 UTC 2020 |
||||
|
|
||||
|
// Allowed image file extensions. |
||||
|
$config['allowed_ext'][] = 'jpg'; |
||||
|
$config['allowed_ext'][] = 'jpeg'; |
||||
|
$config['allowed_ext'][] = 'bmp'; |
||||
|
$config['allowed_ext'][] = 'gif'; |
||||
|
$config['allowed_ext'][] = 'png'; |
||||
|
|
||||
|
// TODO test section, please remove |
||||
|
$config['allowed_ext'][] = 'mp4'; |
||||
|
$config['allowed_ext'][] = 'webm'; |
||||
|
$config['allowed_ext_files'][] = 'webm'; |
||||
|
$config['webm']['use_ffmpeg'] = true; |
||||
|
$config['additional_javascript'][] = 'js/options.js'; |
||||
|
$config['additional_javascript'][] = 'js/webm-settings.js'; |
||||
|
$config['additional_javascript'][] = 'js/expand-video.js'; |
||||
|
$config['max_filesize'] = 50 * 1024 * 1024; // 50MB |
||||
|
$config['webm']['ffmpeg_path'] = '/usr/bin/ffmpeg'; |
||||
|
$config['webm']['ffprobe_path'] = '/usr/bin/ffprobe'; |
||||
|
$config['mp4']['ffmpeg_path'] = '/usr/bin/ffmpeg'; |
||||
|
$config['mp4']['ffprobe_path'] = '/usr/bin/ffprobe'; |
||||
|
$config['webm']['allow_audio'] = true; |
||||
|
$config['webm']['max_length'] = 620; |
||||
|
//end test section |
||||
|
|
||||
|
|
||||
|
$config['allowed_ext_files'][] = 'mp4'; |
||||
|
$config['allowed_ext_files'][] = 'pdf'; |
||||
|
$config['allowed_ext_files'][] = 'txt'; |
||||
|
$config['allowed_ext_files'][] = 'zip'; |
||||
|
$config['allowed_ext_files'][] = 'epub'; |
||||
|
|
||||
|
/* |
||||
|
* From Config: |
||||
|
// Always regenerate markup. This isn't recommended and should only be used for debugging; by default, |
||||
|
// Tinyboard only parses post markup when it needs to, and keeps post-markup HTML in the database. This |
||||
|
// will significantly impact performance when enabled. |
||||
|
* |
||||
|
*/ |
||||
|
$config['markup_repair_tidy'] = false; |
||||
|
|
||||
|
|
||||
|
$config['image_reject_repost'] = false; |
||||
|
$config['flood_time'] = 0; |
||||
|
// Minimum time between between each post with the exact same content AND same IP address. |
||||
|
$config['flood_time_ip'] = 0; |
||||
|
|
||||
|
$config['filters'] = array(); |
||||
|
$config['always_noko'] = false; // the migration script now relies on this default behavior, we can turn this on later. |
||||
|
// </ Added by Zero > |
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Tue, 02 Jun 2020 23:16:58 -0700: |
||||
|
$config['debug'] = true; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Tue, 02 Jun 2020 23:24:29 -0700: |
||||
|
$config['debug'] = false; |
||||
|
$config['verbose_errors'] = false; |
||||
|
|
||||
|
|
||||
|
/* |
||||
|
* ==================== |
||||
|
* Javascript |
||||
|
* ==================== |
||||
|
*/ |
||||
|
|
||||
|
// Additional Javascript files to include on board index and thread pages. See js/ for available scripts. |
||||
|
$config['additional_javascript'][] = 'js/jquery.min.js'; |
||||
|
$config['additional_javascript'][] = 'js/inline-expanding.js'; |
||||
|
$config['additional_javascript'][] = 'js/multi-image.js'; // required when using multi file upload |
||||
|
$config['additional_javascript'][] = 'js/local-time.js'; |
||||
|
$config['additional_javascript'][] = 'js/auto-reload.js'; |
||||
|
$config['additional_javascript'][] = 'js/post-hover.js'; |
||||
|
$config['additional_javascript'][] = 'js/style-select.js'; |
||||
|
|
||||
|
// Some scripts require jQuery. Check the comments in script files to see what's needed. When enabling |
||||
|
// jQuery, you should first empty the array so that "js/query.min.js" can be the first, and then re-add |
||||
|
// "js/inline-expanding.js" or else the inline-expanding script might not interact properly with other |
||||
|
// scripts. |
||||
|
// $config['additional_javascript'] = array(); |
||||
|
// $config['additional_javascript'][] = 'js/jquery.min.js'; |
||||
|
// $config['additional_javascript'][] = 'js/inline-expanding.js'; |
||||
|
// $config['additional_javascript'][] = 'js/auto-reload.js'; |
||||
|
// $config['additional_javascript'][] = 'js/post-hover.js'; |
||||
|
// $config['additional_javascript'][] = 'js/style-select.js'; |
||||
|
|
||||
|
// Where these script files are located on the web. Defaults to $config['root']. |
||||
|
// $config['additional_javascript_url'] = 'http://static.example.org/tinyboard-javascript-stuff/'; |
||||
|
|
||||
|
// Compile all additional scripts into one file ($config['file_script']) instead of including them seperately. |
||||
|
$config['additional_javascript_compile'] = false; |
||||
|
|
||||
|
// Minify Javascript using http://code.google.com/p/minify/. |
||||
|
$config['minify_js'] = false; |
||||
|
|
||||
|
// Dispatch thumbnail loading and image configuration with JavaScript. It will need a certain javascript |
||||
|
// code to work. |
||||
|
$config['javascript_image_dispatch'] = false; |
||||
|
|
||||
|
$config['multiimage_method'] = 'each'; |
||||
|
|
||||
|
|
||||
|
$config['mod']['show_ip'] = DISABLED; |
||||
|
$config['mod']['move'] = MOD; |
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Sun, 23 Aug 2020 16:45:14 -0700: |
||||
|
$config['force_image_op'] = false; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Sun, 23 Aug 2020 16:48:22 -0700: |
||||
|
$config['force_body_op'] = false; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Sun, 23 Aug 2020 17:38:52 -0700: |
||||
|
$config['flood_time'] = 0; |
||||
|
$config['flood_time_ip'] = 0; |
||||
|
$config['flood_time_same'] = 0; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Wed, 26 Aug 2020 20:15:11 -0700: |
||||
|
$config['min_body'] = 5; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Wed, 26 Aug 2020 20:15:44 -0700: |
||||
|
$config['force_image_op'] = true; |
||||
|
$config['min_body'] = 15; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Sat, 29 Aug 2020 13:26:51 -0700: |
||||
|
$config['force_image_op'] = false; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Sat, 29 Aug 2020 23:13:46 -0700: |
||||
|
$config['cookies']['salt'] = 'ZGZkYWU3NGUwZDNiYjU2MDEwZmRkMX'; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Sat, 29 Aug 2020 23:21:09 -0700: |
||||
|
$config['cookies']['salt'] = 'ZGZkYWU3NGUwZDNiYjU2MDEwZmRkMA'; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Sun, 30 Aug 2020 10:48:36 -0700: |
||||
|
$config['max_body'] = 100000; |
||||
|
|
||||
|
|
||||
|
// Changes made via web editor by "admin" @ Sun, 30 Aug 2020 15:25:41 -0700: |
||||
|
$config['max_links'] = 40; |
||||
|
|
@ -1,55 +0,0 @@ |
|||||
<?php |
|
||||
$theme = array(); |
|
||||
|
|
||||
// Theme name |
|
||||
$theme['name'] = 'Overboard (Ukko)'; |
|
||||
// Description (you can use Tinyboard markup here) |
|
||||
$theme['description'] = 'Board with threads and messages from all boards'; |
|
||||
$theme['version'] = 'v0.2'; |
|
||||
|
|
||||
// Theme configuration |
|
||||
$theme['config'] = array(); |
|
||||
|
|
||||
$theme['config'][] = array( |
|
||||
'title' => 'Board name', |
|
||||
'name' => 'title', |
|
||||
'type' => 'text', |
|
||||
'default' => 'Ukko' |
|
||||
); |
|
||||
$theme['config'][] = array( |
|
||||
'title' => 'Board URI', |
|
||||
'name' => 'uri', |
|
||||
'type' => 'text', |
|
||||
'default' => '*', |
|
||||
'comment' => '(ukko 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'] = 'ukko_build'; |
|
||||
$theme['install_callback'] = 'ukko_install'; |
|
||||
|
|
||||
if(!function_exists('ukko_install')) { |
|
||||
function ukko_install($settings) { |
|
||||
if (!file_exists($settings['uri'])) |
|
||||
@mkdir($settings['uri'], 0777) or error("Couldn't create " . $settings['uri'] . ". Check permissions.", true); |
|
||||
file_write($settings['uri'] . '/ukko.js', Element('themes/ukko/ukko.js', array())); |
|
||||
} |
|
||||
} |
|
||||
|
|
@ -1,162 +0,0 @@ |
|||||
<?php |
|
||||
require 'info.php'; |
|
||||
|
|
||||
function ukko_build($action, $settings) { |
|
||||
global $config; |
|
||||
|
|
||||
$ukko = new ukko(); |
|
||||
$ukko->settings = $settings; |
|
||||
|
|
||||
if (! ($action == 'all' || $action == 'post' || $action == 'post-thread' || $action == 'post-delete')) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
$action = generation_strategy('sb_ukko', array()); |
|
||||
|
|
||||
if ($action == 'delete') { |
|
||||
file_unlink($settings['uri'] . '/index.html'); |
|
||||
if ($config['api']['enabled']) { |
|
||||
$jsonFilename = $settings['uri'] . '/0.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
$jsonFilename = $settings['uri'] . '/catalog.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
$jsonFilename = $settings['uri'] . '/threads.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
} |
|
||||
} |
|
||||
elseif ($action == 'rebuild') { |
|
||||
file_write($settings['uri'] . '/index.html', $ukko->build()); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
class ukko { |
|
||||
public $settings; |
|
||||
public function build($mod = false) { |
|
||||
global $config; |
|
||||
$boards = listBoards(); |
|
||||
|
|
||||
$body = ''; |
|
||||
$overflow = array(); |
|
||||
$board = array( |
|
||||
'dir' => $this->settings['uri'] . "/", |
|
||||
'url' => $this->settings['uri'], |
|
||||
'uri' => $this->settings['uri'], |
|
||||
'name' => $this->settings['title'], |
|
||||
'title' => sprintf($this->settings['subtitle'], $this->settings['thread_limit']) |
|
||||
); |
|
||||
|
|
||||
$boardsforukko = array(); |
|
||||
$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']); |
|
||||
array_push($boardsforukko,$_board); |
|
||||
} |
|
||||
$query = preg_replace('/UNION ALL $/', 'ORDER BY `bump` DESC', $query); |
|
||||
$query = query($query) or error(db_error()); |
|
||||
|
|
||||
$count = 0; |
|
||||
$threads = array(); |
|
||||
if ($config['api']['enabled']) { |
|
||||
$apithreads = 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 `sticky` DESC, `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++; |
|
||||
$post2 = new Post($po, $mod ? '?/' : $config['root'], $mod); |
|
||||
$thread->add($post2); |
|
||||
|
|
||||
} |
|
||||
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); |
|
||||
if ($config['api']['enabled']) { |
|
||||
array_push($apithreads,$thread); |
|
||||
} |
|
||||
} 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'].'/ukko.js"></script>'; |
|
||||
|
|
||||
// json api |
|
||||
if ($config['api']['enabled']) { |
|
||||
require_once __DIR__. '/../../../inc/api.php'; |
|
||||
$api = new Api(); |
|
||||
$jsonFilename = $board['dir'] . '0.json'; |
|
||||
$json = json_encode($api->translatePage($apithreads)); |
|
||||
file_write($jsonFilename, $json); |
|
||||
|
|
||||
|
|
||||
$catalog = array(); |
|
||||
$catalog[0] = $apithreads; |
|
||||
|
|
||||
$json = json_encode($api->translateCatalog($catalog)); |
|
||||
$jsonFilename = $board['dir'] . 'catalog.json'; |
|
||||
file_write($jsonFilename, $json); |
|
||||
|
|
||||
$json = json_encode($api->translateCatalog($catalog, true)); |
|
||||
$jsonFilename = $board['dir'] . 'threads.json'; |
|
||||
file_write($jsonFilename, $json); |
|
||||
} |
|
||||
$antibot = null; |
|
||||
if (!$antibot) { |
|
||||
$antibot = create_antibot($board['uri']); |
|
||||
} |
|
||||
$antibot->reset(); |
|
||||
|
|
||||
return Element('index.html', array( |
|
||||
'config' => $config, |
|
||||
'board' => $board, |
|
||||
'no_post_form' => $config['overboard_post_form'] ? false : true, |
|
||||
'body' => $body, |
|
||||
'mod' => $mod, |
|
||||
'boardlist' => createBoardlist($mod), |
|
||||
'boards' => $boardsforukko, |
|
||||
'antibot' => $antibot ) |
|
||||
); |
|
||||
} |
|
||||
|
|
||||
}; |
|
||||
|
|
||||
?> |
|
Before Width: | Height: | Size: 13 KiB |
@ -1,116 +0,0 @@ |
|||||
(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); |
|
||||
}); |
|
||||
|
|
||||
})(); |
|
@ -1,55 +0,0 @@ |
|||||
<?php |
|
||||
$theme = array(); |
|
||||
|
|
||||
// Theme name |
|
||||
$theme['name'] = 'Overboard (Ukko2)'; |
|
||||
// Description (you can use Tinyboard markup here) |
|
||||
$theme['description'] = 'Board with threads and messages from all boards'; |
|
||||
$theme['version'] = 'v0.2'; |
|
||||
|
|
||||
// Theme configuration |
|
||||
$theme['config'] = array(); |
|
||||
|
|
||||
$theme['config'][] = array( |
|
||||
'title' => 'Board name', |
|
||||
'name' => 'title', |
|
||||
'type' => 'text', |
|
||||
'default' => 'Ukko' |
|
||||
); |
|
||||
$theme['config'][] = array( |
|
||||
'title' => 'Board URI', |
|
||||
'name' => 'uri', |
|
||||
'type' => 'text', |
|
||||
'default' => '*', |
|
||||
'comment' => '(ukko 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' => 'included boards', |
|
||||
'name' => 'include', |
|
||||
'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'] = 'ukko2_build'; |
|
||||
$theme['install_callback'] = 'ukko2_install'; |
|
||||
|
|
||||
if(!function_exists('ukko2_install')) { |
|
||||
function ukko2_install($settings) { |
|
||||
if (!file_exists($settings['uri'])) |
|
||||
@mkdir($settings['uri'], 0777) or error("Couldn't create " . $settings['uri'] . ". Check permissions.", true); |
|
||||
file_write($settings['uri'] . '/ukko.js', Element('themes/ukko/ukko.js', array())); |
|
||||
} |
|
||||
} |
|
||||
|
|
@ -1,161 +0,0 @@ |
|||||
<?php |
|
||||
require 'info.php'; |
|
||||
|
|
||||
function ukko2_build($action, $settings) { |
|
||||
global $config; |
|
||||
|
|
||||
$ukko2 = new ukko2(); |
|
||||
$ukko2->settings = $settings; |
|
||||
|
|
||||
if (! ($action == 'all' || $action == 'post' || $action == 'post-thread' || $action == 'post-delete')) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
$action = generation_strategy('sb_ukko2', array()); |
|
||||
|
|
||||
if ($action == 'delete') { |
|
||||
file_unlink($settings['uri'] . '/index.html'); |
|
||||
if ($config['api']['enabled']) { |
|
||||
$jsonFilename = $settings['uri'] . '/0.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
$jsonFilename = $settings['uri'] . '/catalog.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
$jsonFilename = $settings['uri'] . '/threads.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
} |
|
||||
} |
|
||||
elseif ($action == 'rebuild') { |
|
||||
file_write($settings['uri'] . '/index.html', $ukko2->build()); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
class ukko2 { |
|
||||
public $settings; |
|
||||
public function build($mod = false) { |
|
||||
global $config; |
|
||||
$boards = listBoards(); |
|
||||
|
|
||||
$body = ''; |
|
||||
$overflow = array(); |
|
||||
$board = array( |
|
||||
'dir' => $this->settings['uri'] . "/", |
|
||||
'url' => $this->settings['uri'], |
|
||||
'uri' => $this->settings['uri'], |
|
||||
'name' => $this->settings['title'], |
|
||||
'title' => sprintf($this->settings['subtitle'], $this->settings['thread_limit']) |
|
||||
); |
|
||||
$boardsforukko2 = array(); |
|
||||
$query = ''; |
|
||||
foreach($boards as &$_board) { |
|
||||
if(in_array($_board['uri'], explode(' ', $this->settings['include']))){ |
|
||||
$query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` WHERE `thread` IS NULL UNION ALL ", $_board['uri'], $_board['uri']); |
|
||||
array_push($boardsforukko2,$_board); |
|
||||
} |
|
||||
} |
|
||||
$query = preg_replace('/UNION ALL $/', 'ORDER BY `sticky` DESC ,`bump` DESC', $query); |
|
||||
$query = query($query) or error(db_error()); |
|
||||
|
|
||||
$count = 0; |
|
||||
$threads = array(); |
|
||||
if ($config['api']['enabled']) { |
|
||||
$apithreads = 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 `sticky` DESC, `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++; |
|
||||
$post2 = new Post($po, $mod ? '?/' : $config['root'], $mod); |
|
||||
$thread->add($post2); |
|
||||
|
|
||||
} |
|
||||
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); |
|
||||
if ($config['api']['enabled']) { |
|
||||
array_push($apithreads,$thread); |
|
||||
} |
|
||||
} 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'].'/ukko.js"></script>'; |
|
||||
|
|
||||
// json api |
|
||||
if ($config['api']['enabled']) { |
|
||||
require_once __DIR__. '/../../../inc/api.php'; |
|
||||
$api = new Api(); |
|
||||
$jsonFilename = $board['dir'] . '0.json'; |
|
||||
$json = json_encode($api->translatePage($apithreads)); |
|
||||
file_write($jsonFilename, $json); |
|
||||
|
|
||||
|
|
||||
$catalog = array(); |
|
||||
$catalog[0] = $apithreads; |
|
||||
|
|
||||
$json = json_encode($api->translateCatalog($catalog)); |
|
||||
$jsonFilename = $board['dir'] . 'catalog.json'; |
|
||||
file_write($jsonFilename, $json); |
|
||||
|
|
||||
$json = json_encode($api->translateCatalog($catalog, true)); |
|
||||
$jsonFilename = $board['dir'] . 'threads.json'; |
|
||||
file_write($jsonFilename, $json); |
|
||||
} |
|
||||
$antibot = null; |
|
||||
if (!$antibot) { |
|
||||
$antibot = create_antibot($board['uri']); |
|
||||
} |
|
||||
$antibot->reset(); |
|
||||
|
|
||||
return Element('index.html', array( |
|
||||
'config' => $config, |
|
||||
'board' => $board, |
|
||||
'no_post_form' => $config['overboard_post_form'] ? false : true, |
|
||||
'body' => $body, |
|
||||
'mod' => $mod, |
|
||||
'boardlist' => createBoardlist($mod), |
|
||||
'boards' => $boardsforukko2, |
|
||||
'antibot' => $antibot ) |
|
||||
); |
|
||||
} |
|
||||
|
|
||||
}; |
|
||||
|
|
||||
?> |
|
Before Width: | Height: | Size: 13 KiB |
@ -1,116 +0,0 @@ |
|||||
(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); |
|
||||
}); |
|
||||
|
|
||||
})(); |
|
@ -1,55 +0,0 @@ |
|||||
<?php |
|
||||
$theme = array(); |
|
||||
|
|
||||
// Theme name |
|
||||
$theme['name'] = 'Overboard (Ukko3)'; |
|
||||
// Description (you can use Tinyboard markup here) |
|
||||
$theme['description'] = 'Board with threads and messages from all boards'; |
|
||||
$theme['version'] = 'v0.2'; |
|
||||
|
|
||||
// Theme configuration |
|
||||
$theme['config'] = array(); |
|
||||
|
|
||||
$theme['config'][] = array( |
|
||||
'title' => 'Board name', |
|
||||
'name' => 'title', |
|
||||
'type' => 'text', |
|
||||
'default' => 'Ukko' |
|
||||
); |
|
||||
$theme['config'][] = array( |
|
||||
'title' => 'Board URI', |
|
||||
'name' => 'uri', |
|
||||
'type' => 'text', |
|
||||
'default' => '*', |
|
||||
'comment' => '(ukko 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' => 'included boards', |
|
||||
'name' => 'include', |
|
||||
'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'] = 'ukko3_build'; |
|
||||
$theme['install_callback'] = 'ukko3_install'; |
|
||||
|
|
||||
if(!function_exists('ukko3_install')) { |
|
||||
function ukko3_install($settings) { |
|
||||
if (!file_exists($settings['uri'])) |
|
||||
@mkdir($settings['uri'], 0777) or error("Couldn't create " . $settings['uri'] . ". Check permissions.", true); |
|
||||
file_write($settings['uri'] . '/ukko.js', Element('themes/ukko/ukko.js', array())); |
|
||||
} |
|
||||
} |
|
||||
|
|
@ -1,162 +0,0 @@ |
|||||
<?php |
|
||||
require 'info.php'; |
|
||||
|
|
||||
function ukko3_build($action, $settings) { |
|
||||
global $config; |
|
||||
|
|
||||
$ukko3 = new ukko3(); |
|
||||
$ukko3->settings = $settings; |
|
||||
|
|
||||
if (! ($action == 'all' || $action == 'post' || $action == 'post-thread' || $action == 'post-delete')) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
$action = generation_strategy('sb_ukko3', array()); |
|
||||
|
|
||||
if ($action == 'delete') { |
|
||||
file_unlink($settings['uri'] . '/index.html'); |
|
||||
if ($config['api']['enabled']) { |
|
||||
$jsonFilename = $settings['uri'] . '/0.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
$jsonFilename = $settings['uri'] . '/catalog.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
$jsonFilename = $settings['uri'] . '/threads.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
} |
|
||||
} |
|
||||
elseif ($action == 'rebuild') { |
|
||||
file_write($settings['uri'] . '/index.html', $ukko3->build()); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
class ukko3 { |
|
||||
public $settings; |
|
||||
public function build($mod = false) { |
|
||||
global $config; |
|
||||
$boards = listBoards(); |
|
||||
|
|
||||
$body = ''; |
|
||||
$overflow = array(); |
|
||||
$board = array( |
|
||||
'dir' => $this->settings['uri'] . "/", |
|
||||
'url' => $this->settings['uri'], |
|
||||
'uri' => $this->settings['uri'], |
|
||||
'name' => $this->settings['title'], |
|
||||
'title' => sprintf($this->settings['subtitle'], $this->settings['thread_limit']) |
|
||||
); |
|
||||
|
|
||||
$boardsforukko3 = array(); |
|
||||
$query = ''; |
|
||||
foreach($boards as &$_board) { |
|
||||
if(in_array($_board['uri'], explode(' ', $this->settings['include']))){ |
|
||||
$query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` WHERE `thread` IS NULL UNION ALL ", $_board['uri'], $_board['uri']); |
|
||||
array_push($boardsforukko3,$_board); |
|
||||
} |
|
||||
} |
|
||||
$query = preg_replace('/UNION ALL $/', 'ORDER BY `sticky` DESC ,`bump` DESC', $query); |
|
||||
$query = query($query) or error(db_error()); |
|
||||
|
|
||||
$count = 0; |
|
||||
$threads = array(); |
|
||||
if ($config['api']['enabled']) { |
|
||||
$apithreads = 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 `sticky` DESC, `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++; |
|
||||
$post2 = new Post($po, $mod ? '?/' : $config['root'], $mod); |
|
||||
$thread->add($post2); |
|
||||
|
|
||||
} |
|
||||
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); |
|
||||
if ($config['api']['enabled']) { |
|
||||
array_push($apithreads,$thread); |
|
||||
} |
|
||||
} 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'].'/ukko.js"></script>'; |
|
||||
|
|
||||
// json api |
|
||||
if ($config['api']['enabled']) { |
|
||||
require_once __DIR__. '/../../../inc/api.php'; |
|
||||
$api = new Api(); |
|
||||
$jsonFilename = $board['dir'] . '0.json'; |
|
||||
$json = json_encode($api->translatePage($apithreads)); |
|
||||
file_write($jsonFilename, $json); |
|
||||
|
|
||||
|
|
||||
$catalog = array(); |
|
||||
$catalog[0] = $apithreads; |
|
||||
|
|
||||
$json = json_encode($api->translateCatalog($catalog)); |
|
||||
$jsonFilename = $board['dir'] . 'catalog.json'; |
|
||||
file_write($jsonFilename, $json); |
|
||||
|
|
||||
$json = json_encode($api->translateCatalog($catalog, true)); |
|
||||
$jsonFilename = $board['dir'] . 'threads.json'; |
|
||||
file_write($jsonFilename, $json); |
|
||||
} |
|
||||
$antibot = null; |
|
||||
if (!$antibot) { |
|
||||
$antibot = create_antibot($board['uri']); |
|
||||
} |
|
||||
$antibot->reset(); |
|
||||
|
|
||||
return Element('index.html', array( |
|
||||
'config' => $config, |
|
||||
'board' => $board, |
|
||||
'no_post_form' => $config['overboard_post_form'] ? false : true, |
|
||||
'body' => $body, |
|
||||
'mod' => $mod, |
|
||||
'boardlist' => createBoardlist($mod), |
|
||||
'boards' => $boardsforukko3, |
|
||||
'antibot' => $antibot ) |
|
||||
); |
|
||||
} |
|
||||
|
|
||||
}; |
|
||||
|
|
||||
?> |
|
Before Width: | Height: | Size: 13 KiB |
@ -1,116 +0,0 @@ |
|||||
(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); |
|
||||
}); |
|
||||
|
|
||||
})(); |
|
@ -1,55 +0,0 @@ |
|||||
<?php |
|
||||
$theme = array(); |
|
||||
|
|
||||
// Theme name |
|
||||
$theme['name'] = 'Overboard (Ukko) 4'; |
|
||||
// Description (you can use Tinyboard markup here) |
|
||||
$theme['description'] = 'Board with threads and messages from all boards'; |
|
||||
$theme['version'] = 'v0.2'; |
|
||||
|
|
||||
// Theme configuration |
|
||||
$theme['config'] = array(); |
|
||||
|
|
||||
$theme['config'][] = array( |
|
||||
'title' => 'Board name', |
|
||||
'name' => 'title', |
|
||||
'type' => 'text', |
|
||||
'default' => 'Ukko' |
|
||||
); |
|
||||
$theme['config'][] = array( |
|
||||
'title' => 'Board URI', |
|
||||
'name' => 'uri', |
|
||||
'type' => 'text', |
|
||||
'default' => '*', |
|
||||
'comment' => '(ukko 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'] = 'ukko4_build'; |
|
||||
$theme['install_callback'] = 'ukko4_install'; |
|
||||
|
|
||||
if(!function_exists('ukko4_install')) { |
|
||||
function ukko4_install($settings) { |
|
||||
if (!file_exists($settings['uri'])) |
|
||||
@mkdir($settings['uri'], 0777) or error("Couldn't create " . $settings['uri'] . ". Check permissions.", true); |
|
||||
file_write($settings['uri'] . '/ukko.js', Element('themes/ukko/ukko.js', array())); |
|
||||
} |
|
||||
} |
|
||||
|
|
@ -1,162 +0,0 @@ |
|||||
<?php |
|
||||
require 'info.php'; |
|
||||
|
|
||||
function ukko4_build($action, $settings) { |
|
||||
global $config; |
|
||||
|
|
||||
$ukko = new ukko(); |
|
||||
$ukko->settings = $settings; |
|
||||
|
|
||||
if (! ($action == 'all' || $action == 'post' || $action == 'post-thread' || $action == 'post-delete')) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
$action = generation_strategy('sb_ukko', array()); |
|
||||
|
|
||||
if ($action == 'delete') { |
|
||||
file_unlink($settings['uri'] . '/index.html'); |
|
||||
if ($config['api']['enabled']) { |
|
||||
$jsonFilename = $settings['uri'] . '/0.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
$jsonFilename = $settings['uri'] . '/catalog.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
$jsonFilename = $settings['uri'] . '/threads.json'; |
|
||||
file_unlink($jsonFilename); |
|
||||
} |
|
||||
} |
|
||||
elseif ($action == 'rebuild') { |
|
||||
file_write($settings['uri'] . '/index.html', $ukko->build()); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
class ukko4 { |
|
||||
public $settings; |
|
||||
public function build($mod = false) { |
|
||||
global $config; |
|
||||
$boards = listBoards(); |
|
||||
|
|
||||
$body = ''; |
|
||||
$overflow = array(); |
|
||||
$board = array( |
|
||||
'dir' => $this->settings['uri'] . "/", |
|
||||
'url' => $this->settings['uri'], |
|
||||
'uri' => $this->settings['uri'], |
|
||||
'name' => $this->settings['title'], |
|
||||
'title' => sprintf($this->settings['subtitle'], $this->settings['thread_limit']) |
|
||||
); |
|
||||
|
|
||||
$boardsforukko = array(); |
|
||||
$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']); |
|
||||
array_push($boardsforukko,$_board); |
|
||||
} |
|
||||
$query = preg_replace('/UNION ALL $/', 'ORDER BY `bump` DESC', $query); |
|
||||
$query = query($query) or error(db_error()); |
|
||||
|
|
||||
$count = 0; |
|
||||
$threads = array(); |
|
||||
if ($config['api']['enabled']) { |
|
||||
$apithreads = 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 `sticky` DESC, `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++; |
|
||||
$post2 = new Post($po, $mod ? '?/' : $config['root'], $mod); |
|
||||
$thread->add($post2); |
|
||||
|
|
||||
} |
|
||||
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); |
|
||||
if ($config['api']['enabled']) { |
|
||||
array_push($apithreads,$thread); |
|
||||
} |
|
||||
} 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'].'/ukko.js"></script>'; |
|
||||
|
|
||||
// json api |
|
||||
if ($config['api']['enabled']) { |
|
||||
require_once __DIR__. '/../../../inc/api.php'; |
|
||||
$api = new Api(); |
|
||||
$jsonFilename = $board['dir'] . '0.json'; |
|
||||
$json = json_encode($api->translatePage($apithreads)); |
|
||||
file_write($jsonFilename, $json); |
|
||||
|
|
||||
|
|
||||
$catalog = array(); |
|
||||
$catalog[0] = $apithreads; |
|
||||
|
|
||||
$json = json_encode($api->translateCatalog($catalog)); |
|
||||
$jsonFilename = $board['dir'] . 'catalog.json'; |
|
||||
file_write($jsonFilename, $json); |
|
||||
|
|
||||
$json = json_encode($api->translateCatalog($catalog, true)); |
|
||||
$jsonFilename = $board['dir'] . 'threads.json'; |
|
||||
file_write($jsonFilename, $json); |
|
||||
} |
|
||||
$antibot = null; |
|
||||
if (!$antibot) { |
|
||||
$antibot = create_antibot($board['uri']); |
|
||||
} |
|
||||
$antibot->reset(); |
|
||||
|
|
||||
return Element('index.html', array( |
|
||||
'config' => $config, |
|
||||
'board' => $board, |
|
||||
'no_post_form' => $config['overboard_post_form'] ? false : true, |
|
||||
'body' => $body, |
|
||||
'mod' => $mod, |
|
||||
'boardlist' => createBoardlist($mod), |
|
||||
'boards' => $boardsforukko, |
|
||||
'antibot' => $antibot ) |
|
||||
); |
|
||||
} |
|
||||
|
|
||||
}; |
|
||||
|
|
||||
?> |
|
Before Width: | Height: | Size: 13 KiB |
@ -1,116 +0,0 @@ |
|||||
(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); |
|
||||
}); |
|
||||
|
|
||||
})(); |
|
Loading…
Reference in new issue