diff options
59 files changed, 2068 insertions, 140 deletions
@@ -1,6 +1,13 @@ Tinyboard - A lightweight PHP imageboard. ========================================== +Tinyboard + vichan-devel +------------ +Tinyboard branch taking lightweightness somewhat more liberally. Running live at +https://pl.vichan.net/ (Polish) and http://vichan.net/ (International; may be outdated). + +It contains many changes from original Tinyboard, mainly in frontend area. + About ------------ Tinyboard is a light-weight, fast, highly configurable and user-friendly diff --git a/attentionbar.php b/attentionbar.php new file mode 100644 index 00000000..e928daae --- /dev/null +++ b/attentionbar.php @@ -0,0 +1,10 @@ +<?php + require_once 'inc/functions.php'; + checkBan(); + if(@strlen($_POST["text"])>0) { + file_put_contents("attentionbar.txt",$_POST["text"]); + if(strlen($_SERVER['HTTP_REFERER'])>0) { header('Location: ' . $_SERVER['HTTP_REFERER']); } + else { header('Location: /'); } + } else print(file_get_contents("attentionbar.txt")); + return; +?> diff --git a/attentionbar.txt b/attentionbar.txt new file mode 100644 index 00000000..50aa355b --- /dev/null +++ b/attentionbar.txt @@ -0,0 +1 @@ +- * ( Pasek Atencji ) * - diff --git a/banned.php b/banned.php new file mode 100644 index 00000000..57e4a9bc --- /dev/null +++ b/banned.php @@ -0,0 +1,7 @@ +<?php + require_once 'inc/functions.php'; + checkBan(); + print "<!doctype html><html><head><meta charset='utf-8'><title>"._("Banned?")."</title></head><body>"; + print "<h1>"._("You are not banned.")."</h1>"; + print "</body></html>"; +?> diff --git a/inc/api.php b/inc/api.php new file mode 100644 index 00000000..5592d8af --- /dev/null +++ b/inc/api.php @@ -0,0 +1,123 @@ +<?php + +/* + * Copyright (c) 2010-2013 Tinyboard Development Group + */ + +/** + * Class for generating json API compatible with 4chan API + */ +class Api { + + /** + * Translation from local fields to fields in 4chan-style API + */ + public static $postFields = array( + 'id' => 'no', + 'thread' => 'resto', + 'subject' => 'sub', + 'email' => 'email', + 'name' => 'name', + 'trip' => 'trip', + 'capcode' => 'capcode', + 'body' => 'com', + 'time' => 'time', + 'thumb' => 'thumb', // non-compatible field + 'thumbx' => 'tn_w', + 'thumby' => 'tn_h', + 'file' => 'file', // non-compatible field + 'filex' => 'w', + 'filey' => 'h', + 'filesize' => 'fsize', + //'filename' => 'filename', + 'omitted' => 'omitted_posts', + 'omitted_images' => 'omitted_images', + //'posts' => 'replies', + //'ip' => '', + 'sticky' => 'sticky', + 'locked' => 'locked', + //'bumplocked' => '', + //'embed' => '', + //'root' => '', + //'mod' => '', + //'hr' => '', + ); + + static $ints = array( + 'no' => 1, + 'resto' => 1, + 'time' => 1, + 'tn_w' => 1, + 'tn_h' => 1, + 'w' => 1, + 'h' => 1, + 'fsize' => 1, + 'omitted_posts' => 1, + 'omitted_images' => 1, + 'sticky' => 1, + 'locked' => 1, + ); + + private function translatePost($post) { + $apiPost = array(); + foreach (self::$postFields as $local => $translated) { + if (!isset($post->$local)) + continue; + + $toInt = isset(self::$ints[$translated]); + $val = $post->$local; + if ($val !== null && $val !== '') { + $apiPost[$translated] = $toInt ? (int) $val : $val; + } + } + + if (isset($post->filename)) { + $dotPos = strrpos($post->filename, '.'); + $apiPost['filename'] = substr($post->filename, 0, $dotPos); + $apiPost['ext'] = substr($post->filename, $dotPos); + } + + return $apiPost; + } + + function translateThread(Thread $thread) { + $apiPosts = array(); + $op = $this->translatePost($thread); + $op['resto'] = 0; + $apiPosts['posts'][] = $op; + + foreach ($thread->posts as $p) { + $apiPosts['posts'][] = $this->translatePost($p); + } + + return $apiPosts; + } + + function translatePage(array $threads) { + $apiPage = array(); + foreach ($threads as $thread) { + $apiPage['threads'][] = $this->translateThread($thread); + } + return $apiPage; + } + + function translateCatalogPage(array $threads) { + $apiPage = array(); + foreach ($threads as $thread) { + $ts = $this->translateThread($thread); + $apiPage['threads'][] = current($ts['posts']); + } + return $apiPage; + } + + function translateCatalog($catalog) { + $apiCatalog = array(); + foreach ($catalog as $page => $threads) { + $apiPage = $this->translateCatalogPage($threads); + $apiPage['page'] = $page; + $apiCatalog[] = $apiPage; + } + + return $apiCatalog; + } +} diff --git a/inc/config.php b/inc/config.php index ef2ba4ac..cddbf074 100644 --- a/inc/config.php +++ b/inc/config.php @@ -345,9 +345,10 @@ $config['auto_unicode'] = true; // Whether to turn URLs into functional links. $config['markup_urls'] = true; + // Optional URL prefix for links (eg. "http://anonym.to/?"). $config['link_prefix'] = ''; - + $config['url_ads'] = &$config['link_prefix']; // leave alias // A wordfilter (sometimes referred to as just a "filter" or "censor") automatically scans users’ posts // as they are submitted and changes or censors particular words or phrases. @@ -446,7 +447,7 @@ $config['markup'][] = array("/'''([^<]+?)'''/", "<strong>\$1</strong>"); $config['markup'][] = array("/''([^<]+?)''/", "<em>\$1</em>"); $config['markup'][] = array("/\*\*([^<]+?)\*\*/", "<span class=\"spoiler\">\$1</span>"); - // $config['markup'][] = array("/^[ |\t]*==([^<]+?)==[ |\t]*$/m", "<span class=\"heading\">\$1</span>"); + $config['markup'][] = array("/^[ |\t]*==([^<]+?)==[ |\t]*$/m", "<span class=\"heading\">\$1</span>"); // Highlight PHP code wrapped in <code> tags (PHP 5.3+) // $config['markup'][] = array( @@ -615,6 +616,10 @@ // Number of reports you can create at once. $config['report_limit'] = 3; + // Attention Whoring Bar + // REMEMBER TO CHMOD attentionbar.txt PROPERLY + // Oh, and add jQuery in additional_javascript. + $config['attention_bar'] = false; /* * ==================== * Display settings @@ -1231,6 +1236,28 @@ /* * ==================== + * Public post search + * ==================== + */ + $config['search'] = array(); + + // Enable the search form + $config['search']['enable'] = false; + + // Maximal number of queries per IP address per minutes + $config['search']['queries_per_minutes'] = Array(15, 2); + + // Global maximal number of queries per minutes + $config['search']['queries_per_minutes_all'] = Array(50, 2); + + // Limit of search results + $config['search']['search_limit'] = 100; + + // Boards for searching + //$config['search']['boards'] = array('a', 'b', 'c', 'd', 'e'); + +/* + * ==================== * Events (PHP 5.3.0+) * ==================== */ diff --git a/inc/display.php b/inc/display.php index 97b8c744..18eeb1f6 100644 --- a/inc/display.php +++ b/inc/display.php @@ -25,8 +25,8 @@ function doBoardListPart($list, $root) { $body = ''; foreach ($list as $board) { if (is_array($board)) - $body .= ' [' . doBoardListPart($board, $root) . '] '; - // $body .= ' <span class="sub">[' . doBoardListPart($board, $root) . ']</span> '; + // $body .= ' [' . doBoardListPart($board, $root) . '] '; + $body .= ' <span class="sub">[' . doBoardListPart($board, $root) . ']</span> '; else { if (($key = array_search($board, $list)) && gettype($key) == 'string') { $body .= ' <a href="' . $board . '">' . $key . '</a> /'; diff --git a/inc/functions.php b/inc/functions.php index 74ab96e9..7ed131d5 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -13,6 +13,7 @@ require_once 'inc/display.php'; require_once 'inc/template.php'; require_once 'inc/database.php'; require_once 'inc/events.php'; +require_once 'inc/api.php'; require_once 'inc/lib/gettext/gettext.inc'; // the user is not currently logged in as a moderator @@ -1043,6 +1044,9 @@ function index($page, $mod=false) { if ($query->rowCount() < 1 && $page > 1) return false; + + $threads = array(); + while ($th = $query->fetch(PDO::FETCH_ASSOC)) { $thread = new Thread( $th['id'], $th['subject'], $th['email'], $th['name'], $th['trip'], $th['capcode'], $th['body'], $th['time'], $th['thumb'], @@ -1092,6 +1096,7 @@ function index($page, $mod=false) { $thread->omitted_images = $omitted['image_count'] - $num_images; } + $threads[] = $thread; $body .= $thread->build(true); } @@ -1100,7 +1105,8 @@ function index($page, $mod=false) { 'body' => $body, 'post_url' => $config['post_url'], 'config' => $config, - 'boardlist' => createBoardlist($mod) + 'boardlist' => createBoardlist($mod), + 'threads' => $threads ); } @@ -1293,6 +1299,9 @@ function buildIndex() { if (!$config['try_smarter']) $antibot = create_antibot($board['uri']); + $api = new Api(); + $catalog = array(); + for ($page = 1; $page <= $config['max_pages']; $page++) { $filename = $board['dir'] . ($page == 1 ? $config['file_index'] : sprintf($config['file_page'], $page)); @@ -1313,13 +1322,31 @@ function buildIndex() { $content['antibot'] = $antibot; file_write($filename, Element('index.html', $content)); + + // json api + $threads = $content['threads']; + $json = json_encode($api->translatePage($threads)); + $jsonFilename = $board['dir'] . ($page-1) . ".json"; // pages should start from 0 + file_write($jsonFilename, $json); + + $catalog[$page-1] = $threads; + + $page++; } if ($page < $config['max_pages']) { for (;$page<=$config['max_pages'];$page++) { $filename = $board['dir'] . ($page==1 ? $config['file_index'] : sprintf($config['file_page'], $page)); file_unlink($filename); + + $jsonFilename = $board['dir'] . ($page-1) . ".json"; + file_unlink($jsonFilename); } } + + // json api catalog + $json = json_encode($api->translateCatalog($catalog)); + $jsonFilename = $board['dir'] . "catalog.json"; + file_write($jsonFilename, $json); } function buildJavascript() { @@ -1470,7 +1497,7 @@ function markup(&$body, $track_cites = false) { $body = str_replace("\r", '', $body); $body = utf8tohtml($body); - if (preg_match_all('@<tinyboard ([\w\s]+)>(.+?)</tinyboard>@um', $body, $modifiers, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { + if (preg_match_all('@<tinyboard ([\w\s]+)>(.+?)</tinyboard>@us', $body, $modifiers, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { $skip_chars = 0; $body_tmp = $body; $end_markup = false; @@ -1764,6 +1791,12 @@ function buildThread($id, $return = false, $mod = false) { return $body; file_write($board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], $id), $body); + + // json api + $api = new Api(); + $json = json_encode($api->translateThread($thread)); + $jsonFilename = $board['dir'] . $config['dir']['res'] . $id . ".json"; + file_write($jsonFilename, $json); } function rrmdir($dir) { diff --git a/inc/locale/pl_PL/LC_MESSAGES/javascript.js b/inc/locale/pl_PL/LC_MESSAGES/javascript.js index caf4a66c..9345b0b3 100644 --- a/inc/locale/pl_PL/LC_MESSAGES/javascript.js +++ b/inc/locale/pl_PL/LC_MESSAGES/javascript.js @@ -1 +1 @@ -l10n = {"Submit":"Wy\u015blij","Quick reply":"Szybka odpowied\u017a","Posting mode: Replying to <small>>>{0}<\/small>":"Tryb postowania: Odpowied\u017a na <small>>>{0}<\/small>","Return":"Powr\u00f3t","Click reply to view.":"Kliknij Odpowied\u017a aby zobaczy\u0107.","Click to expand":"Kliknij aby rozwin\u0105\u0107","Hide expanded replies":"Schowaj rozwini\u0119te odpowiedzi","Mon":"pon","Tue":"wto","Wed":"\u015bro","Thu":"czw","Fri":"pi\u0105","Sat":"sob","Sun":"nie","Show locked threads":"Poka\u017c zablokowane tematy","Hide locked threads":"Schowaj zablokowane tematy","Forced anonymity":"Wymuszona anonimowo\u015b\u0107","enabled":"w\u0142\u0105czona","disabled":"wy\u0142\u0105czona","Password":"Has\u0142o","Delete file only":"Usu\u0144 tylko plik","File":"Plik","Delete":"Usu\u0144","Reason":"Pow\u00f3d","Report":"Zg\u0142oszenie","hide":"ukryj","show":"poka\u017c","hidden":"ukryte","Show images":"Poka\u017c obrazki","Hide images":"Ukryj obrazki"};
\ No newline at end of file +l10n = {"Submit":"Wy\u015blij","Quick reply":"Szybka odpowied\u017a","Posting mode: Replying to <small>>>{0}<\/small>":"Tryb postowania: Odpowied\u017a na <small>>>{0}<\/small>","Return":"Powr\u00f3t","Click reply to view.":"Kliknij Odpowied\u017a aby zobaczy\u0107.","Click to expand":"Kliknij aby rozwin\u0105\u0107","Hide expanded replies":"Schowaj rozwini\u0119te odpowiedzi","Mon":"pon","Tue":"wto","Wed":"\u015bro","Thu":"czw","Fri":"pi\u0105","Sat":"sob","Sun":"nie","Show locked threads":"Poka\u017c zablokowane tematy","Hide locked threads":"Schowaj zablokowane tematy","Forced anonymity":"Wymuszona anonimowo\u015b\u0107","enabled":"w\u0142\u0105czona","disabled":"wy\u0142\u0105czona","Password":"Has\u0142o","Delete file only":"Usu\u0144 tylko plik","File":"Plik","Delete":"Usu\u0144","Reason":"Pow\u00f3d","Report":"Zg\u0142oszenie","hide":"ukryj","show":"poka\u017c","hidden":"ukryte","Show images":"Poka\u017c obrazki","Hide images":"Ukryj obrazki","Style: ":"Styl: ","Hello!":"Witaj!","{0} users":"{0} u\u017cytkownik\u00f3w","(hide threads from this board)":"(schowaj w\u0105tki z tego boardu)","(show threads from this board)":"(poka\u017c w\u0105tki z tego boardu)","No more threads to display":"Nie ma wi\u0119cej w\u0105tk\u00f3w do wy\u015bwietlenia","Loading...":"\u0141adowanie..."};
\ No newline at end of file diff --git a/inc/locale/pl_PL/LC_MESSAGES/javascript.po b/inc/locale/pl_PL/LC_MESSAGES/javascript.po index ae1bb5c9..474f4fe8 100644 --- a/inc/locale/pl_PL/LC_MESSAGES/javascript.po +++ b/inc/locale/pl_PL/LC_MESSAGES/javascript.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-01 01:58-0400\n" +"POT-Creation-Date: 2013-08-05 05:28-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -140,3 +140,33 @@ msgstr "Pokaż obrazki" #: ../../../../js/toggle-images.js:57 ../../../../js/toggle-images.js:70 msgid "Hide images" msgstr "Ukryj obrazki" + +#: ../../../../js/style-select.js:40 +msgid "Style: " +msgstr "Styl: " + +#: ../../../../templates/main.js:6 +msgid "Hello!" +msgstr "Witaj!" + +#: ../../../../templates/main.js:18 +msgid "{0} users" +msgstr "{0} użytkowników" + +#: ../../../../templates/themes/ukko/ukko.js:28 +#: ../../../../templates/themes/ukko/ukko.js:39 +msgid "(hide threads from this board)" +msgstr "(schowaj wątki z tego boardu)" + +#: ../../../../templates/themes/ukko/ukko.js:32 +#: ../../../../templates/themes/ukko/ukko.js:44 +msgid "(show threads from this board)" +msgstr "(pokaż wątki z tego boardu)" + +#: ../../../../templates/themes/ukko/ukko.js:57 +msgid "No more threads to display" +msgstr "Nie ma więcej wątków do wyświetlenia" + +#: ../../../../templates/themes/ukko/ukko.js:79 +msgid "Loading..." +msgstr "Ładowanie..." diff --git a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.mo b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.mo Binary files differindex d2807a37..7f72498a 100644 --- a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.mo +++ b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.mo diff --git a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po index a5a58616..d527d0b4 100644 --- a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po +++ b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-01 01:58-0400\n" +"POT-Creation-Date: 2013-08-05 05:23-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -25,6 +25,7 @@ msgstr "" #: ../../../../inc/functions.php:1039 ../../../../inc/functions.php:1053 #: ../../../../inc/functions.php:1068 ../../../../inc/functions.php:1082 #: ../../../../inc/functions.php:1079 ../../../../inc/functions.php:1093 +#: ../../../../inc/functions.php:1122 ../../../../inc/functions.php:1136 msgid "Previous" msgstr "Wstecz" @@ -35,6 +36,7 @@ msgstr "Wstecz" #: ../../../../inc/functions.php:1058 ../../../../inc/functions.php:1067 #: ../../../../inc/functions.php:1087 ../../../../inc/functions.php:1096 #: ../../../../inc/functions.php:1098 ../../../../inc/functions.php:1107 +#: ../../../../inc/functions.php:1141 ../../../../inc/functions.php:1150 msgid "Next" msgstr "Dalej" @@ -44,6 +46,7 @@ msgstr "Niewspierany format pliku: " #: /var/www/html/Tinyboard/inc/mod.php:129 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:74 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:79 msgid "Create new board" msgstr "Stwórz nowy board" @@ -55,11 +58,18 @@ msgstr "Stwórz nowy board" #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:150 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:207 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:155 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:312 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:74 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:166 msgid "all boards" msgstr "wszystkie boardy" +#. How long before Tinyboard forgets about a mute? +#. 2 weeks +#. If you want to alter the algorithm a bit. Default value is 2. +#. (n^x where x is the number of previous mutes) #: /var/www/html/Tinyboard/inc/config.php:305 ../../../../inc/config.php:330 -#: ../../../../inc/config.php:334 +#: ../../../../inc/config.php:334 ../../../../inc/config.php:342 msgid "You have been muted for unoriginal content." msgstr "Zostałeś wyciszony za nieoryginalną treść." @@ -68,11 +78,14 @@ msgid "Anonymous" msgstr "Anonimowy" #. The names on the post buttons. (On most imageboards, these are both "Post") +#. The names on the post buttons. (On most imageboards, these are both just "Post"). #: /var/www/html/Tinyboard/inc/config.php:481 ../../../../inc/config.php:552 +#: ../../../../inc/config.php:641 msgid "New Topic" msgstr "Nowy wątek" #: /var/www/html/Tinyboard/inc/config.php:482 ../../../../inc/config.php:553 +#: ../../../../inc/config.php:642 msgid "New Reply" msgstr "Odpowiedz" @@ -89,18 +102,21 @@ msgstr "Szybka odpowiedź" #: /var/www/html/Tinyboard/inc/config.php:600 ../../../../inc/config.php:638 #: ../../../../inc/config.php:692 ../../../../inc/config.php:698 #: ../../../../inc/config.php:695 ../../../../inc/config.php:701 +#: ../../../../inc/config.php:803 msgid "Lurk some more before posting." msgstr "Nie postuj pierwszego dnia." #: /var/www/html/Tinyboard/inc/config.php:601 ../../../../inc/config.php:639 #: ../../../../inc/config.php:693 ../../../../inc/config.php:699 #: ../../../../inc/config.php:696 ../../../../inc/config.php:702 +#: ../../../../inc/config.php:804 msgid "You look like a bot." msgstr "Wyglądasz jak bot." #: /var/www/html/Tinyboard/inc/config.php:602 ../../../../inc/config.php:640 #: ../../../../inc/config.php:694 ../../../../inc/config.php:700 #: ../../../../inc/config.php:697 ../../../../inc/config.php:703 +#: ../../../../inc/config.php:805 msgid "Your browser sent an invalid or no HTTP referer." msgstr "" "Twoja przeglądarka przesłała niepoprawny, bądź nie przesłała informacji o " @@ -109,6 +125,7 @@ msgstr "" #: /var/www/html/Tinyboard/inc/config.php:603 ../../../../inc/config.php:641 #: ../../../../inc/config.php:695 ../../../../inc/config.php:701 #: ../../../../inc/config.php:698 ../../../../inc/config.php:704 +#: ../../../../inc/config.php:806 #, php-format msgid "The %s field was too long." msgstr "Pole %s jest za długie" @@ -116,78 +133,91 @@ msgstr "Pole %s jest za długie" #: /var/www/html/Tinyboard/inc/config.php:604 ../../../../inc/config.php:642 #: ../../../../inc/config.php:696 ../../../../inc/config.php:702 #: ../../../../inc/config.php:699 ../../../../inc/config.php:705 +#: ../../../../inc/config.php:807 msgid "The body was too long." msgstr "Zawartość jest za długa." #: /var/www/html/Tinyboard/inc/config.php:605 ../../../../inc/config.php:643 #: ../../../../inc/config.php:697 ../../../../inc/config.php:703 #: ../../../../inc/config.php:700 ../../../../inc/config.php:706 +#: ../../../../inc/config.php:808 msgid "The body was too short or empty." msgstr "Zawartość jest za krótka, bądź pusta." #: /var/www/html/Tinyboard/inc/config.php:606 ../../../../inc/config.php:644 #: ../../../../inc/config.php:698 ../../../../inc/config.php:704 #: ../../../../inc/config.php:701 ../../../../inc/config.php:707 +#: ../../../../inc/config.php:809 msgid "You must upload an image." msgstr "Musisz wysłać obrazek." #: /var/www/html/Tinyboard/inc/config.php:607 ../../../../inc/config.php:645 #: ../../../../inc/config.php:699 ../../../../inc/config.php:705 #: ../../../../inc/config.php:702 ../../../../inc/config.php:708 +#: ../../../../inc/config.php:810 msgid "The server failed to handle your upload." msgstr "Nie udało się obsłużyć twojego pliku." #: /var/www/html/Tinyboard/inc/config.php:608 ../../../../inc/config.php:646 #: ../../../../inc/config.php:700 ../../../../inc/config.php:706 #: ../../../../inc/config.php:703 ../../../../inc/config.php:709 +#: ../../../../inc/config.php:811 msgid "Unsupported image format." msgstr "Niewspierany format obrazka." #: /var/www/html/Tinyboard/inc/config.php:609 ../../../../inc/config.php:647 #: ../../../../inc/config.php:701 ../../../../inc/config.php:707 #: ../../../../inc/config.php:704 ../../../../inc/config.php:710 +#: ../../../../inc/config.php:812 msgid "Invalid board!" msgstr "Niepoprawny board!" #: /var/www/html/Tinyboard/inc/config.php:610 ../../../../inc/config.php:648 #: ../../../../inc/config.php:702 ../../../../inc/config.php:708 #: ../../../../inc/config.php:705 ../../../../inc/config.php:711 +#: ../../../../inc/config.php:813 msgid "Thread specified does not exist." msgstr "Wybrany wątek nie istnieje." #: /var/www/html/Tinyboard/inc/config.php:611 ../../../../inc/config.php:649 #: ../../../../inc/config.php:703 ../../../../inc/config.php:709 #: ../../../../inc/config.php:706 ../../../../inc/config.php:712 +#: ../../../../inc/config.php:814 msgid "Thread locked. You may not reply at this time." msgstr "Wątek jest zablokowany. Nie możesz w nim teraz postować." #: /var/www/html/Tinyboard/inc/config.php:612 ../../../../inc/config.php:650 #: ../../../../inc/config.php:706 ../../../../inc/config.php:712 #: ../../../../inc/config.php:709 ../../../../inc/config.php:715 +#: ../../../../inc/config.php:817 msgid "You didn't make a post." msgstr "Nie zrobiłeś posta." #: /var/www/html/Tinyboard/inc/config.php:613 ../../../../inc/config.php:651 #: ../../../../inc/config.php:707 ../../../../inc/config.php:713 #: ../../../../inc/config.php:710 ../../../../inc/config.php:716 +#: ../../../../inc/config.php:818 msgid "Flood detected; Post discarded." msgstr "Wykryto flood; Post odrzucony." #: /var/www/html/Tinyboard/inc/config.php:614 ../../../../inc/config.php:652 #: ../../../../inc/config.php:708 ../../../../inc/config.php:714 #: ../../../../inc/config.php:711 ../../../../inc/config.php:717 +#: ../../../../inc/config.php:819 msgid "Your request looks automated; Post discarded." msgstr "Twoje żądanie wygląda na zautomatyzowane; Post odrzucony." #: /var/www/html/Tinyboard/inc/config.php:615 ../../../../inc/config.php:653 #: ../../../../inc/config.php:709 ../../../../inc/config.php:715 #: ../../../../inc/config.php:712 ../../../../inc/config.php:718 +#: ../../../../inc/config.php:820 msgid "Unoriginal content!" msgstr "Nieoryginalna treść!" #: /var/www/html/Tinyboard/inc/config.php:616 ../../../../inc/config.php:654 #: ../../../../inc/config.php:710 ../../../../inc/config.php:716 #: ../../../../inc/config.php:713 ../../../../inc/config.php:719 +#: ../../../../inc/config.php:821 #, php-format msgid "Unoriginal content! You have been muted for %d seconds." msgstr "Nieoryginalna treść! Zostałeś wyciszony na %d sekund." @@ -195,6 +225,7 @@ msgstr "Nieoryginalna treść! Zostałeś wyciszony na %d sekund." #: /var/www/html/Tinyboard/inc/config.php:617 ../../../../inc/config.php:655 #: ../../../../inc/config.php:711 ../../../../inc/config.php:717 #: ../../../../inc/config.php:714 ../../../../inc/config.php:720 +#: ../../../../inc/config.php:822 #, php-format msgid "You are muted! Expires in %d seconds." msgstr "Jesteś wyciszony! Wygasa w ciągu %d sekund." @@ -202,6 +233,7 @@ msgstr "Jesteś wyciszony! Wygasa w ciągu %d sekund." #: /var/www/html/Tinyboard/inc/config.php:618 ../../../../inc/config.php:656 #: ../../../../inc/config.php:712 ../../../../inc/config.php:718 #: ../../../../inc/config.php:715 ../../../../inc/config.php:721 +#: ../../../../inc/config.php:823 #, php-format msgid "Your IP address is listed in %s." msgstr "Twój adres IP jest na liście %s." @@ -209,60 +241,70 @@ msgstr "Twój adres IP jest na liście %s." #: /var/www/html/Tinyboard/inc/config.php:619 ../../../../inc/config.php:657 #: ../../../../inc/config.php:713 ../../../../inc/config.php:719 #: ../../../../inc/config.php:716 ../../../../inc/config.php:722 +#: ../../../../inc/config.php:824 msgid "Too many links; flood detected." msgstr "Zbyt dużo linków; wykryto flood." #: /var/www/html/Tinyboard/inc/config.php:620 ../../../../inc/config.php:658 #: ../../../../inc/config.php:714 ../../../../inc/config.php:720 #: ../../../../inc/config.php:717 ../../../../inc/config.php:723 +#: ../../../../inc/config.php:825 msgid "Too many cites; post discarded." msgstr "Zbyt dużo cytatów; post odrzucony." #: /var/www/html/Tinyboard/inc/config.php:621 ../../../../inc/config.php:659 #: ../../../../inc/config.php:715 ../../../../inc/config.php:721 #: ../../../../inc/config.php:718 ../../../../inc/config.php:724 +#: ../../../../inc/config.php:826 msgid "Too many cross-board links; post discarded." msgstr "Zbyt dużo linków między boardami; post odrzucony." #: /var/www/html/Tinyboard/inc/config.php:622 ../../../../inc/config.php:660 #: ../../../../inc/config.php:716 ../../../../inc/config.php:722 #: ../../../../inc/config.php:719 ../../../../inc/config.php:725 +#: ../../../../inc/config.php:827 msgid "You didn't select anything to delete." msgstr "Nie wybrano nic do usunięcia." #: /var/www/html/Tinyboard/inc/config.php:623 ../../../../inc/config.php:661 #: ../../../../inc/config.php:717 ../../../../inc/config.php:723 #: ../../../../inc/config.php:720 ../../../../inc/config.php:726 +#: ../../../../inc/config.php:828 msgid "You didn't select anything to report." msgstr "Nie wybrano nic do zgłoszenia." #: /var/www/html/Tinyboard/inc/config.php:624 ../../../../inc/config.php:662 #: ../../../../inc/config.php:718 ../../../../inc/config.php:724 #: ../../../../inc/config.php:721 ../../../../inc/config.php:727 +#: ../../../../inc/config.php:829 msgid "You can't report that many posts at once." msgstr "Nie możesz raportować tyle postów na raz." #: /var/www/html/Tinyboard/inc/config.php:625 ../../../../inc/config.php:663 #: ../../../../inc/config.php:719 ../../../../inc/config.php:725 #: ../../../../inc/config.php:722 ../../../../inc/config.php:728 +#: ../../../../inc/config.php:830 msgid "Wrong password…" msgstr "Niepoprawne hasło" #: /var/www/html/Tinyboard/inc/config.php:626 ../../../../inc/config.php:664 #: ../../../../inc/config.php:720 ../../../../inc/config.php:726 #: ../../../../inc/config.php:723 ../../../../inc/config.php:729 +#: ../../../../inc/config.php:831 msgid "Invalid image." msgstr "Niepoprawny obrazek." #: /var/www/html/Tinyboard/inc/config.php:627 ../../../../inc/config.php:665 #: ../../../../inc/config.php:721 ../../../../inc/config.php:727 #: ../../../../inc/config.php:724 ../../../../inc/config.php:730 +#: ../../../../inc/config.php:832 msgid "Unknown file extension." msgstr "Nieznane rozszerzenie pliku." #: /var/www/html/Tinyboard/inc/config.php:628 ../../../../inc/config.php:666 #: ../../../../inc/config.php:722 ../../../../inc/config.php:728 #: ../../../../inc/config.php:725 ../../../../inc/config.php:731 +#: ../../../../inc/config.php:833 msgid "Maximum file size: %maxsz% bytes<br>Your file's size: %filesz% bytes" msgstr "" "Maksymalny rozmiar pliku: %maxsz% bajtów<br>Rozmiar twojego pliku: %filesz% " @@ -271,18 +313,21 @@ msgstr "" #: /var/www/html/Tinyboard/inc/config.php:629 ../../../../inc/config.php:667 #: ../../../../inc/config.php:723 ../../../../inc/config.php:729 #: ../../../../inc/config.php:726 ../../../../inc/config.php:732 +#: ../../../../inc/config.php:834 msgid "The file was too big." msgstr "Plik jest za duży." #: /var/www/html/Tinyboard/inc/config.php:630 ../../../../inc/config.php:668 #: ../../../../inc/config.php:724 ../../../../inc/config.php:730 #: ../../../../inc/config.php:727 ../../../../inc/config.php:733 +#: ../../../../inc/config.php:835 msgid "Invalid archive!" msgstr "Niepoprawne archiwum!" #: /var/www/html/Tinyboard/inc/config.php:631 ../../../../inc/config.php:669 #: ../../../../inc/config.php:725 ../../../../inc/config.php:731 #: ../../../../inc/config.php:728 ../../../../inc/config.php:734 +#: ../../../../inc/config.php:836 #, php-format msgid "That file <a href=\"%s\">already exists</a>!" msgstr "Ten plik <a href=\"%s\">już istnieje</a>!" @@ -290,6 +335,7 @@ msgstr "Ten plik <a href=\"%s\">już istnieje</a>!" #: /var/www/html/Tinyboard/inc/config.php:632 ../../../../inc/config.php:670 #: ../../../../inc/config.php:727 ../../../../inc/config.php:733 #: ../../../../inc/config.php:730 ../../../../inc/config.php:736 +#: ../../../../inc/config.php:838 #, php-format msgid "You'll have to wait another %s before deleting that." msgstr "Musisz poczekać kolejne %s przed usunięciem tego." @@ -297,6 +343,7 @@ msgstr "Musisz poczekać kolejne %s przed usunięciem tego." #: /var/www/html/Tinyboard/inc/config.php:633 ../../../../inc/config.php:671 #: ../../../../inc/config.php:728 ../../../../inc/config.php:734 #: ../../../../inc/config.php:731 ../../../../inc/config.php:737 +#: ../../../../inc/config.php:839 msgid "MIME type detection XSS exploit (IE) detected; post discarded." msgstr "" "Wykryto próbę wykorzystania luki wykrywania typu MIME (XSS w IE); post " @@ -305,30 +352,35 @@ msgstr "" #: /var/www/html/Tinyboard/inc/config.php:634 ../../../../inc/config.php:672 #: ../../../../inc/config.php:729 ../../../../inc/config.php:735 #: ../../../../inc/config.php:732 ../../../../inc/config.php:738 +#: ../../../../inc/config.php:840 msgid "Couldn't make sense of the URL of the video you tried to embed." msgstr "Nie można było zrozumieć URL-a wideo, którego próbowano zapostować." #: /var/www/html/Tinyboard/inc/config.php:635 ../../../../inc/config.php:673 #: ../../../../inc/config.php:730 ../../../../inc/config.php:736 #: ../../../../inc/config.php:733 ../../../../inc/config.php:739 +#: ../../../../inc/config.php:841 msgid "You seem to have mistyped the verification." msgstr "Wygląda na to, że przepisano źle weryfikację." #: /var/www/html/Tinyboard/inc/config.php:638 ../../../../inc/config.php:676 #: ../../../../inc/config.php:734 ../../../../inc/config.php:740 #: ../../../../inc/config.php:737 ../../../../inc/config.php:743 +#: ../../../../inc/config.php:845 msgid "Invalid username and/or password." msgstr "Błędna nazwa użytkownika, bądź hasło" #: /var/www/html/Tinyboard/inc/config.php:639 ../../../../inc/config.php:677 #: ../../../../inc/config.php:735 ../../../../inc/config.php:741 #: ../../../../inc/config.php:738 ../../../../inc/config.php:744 +#: ../../../../inc/config.php:846 msgid "You are not a mod…" msgstr "Nie jesteś moderatorem" #: /var/www/html/Tinyboard/inc/config.php:640 ../../../../inc/config.php:678 #: ../../../../inc/config.php:736 ../../../../inc/config.php:742 #: ../../../../inc/config.php:739 ../../../../inc/config.php:745 +#: ../../../../inc/config.php:847 msgid "" "Invalid username and/or password. Your user may have been deleted or changed." msgstr "" @@ -338,18 +390,21 @@ msgstr "" #: /var/www/html/Tinyboard/inc/config.php:641 ../../../../inc/config.php:679 #: ../../../../inc/config.php:737 ../../../../inc/config.php:743 #: ../../../../inc/config.php:740 ../../../../inc/config.php:746 +#: ../../../../inc/config.php:848 msgid "Invalid/malformed cookies." msgstr "Niepoprawne/zmodyfikowane pliki cookie." #: /var/www/html/Tinyboard/inc/config.php:642 ../../../../inc/config.php:680 #: ../../../../inc/config.php:738 ../../../../inc/config.php:744 #: ../../../../inc/config.php:741 ../../../../inc/config.php:747 +#: ../../../../inc/config.php:849 msgid "Your browser didn't submit an input when it should have." msgstr "Twoja przeglądarka nie wysłała pola, kiedy powinna." #: /var/www/html/Tinyboard/inc/config.php:643 ../../../../inc/config.php:681 #: ../../../../inc/config.php:739 ../../../../inc/config.php:745 #: ../../../../inc/config.php:742 ../../../../inc/config.php:748 +#: ../../../../inc/config.php:850 #, php-format msgid "The %s field is required." msgstr "Pole %s jest wymagane." @@ -357,6 +412,7 @@ msgstr "Pole %s jest wymagane." #: /var/www/html/Tinyboard/inc/config.php:644 ../../../../inc/config.php:682 #: ../../../../inc/config.php:740 ../../../../inc/config.php:746 #: ../../../../inc/config.php:743 ../../../../inc/config.php:749 +#: ../../../../inc/config.php:851 #, php-format msgid "The %s field was invalid." msgstr "Pole %s jest niepoprawne." @@ -364,6 +420,7 @@ msgstr "Pole %s jest niepoprawne." #: /var/www/html/Tinyboard/inc/config.php:645 ../../../../inc/config.php:683 #: ../../../../inc/config.php:741 ../../../../inc/config.php:747 #: ../../../../inc/config.php:744 ../../../../inc/config.php:750 +#: ../../../../inc/config.php:852 #, php-format msgid "There is already a %s board." msgstr "Już istnieje board %s" @@ -371,24 +428,28 @@ msgstr "Już istnieje board %s" #: /var/www/html/Tinyboard/inc/config.php:646 ../../../../inc/config.php:684 #: ../../../../inc/config.php:742 ../../../../inc/config.php:748 #: ../../../../inc/config.php:745 ../../../../inc/config.php:751 +#: ../../../../inc/config.php:853 msgid "You don't have permission to do that." msgstr "Nie masz uprawnień do wykonania tej czynności." #: /var/www/html/Tinyboard/inc/config.php:647 ../../../../inc/config.php:685 #: ../../../../inc/config.php:743 ../../../../inc/config.php:749 #: ../../../../inc/config.php:746 ../../../../inc/config.php:752 +#: ../../../../inc/config.php:854 msgid "That post doesn't exist…" msgstr "Ten post nie istnieje..." #: /var/www/html/Tinyboard/inc/config.php:648 ../../../../inc/config.php:686 #: ../../../../inc/config.php:744 ../../../../inc/config.php:750 #: ../../../../inc/config.php:747 ../../../../inc/config.php:753 +#: ../../../../inc/config.php:855 msgid "Page not found." msgstr "Strona nie znaleziona." #: /var/www/html/Tinyboard/inc/config.php:649 ../../../../inc/config.php:687 #: ../../../../inc/config.php:745 ../../../../inc/config.php:751 #: ../../../../inc/config.php:748 ../../../../inc/config.php:754 +#: ../../../../inc/config.php:856 #, php-format msgid "That mod <a href=\"?/users/%d\">already exists</a>!" msgstr "Ten moderator <a href=\"?/users/%d\">już istnieje</a>!" @@ -396,6 +457,7 @@ msgstr "Ten moderator <a href=\"?/users/%d\">już istnieje</a>!" #: /var/www/html/Tinyboard/inc/config.php:650 ../../../../inc/config.php:688 #: ../../../../inc/config.php:746 ../../../../inc/config.php:752 #: ../../../../inc/config.php:749 ../../../../inc/config.php:755 +#: ../../../../inc/config.php:857 msgid "That theme doesn't exist!" msgstr "Ten dodatek nie istnieje!" @@ -433,8 +495,10 @@ msgstr "[Przenieś]" #. Default public ban message. #. In public ban messages, %length% is replaced with "for x days" or "permanently" (with %LENGTH% being the uppercase equivalent). +#. Default public ban message. In public ban messages, %length% is replaced with "for x days" or +#. "permanently" (with %LENGTH% being the uppercase equivalent). #: /var/www/html/Tinyboard/inc/config.php:801 ../../../../inc/config.php:911 -#: ../../../../inc/config.php:917 +#: ../../../../inc/config.php:917 ../../../../inc/config.php:1019 msgid "USER WAS BANNED FOR THIS POST" msgstr "UŻYTKOWNIK ZOSTAŁ ZBANOWANY ZA TEGO POSTA" @@ -444,20 +508,24 @@ msgid "Moved to %s." msgstr "Przeniesiono do %s." #: /var/www/html/Tinyboard/inc/display.php:80 ../../../../inc/display.php:75 +#: ../../../../inc/display.php:79 msgid "Error" msgstr "Błąd" #: /var/www/html/Tinyboard/inc/display.php:81 ../../../../inc/display.php:76 +#: ../../../../inc/display.php:80 msgid "An error has occured." msgstr "Wystąpił błąd." +#. line 6 #: /var/www/html/Tinyboard/inc/display.php:87 ../../../../inc/display.php:82 +#: ../../../../templates/cache/3c/80/0ebbee302f4fad8d0d7f13e62db5.php:41 msgid "Go back" msgstr "Wróć" #: /var/www/html/Tinyboard/inc/display.php:97 ../../../../inc/display.php:91 #: ../../../../inc/mod/pages.php:59 ../../../../inc/mod/pages.php:62 -#: ../../../../inc/display.php:92 +#: ../../../../inc/display.php:92 ../../../../inc/display.php:96 msgid "Login" msgstr "Logowanie" @@ -475,34 +543,40 @@ msgstr "" #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:27 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:27 #: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:27 -#: ../../../../inc/display.php:423 +#: ../../../../inc/display.php:423 ../../../../inc/display.php:429 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:33 msgid "Delete" msgstr "Usuń" #: /var/www/html/Tinyboard/inc/display.php:272 #: /var/www/html/Tinyboard/inc/display.php:365 ../../../../inc/display.php:423 +#: ../../../../inc/display.php:429 msgid "Are you sure you want to delete this?" msgstr "Czy jesteś pewien, że chcesz to usunąć?" #: /var/www/html/Tinyboard/inc/display.php:276 #: /var/www/html/Tinyboard/inc/display.php:369 ../../../../inc/display.php:427 +#: ../../../../inc/display.php:433 msgid "Delete all posts by IP" msgstr "Usuń wszystkie posty z tego adresu IP" #: /var/www/html/Tinyboard/inc/display.php:276 #: /var/www/html/Tinyboard/inc/display.php:369 ../../../../inc/display.php:427 +#: ../../../../inc/display.php:433 msgid "Are you sure you want to delete all posts by this IP address?" msgstr "Czy na pewno chcesz usunąć wszystkie posty z tego adresu IP?" #: /var/www/html/Tinyboard/inc/display.php:280 #: /var/www/html/Tinyboard/inc/display.php:373 ../../../../inc/display.php:334 -#: ../../../../inc/display.php:435 +#: ../../../../inc/display.php:435 ../../../../inc/display.php:339 +#: ../../../../inc/display.php:441 msgid "Ban" msgstr "Ban" #: /var/www/html/Tinyboard/inc/display.php:284 #: /var/www/html/Tinyboard/inc/display.php:377 ../../../../inc/display.php:338 -#: ../../../../inc/display.php:439 +#: ../../../../inc/display.php:439 ../../../../inc/display.php:343 +#: ../../../../inc/display.php:445 msgid "Ban & Delete" msgstr "Usuń i zbanuj" @@ -516,41 +590,51 @@ msgstr "Usuń plik" #: ../../../../inc/mod/pages.php:1080 ../../../../inc/mod/pages.php:1105 #: ../../../../inc/mod/pages.php:1239 ../../../../inc/mod/pages.php:1242 #: ../../../../inc/display.php:346 ../../../../inc/display.php:470 -#: ../../../../inc/mod/pages.php:1314 +#: ../../../../inc/mod/pages.php:1314 ../../../../inc/display.php:351 +#: ../../../../inc/display.php:476 ../../../../inc/mod/pages.php:1320 msgid "Edit post" msgstr "Edytuj post" #: /var/www/html/Tinyboard/inc/display.php:386 ../../../../inc/display.php:448 +#: ../../../../inc/display.php:454 msgid "Make thread not sticky" msgstr "Odklej wątek" #: /var/www/html/Tinyboard/inc/display.php:388 ../../../../inc/display.php:450 +#: ../../../../inc/display.php:456 msgid "Make thread sticky" msgstr "Przyklej wątek" #: /var/www/html/Tinyboard/inc/display.php:392 ../../../../inc/display.php:454 +#: ../../../../inc/display.php:460 msgid "Allow thread to be bumped" msgstr "Zezwól wątkowi na bumpowanie" #: /var/www/html/Tinyboard/inc/display.php:394 ../../../../inc/display.php:456 +#: ../../../../inc/display.php:462 msgid "Prevent thread from being bumped" msgstr "Zabroń wątkowi na bumpowanie" #: /var/www/html/Tinyboard/inc/display.php:399 ../../../../inc/display.php:461 +#: ../../../../inc/display.php:467 msgid "Unlock thread" msgstr "Odblokuj wątek" #: /var/www/html/Tinyboard/inc/display.php:401 ../../../../inc/display.php:463 +#: ../../../../inc/display.php:469 msgid "Lock thread" msgstr "Zablokuj wątek" #: /var/www/html/Tinyboard/inc/display.php:404 ../../../../inc/display.php:466 +#: ../../../../inc/display.php:472 msgid "Move thread to another board" msgstr "Przenieś wątek na inny board" #. line 11 #. line 7 #. line 11 +#. line 7 +#. line 14 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:48 #: /var/www/html/Tinyboard/mod.php:667 /var/www/html/Tinyboard/mod.php:750 #: /var/www/html/Tinyboard/mod.php:833 @@ -559,24 +643,34 @@ msgstr "Przenieś wątek na inny board" #: ../../../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:31 #: ../../../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:36 #: ../../../../templates/cache/86/31/3f70fa8521e56d617b21133af4d8.php:33 +#: ../../../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:30 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:66 msgid "Name" msgstr "Nazwa" #. line 21 +#. line 15 +#. line 24 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:62 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:76 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:76 +#: ../../../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:44 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:88 msgid "Email" msgstr "E-mail" #. line 34 #. line 23 #. line 34 +#. line 23 +#. line 37 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:96 #: /var/www/html/Tinyboard/mod.php:753 /var/www/html/Tinyboard/mod.php:839 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:95 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:116 #: ../../../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:63 +#: ../../../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:58 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:130 msgid "Subject" msgstr "Temat" @@ -588,13 +682,21 @@ msgstr "Temat" #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:100 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:133 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:172 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:115 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:113 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:148 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:189 msgid "Spoiler Image" msgstr "Schowaj obrazek" #. line 45 +#. line 32 +#. line 48 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:119 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:121 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:145 +#: ../../../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:76 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:161 msgid "Comment" msgstr "Komentarz" @@ -651,10 +753,12 @@ msgstr "Komentarz" #. line 61 #. line 73 #. line 61 +#. line 64 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:133 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:142 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:191 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:217 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:209 msgid "Verification" msgstr "Weryfikacja" @@ -716,6 +820,8 @@ msgstr "Weryfikacja" #. line 72 #. line 3 #. line 72 +#. line 3 +#. line 75 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:149 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:22 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:165 @@ -723,24 +829,30 @@ msgstr "Weryfikacja" #: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:22 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:250 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:214 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:26 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:233 msgid "File" msgstr "Plik" #. line 97 #. line 82 +#. line 85 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:163 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:183 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:268 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:232 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:252 msgid "Embed" msgstr "Osadź" #. line 109 #. line 94 +#. line 97 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:179 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:206 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:291 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:255 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:276 msgid "Flags" msgstr "Flagi" @@ -802,6 +914,8 @@ msgstr "Flagi" #. line 99 #. line 98 #. line 99 +#. line 101 +#. line 102 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:188 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:191 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:215 @@ -810,6 +924,8 @@ msgstr "Flagi" #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:303 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:264 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:267 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:286 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:290 msgid "Sticky" msgstr "Przyklejony" @@ -871,6 +987,8 @@ msgstr "Przyklejony" #. line 103 #. line 102 #. line 103 +#. line 105 +#. line 106 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:200 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:203 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:227 @@ -879,6 +997,8 @@ msgstr "Przyklejony" #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:315 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:276 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:279 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:300 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:304 msgid "Lock" msgstr "Zablokowany" @@ -940,6 +1060,8 @@ msgstr "Zablokowany" #. line 107 #. line 106 #. line 107 +#. line 109 +#. line 110 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:212 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:215 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:239 @@ -948,6 +1070,8 @@ msgstr "Zablokowany" #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:327 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:288 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:291 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:314 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:318 msgid "Raw HTML" msgstr "Czysty HTML" @@ -955,6 +1079,7 @@ msgstr "Czysty HTML" #. line 14 #. line 129 #. line 114 +#. line 117 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:230 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:23 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:257 @@ -963,21 +1088,26 @@ msgstr "Czysty HTML" #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:342 #: ../../../../templates/cache/04/54/656aa217f895c90eae78024fa060.php:41 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:306 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:28 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:334 msgid "Password" msgstr "Hasło" #. line 134 #. line 119 +#. line 122 #: /var/www/html/Tinyboard/templates/cache/1d/5e/91ec2bc929b77377b8b877d82db4.php:236 #: ../../../../templates/cache/d1/2d/eda9403e966240c642b13ca43eb6.php:266 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:351 #: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:315 +#: ../../../../templates/cache/0c/37/9331df01df7c2986d77a02d3beb0.php:344 msgid "(For file deletion.)" msgstr "(do usuwania postów)" #: /var/www/html/Tinyboard/templates/cache/96/13/d13c7abb8d82989e547dc9be1787.php:107 #: ../../../../templates/cache/cf/0c/61af144f478f5c035cb3a2799e48.php:105 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:107 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:102 msgid "File:" msgstr "Plik:" @@ -999,6 +1129,7 @@ msgstr "Odśwież" #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:461 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:472 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:506 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:503 msgid "Reply" msgstr "Odpowiedź" @@ -1007,6 +1138,7 @@ msgstr "Odpowiedź" #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:488 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:499 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:533 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:531 msgid "1 post" msgid_plural "%count% posts" msgstr[0] "1 post" @@ -1019,6 +1151,8 @@ msgstr[2] "%count% postów" #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:505 #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:114 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:539 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:117 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:537 msgid "and" msgstr "oraz" @@ -1027,6 +1161,7 @@ msgstr "oraz" #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:505 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:516 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:550 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:549 msgid "1 image reply" msgid_plural "%count% image replies" msgstr[0] "1 obrazek" @@ -1038,6 +1173,7 @@ msgstr[2] "%count% obrazków" #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:510 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:521 #: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:555 +#: ../../../../templates/cache/d8/f2/7780eb1adcdbda7e332659e3fb4f.php:554 msgid "omitted. Click reply to view." msgstr "pominięte. Kliknij Odpowiedź aby zobaczyć." @@ -1053,6 +1189,9 @@ msgstr "pominięte. Kliknij Odpowiedź aby zobaczyć." #: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:115 #: ../../../../templates/cache/f5/e3/343716327c6183713f70a3fb57f1.php:132 #: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:116 +#: ../../../../templates/cache/f5/e3/343716327c6183713f70a3fb57f1.php:135 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:119 +#: ../../../../templates/cache/62/8c/21348d46377c3e1b3f8c476ba376.php:65 msgid "Return to dashboard" msgstr "Powróć na tablicę" @@ -1064,6 +1203,7 @@ msgstr "Powróć na tablicę" #: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:106 #: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:123 #: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:124 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:128 msgid "Posting mode: Reply" msgstr "Tryb postowania: Odpowiedź" @@ -1078,6 +1218,8 @@ msgstr "Tryb postowania: Odpowiedź" #: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:127 #: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:173 #: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:174 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:132 +#: ../../../../templates/cache/aa/f6/f10fd83961bcd8c947af6ddf919d.php:180 msgid "Return" msgstr "Powrót" @@ -1085,6 +1227,7 @@ msgstr "Powrót" #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:19 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:19 #: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:19 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:22 msgid "Delete Post" msgstr "Usuń post" @@ -1100,6 +1243,9 @@ msgstr "Usuń post" #. line 8 #. line 32 #. line 8 +#. line 106 +#. line 8 +#. line 32 #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:32 #: /var/www/html/Tinyboard/mod.php:1801 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:32 @@ -1107,6 +1253,9 @@ msgstr "Usuń post" #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:256 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:90 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:128 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:274 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:39 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:96 msgid "Reason" msgstr "Powód" @@ -1114,6 +1263,7 @@ msgstr "Powód" #: /var/www/html/Tinyboard/templates/cache/dd/1a/77e08f0c1b4ecf707c5a3e5a70be.php:36 #: ../../../../templates/cache/a8/a6/1022091d3402e085395b12e6279a.php:36 #: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:36 +#: ../../../../templates/cache/82/40/4c4a4b82f787181e6500ce83494d.php:44 msgid "Report" msgstr "Zgłoszenie" @@ -1122,6 +1272,8 @@ msgstr "Zgłoszenie" #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:120 #: ../../../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:125 #: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:89 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:128 +#: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:85 msgid "no subject" msgstr "brak tematu" @@ -1137,7 +1289,8 @@ msgstr "Wiadomości prywatne" #: ../../../../inc/mod/pages.php:376 ../../../../inc/mod/pages.php:393 #: ../../../../inc/mod/pages.php:406 ../../../../inc/mod/pages.php:540 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:166 -#: ../../../../inc/mod/pages.php:604 +#: ../../../../inc/mod/pages.php:604 ../../../../inc/mod/pages.php:609 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:176 msgid "News" msgstr "Aktualności" @@ -1146,6 +1299,8 @@ msgstr "Aktualności" #: ../../../../inc/mod/pages.php:1682 ../../../../inc/mod/pages.php:1816 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:207 #: ../../../../inc/mod/pages.php:1831 ../../../../inc/mod/pages.php:1904 +#: ../../../../inc/mod/pages.php:1910 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:220 msgid "Report queue" msgstr "Kolejka zgłoszeń" @@ -1153,7 +1308,8 @@ msgstr "Kolejka zgłoszeń" #: ../../../../inc/mod/pages.php:664 ../../../../inc/mod/pages.php:705 #: ../../../../inc/mod/pages.php:721 ../../../../inc/mod/pages.php:855 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:224 -#: ../../../../inc/mod/pages.php:918 +#: ../../../../inc/mod/pages.php:918 ../../../../inc/mod/pages.php:925 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:238 msgid "Ban list" msgstr "Lista banów" @@ -1162,6 +1318,8 @@ msgstr "Lista banów" #: ../../../../inc/mod/pages.php:1394 ../../../../inc/mod/pages.php:1528 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:232 #: ../../../../inc/mod/pages.php:1543 ../../../../inc/mod/pages.php:1615 +#: ../../../../inc/mod/pages.php:1621 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:247 msgid "Manage users" msgstr "Zarządzaj użytkownikami" @@ -1177,6 +1335,9 @@ msgstr "Zmień swoje hasło" #: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:65 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:255 #: ../../../../inc/mod/pages.php:644 ../../../../inc/mod/pages.php:671 +#: ../../../../inc/mod/pages.php:649 ../../../../inc/mod/pages.php:676 +#: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:72 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:273 msgid "Moderation log" msgstr "Log moderacji" @@ -1197,6 +1358,8 @@ msgstr "Pokaż konfigurację" #: ../../../../inc/mod/pages.php:1830 ../../../../inc/mod/pages.php:1964 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:247 #: ../../../../inc/mod/pages.php:1979 ../../../../inc/mod/pages.php:2052 +#: ../../../../inc/mod/pages.php:2109 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:264 msgid "Manage themes" msgstr "Zarządzaj dodatkami" @@ -1206,6 +1369,7 @@ msgstr "Zarządzaj dodatkami" #: /var/www/html/Tinyboard/mod.php:170 #: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:19 #: ../../../../templates/cache/c3/de/6ff26042c5b94cc80055e6f209d2.php:24 +#: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:22 msgid "Phrase:" msgstr "Wyrażenie:" @@ -1215,12 +1379,16 @@ msgstr "Wyrażenie:" #. line 2 #. line 16 #. line 106 +#. line 16 +#. line 106 #: /var/www/html/Tinyboard/mod.php:172 #: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:72 #: ../../../../templates/cache/c3/de/6ff26042c5b94cc80055e6f209d2.php:19 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:286 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:19 #: ../../../../search.php:165 ../../../../search.php:168 +#: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:80 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:307 msgid "Search" msgstr "Szukaj" @@ -1243,6 +1411,7 @@ msgstr "Nie można znaleźć obecnej wersji! (Sprawdź .installed)" #: /var/www/html/Tinyboard/mod.php:233 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:364 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:397 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:425 msgid "Logout" msgstr "Wyloguj" @@ -1278,6 +1447,9 @@ msgstr "temu" #. line 116 #. line 182 #. line 65 +#. line 116 +#. line 182 +#. line 65 #: /var/www/html/Tinyboard/mod.php:405 /var/www/html/Tinyboard/mod.php:1801 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:278 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:427 @@ -1285,6 +1457,9 @@ msgstr "temu" #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:131 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:355 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:147 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:298 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:461 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:157 msgid "Board" msgstr "Board" @@ -1294,20 +1469,21 @@ msgstr "Board" #: /var/www/html/Tinyboard/mod.php:406 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:430 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:358 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:465 msgid "Action" msgstr "Akcja" #: /var/www/html/Tinyboard/mod.php:528 ../../../../inc/mod/pages.php:1723 #: ../../../../inc/mod/pages.php:1789 ../../../../inc/mod/pages.php:1814 #: ../../../../inc/mod/pages.php:1948 ../../../../inc/mod/pages.php:1963 -#: ../../../../inc/mod/pages.php:2036 +#: ../../../../inc/mod/pages.php:2036 ../../../../inc/mod/pages.php:2093 msgid "Themes directory doesn't exist!" msgstr "Katalog dodatków (themes) nie istnieje!" #: /var/www/html/Tinyboard/mod.php:530 ../../../../inc/mod/pages.php:1725 #: ../../../../inc/mod/pages.php:1791 ../../../../inc/mod/pages.php:1816 #: ../../../../inc/mod/pages.php:1950 ../../../../inc/mod/pages.php:1965 -#: ../../../../inc/mod/pages.php:2038 +#: ../../../../inc/mod/pages.php:2038 ../../../../inc/mod/pages.php:2095 msgid "Cannot open themes directory; check permissions." msgstr "Nie można otworzyć katalogu dodatków (themes); sprawdź uprawnienia." @@ -1333,6 +1509,7 @@ msgstr "Miniatura" #: /var/www/html/Tinyboard/mod.php:687 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:86 #: ../../../../templates/cache/86/31/3f70fa8521e56d617b21133af4d8.php:77 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:93 msgid "Actions" msgstr "Akcje" @@ -1361,6 +1538,8 @@ msgstr "Instaluj" #: ../../../../inc/mod/pages.php:1741 ../../../../inc/mod/pages.php:1745 #: ../../../../templates/cache/86/31/3f70fa8521e56d617b21133af4d8.php:98 #: ../../../../inc/mod/pages.php:1814 ../../../../inc/mod/pages.php:1818 +#: ../../../../inc/mod/pages.php:1820 ../../../../inc/mod/pages.php:1824 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:282 msgid "Rebuild" msgstr "Przebuduj" @@ -1388,7 +1567,8 @@ msgstr "Postuj na tablicy ogłoszeń" #: ../../../../inc/mod/pages.php:333 ../../../../inc/mod/pages.php:346 #: ../../../../inc/mod/pages.php:480 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:96 -#: ../../../../inc/mod/pages.php:543 +#: ../../../../inc/mod/pages.php:543 ../../../../inc/mod/pages.php:548 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:103 msgid "Noticeboard" msgstr "Tablica ogłoszeń" @@ -1425,6 +1605,7 @@ msgstr "Typ" #. line 2 #: /var/www/html/Tinyboard/mod.php:1221 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:19 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:22 msgid "Boards" msgstr "Boardy" @@ -1446,6 +1627,7 @@ msgstr "Nie można się ponownie zalogować po zmianie hasła. (?)" #: /var/www/html/Tinyboard/mod.php:1801 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:300 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:134 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:322 msgid "Set" msgstr "Ustawione" @@ -1455,6 +1637,7 @@ msgstr "Ustawione" #: /var/www/html/Tinyboard/mod.php:1801 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:309 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:140 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:332 msgid "Expires" msgstr "Wygasa" @@ -1473,6 +1656,10 @@ msgstr "Wygasa" #. line 62 #. line 150 #. line 180 +#. line 24 +#. line 62 +#. line 150 +#. line 180 #: /var/www/html/Tinyboard/mod.php:1801 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:74 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:169 @@ -1481,6 +1668,10 @@ msgstr "Wygasa" #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:51 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:146 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:346 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:78 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:179 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:380 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:453 msgid "Staff" msgstr "Ekipa" @@ -1491,6 +1682,7 @@ msgstr "Cache jest wyłączone." #: /var/www/html/Tinyboard/mod.php:1966 /var/www/html/Tinyboard/mod.php:2057 #: /var/www/html/Tinyboard/mod.php:2106 /var/www/html/Tinyboard/mod.php:2110 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:271 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:291 msgid "Configuration" msgstr "Konfiguracja" @@ -1503,6 +1695,7 @@ msgstr "Nie można otworzyć boardu po utworzeniu." #: /var/www/html/Tinyboard/mod.php:2678 ../../../../inc/mod/pages.php:759 #: ../../../../inc/mod/pages.php:800 ../../../../inc/mod/pages.php:823 #: ../../../../inc/mod/pages.php:957 ../../../../inc/mod/pages.php:1020 +#: ../../../../inc/mod/pages.php:1027 msgid "Target and source board are the same." msgstr "Docelowy i źródłowy board są takie same." @@ -1512,7 +1705,7 @@ msgstr "Nie ma boardu na który można to przenieść; istnieje tylko jeden." #: ../../../../inc/config.php:689 ../../../../inc/config.php:747 #: ../../../../inc/config.php:753 ../../../../inc/config.php:750 -#: ../../../../inc/config.php:756 +#: ../../../../inc/config.php:756 ../../../../inc/config.php:858 msgid "Invalid security token! Please go back and try again." msgstr "Niepoprawny token bezpieczeństwa! Proszę cofnąć i spróbować ponownie." @@ -1528,7 +1721,7 @@ msgstr "Edytuj board" #: ../../../../inc/mod/pages.php:270 ../../../../inc/mod/pages.php:287 #: ../../../../inc/mod/pages.php:300 ../../../../inc/mod/pages.php:434 -#: ../../../../inc/mod/pages.php:496 +#: ../../../../inc/mod/pages.php:496 ../../../../inc/mod/pages.php:501 msgid "New board" msgstr "Nowy board" @@ -1538,11 +1731,15 @@ msgstr "Nowy board" #. line 20 #. line 102 #. line 20 +#. line 102 +#. line 20 #: ../../../../inc/mod/pages.php:586 ../../../../inc/mod/pages.php:612 #: ../../../../inc/mod/pages.php:628 ../../../../inc/mod/pages.php:762 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:247 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:65 -#: ../../../../inc/mod/pages.php:825 +#: ../../../../inc/mod/pages.php:825 ../../../../inc/mod/pages.php:832 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:264 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:68 msgid "IP" msgstr "adres IP" @@ -1553,13 +1750,15 @@ msgstr "adres IP" #: ../../../../inc/mod/pages.php:772 ../../../../inc/mod/pages.php:1187 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:398 #: ../../../../inc/mod/pages.php:1190 ../../../../inc/mod/pages.php:835 -#: ../../../../inc/mod/pages.php:1255 +#: ../../../../inc/mod/pages.php:1255 ../../../../inc/mod/pages.php:842 +#: ../../../../inc/mod/pages.php:1262 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:429 msgid "New ban" msgstr "Nowy ban" #: ../../../../inc/mod/pages.php:919 ../../../../inc/mod/pages.php:962 #: ../../../../inc/mod/pages.php:987 ../../../../inc/mod/pages.php:1121 -#: ../../../../inc/mod/pages.php:1184 +#: ../../../../inc/mod/pages.php:1184 ../../../../inc/mod/pages.php:1191 msgid "Impossible to move thread; there is only one board." msgstr "Nie można przenieść wątku; istnieje tylko jeden board." @@ -1567,7 +1766,7 @@ msgstr "Nie można przenieść wątku; istnieje tylko jeden board." #: ../../../../inc/mod/pages.php:923 ../../../../inc/mod/pages.php:966 #: ../../../../inc/mod/pages.php:991 ../../../../inc/mod/pages.php:1125 #: ../../../../templates/cache/dd/1a/7d548894242b9d7bff167de40716.php:106 -#: ../../../../inc/mod/pages.php:1188 +#: ../../../../inc/mod/pages.php:1188 ../../../../inc/mod/pages.php:1195 msgid "Move thread" msgstr "Przenieś wątek" @@ -1577,6 +1776,7 @@ msgstr "Przenieś wątek" #: ../../../../inc/mod/pages.php:1466 ../../../../inc/mod/pages.php:1515 #: ../../../../inc/mod/pages.php:1477 ../../../../inc/mod/pages.php:1530 #: ../../../../inc/mod/pages.php:1549 ../../../../inc/mod/pages.php:1602 +#: ../../../../inc/mod/pages.php:1555 ../../../../inc/mod/pages.php:1608 msgid "Edit user" msgstr "Edytuj użytkownika" @@ -1586,13 +1786,15 @@ msgstr "Edytuj użytkownika" #: ../../../../inc/mod/pages.php:1456 ../../../../inc/mod/pages.php:1528 #: ../../../../inc/mod/pages.php:1590 ../../../../inc/mod/pages.php:1662 #: ../../../../inc/mod/pages.php:1605 ../../../../inc/mod/pages.php:1677 -#: ../../../../inc/mod/pages.php:1750 +#: ../../../../inc/mod/pages.php:1750 ../../../../inc/mod/pages.php:1683 +#: ../../../../inc/mod/pages.php:1756 msgid "New PM for" msgstr "Nowe PW dla" #: ../../../../inc/mod/pages.php:1337 ../../../../inc/mod/pages.php:1435 #: ../../../../inc/mod/pages.php:1460 ../../../../inc/mod/pages.php:1594 #: ../../../../inc/mod/pages.php:1609 ../../../../inc/mod/pages.php:1681 +#: ../../../../inc/mod/pages.php:1687 msgid "Private message" msgstr "Prywatna wiadomość" @@ -1601,24 +1803,29 @@ msgstr "Prywatna wiadomość" #: ../../../../inc/mod/pages.php:1481 ../../../../inc/mod/pages.php:1615 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:171 #: ../../../../inc/mod/pages.php:1630 ../../../../inc/mod/pages.php:1702 +#: ../../../../inc/mod/pages.php:1708 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:182 msgid "PM inbox" msgstr "Odebrane PW" #: ../../../../inc/mod/pages.php:1679 ../../../../inc/mod/pages.php:1779 #: ../../../../inc/mod/pages.php:1804 ../../../../inc/mod/pages.php:1938 #: ../../../../inc/mod/pages.php:1953 ../../../../inc/mod/pages.php:2026 +#: ../../../../inc/mod/pages.php:1978 ../../../../inc/mod/pages.php:2077 msgid "Config editor" msgstr "Edytor konfiguracji" #: ../../../../inc/mod/pages.php:1713 ../../../../inc/mod/pages.php:1945 #: ../../../../inc/mod/pages.php:1970 ../../../../inc/mod/pages.php:2104 #: ../../../../inc/mod/pages.php:2119 ../../../../inc/mod/pages.php:2192 +#: ../../../../inc/mod/pages.php:2249 msgid "Debug: Anti-spam" msgstr "Debug: Antyspam" #: ../../../../inc/mod/pages.php:1801 ../../../../inc/mod/pages.php:1867 #: ../../../../inc/mod/pages.php:1892 ../../../../inc/mod/pages.php:2026 #: ../../../../inc/mod/pages.php:2041 ../../../../inc/mod/pages.php:2114 +#: ../../../../inc/mod/pages.php:2171 #, php-format msgid "Installed theme: %s" msgstr "Zainstalowano dodatek: %s" @@ -1626,6 +1833,7 @@ msgstr "Zainstalowano dodatek: %s" #: ../../../../inc/mod/pages.php:1811 ../../../../inc/mod/pages.php:1878 #: ../../../../inc/mod/pages.php:1903 ../../../../inc/mod/pages.php:2037 #: ../../../../inc/mod/pages.php:2052 ../../../../inc/mod/pages.php:2125 +#: ../../../../inc/mod/pages.php:2182 #, php-format msgid "Configuring theme: %s" msgstr "Konfigurowanie dodatku: %s" @@ -1633,6 +1841,7 @@ msgstr "Konfigurowanie dodatku: %s" #: ../../../../inc/mod/pages.php:1839 ../../../../inc/mod/pages.php:1906 #: ../../../../inc/mod/pages.php:1931 ../../../../inc/mod/pages.php:2065 #: ../../../../inc/mod/pages.php:2080 ../../../../inc/mod/pages.php:2153 +#: ../../../../inc/mod/pages.php:2210 #, php-format msgid "Rebuilt theme: %s" msgstr "Przebudowano dodatek: %s" @@ -1645,16 +1854,19 @@ msgstr "" #: ../../../../inc/config.php:704 ../../../../inc/config.php:710 #: ../../../../inc/config.php:707 ../../../../inc/config.php:713 +#: ../../../../inc/config.php:815 msgid "Thread has reached its maximum reply limit." msgstr "Ten temat osiągnął swój maksymalny limit odpowiedzi." #: ../../../../inc/config.php:705 ../../../../inc/config.php:711 #: ../../../../inc/config.php:708 ../../../../inc/config.php:714 +#: ../../../../inc/config.php:816 msgid "Thread has reached its maximum image limit." msgstr "Ten temat osiągnął swój maksymalny limit obrazków." #: ../../../../inc/config.php:726 ../../../../inc/config.php:732 #: ../../../../inc/config.php:729 ../../../../inc/config.php:735 +#: ../../../../inc/config.php:837 #, php-format msgid "That file <a href=\"%s\">already exists</a> in this thread!" msgstr "Ten plik <a href=\"%s\">już istnieje</a> w tym temacie!" @@ -1662,6 +1874,7 @@ msgstr "Ten plik <a href=\"%s\">już istnieje</a> w tym temacie!" #. Moderator errors #: ../../../../inc/config.php:733 ../../../../inc/config.php:739 #: ../../../../inc/config.php:736 ../../../../inc/config.php:742 +#: ../../../../inc/config.php:844 #, php-format msgid "" "You are only allowed to unban %s users at a time. You tried to unban %u " @@ -1671,18 +1884,19 @@ msgstr "" #: ../../../../inc/mod/pages.php:1969 ../../../../inc/mod/pages.php:1994 #: ../../../../inc/mod/pages.php:2128 ../../../../inc/mod/pages.php:2143 -#: ../../../../inc/mod/pages.php:2216 +#: ../../../../inc/mod/pages.php:2216 ../../../../inc/mod/pages.php:2273 msgid "Debug: Recent posts" msgstr "Debug: Ostatnie posty" #: ../../../../inc/mod/pages.php:1993 ../../../../inc/mod/pages.php:2018 #: ../../../../inc/mod/pages.php:2152 ../../../../inc/mod/pages.php:2167 -#: ../../../../inc/mod/pages.php:2240 +#: ../../../../inc/mod/pages.php:2240 ../../../../inc/mod/pages.php:2297 msgid "Debug: SQL" msgstr "Debug: SQL" #. line 28 #: ../../../../templates/cache/4b/3e/915cc5ac5fe144c331207c656528.php:104 +#: ../../../../templates/cache/4b/3e/915cc5ac5fe144c331207c656528.php:99 msgid "1 reply" msgid_plural "%count% replies" msgstr[0] "1 odpowiedź" @@ -1695,19 +1909,23 @@ msgid "Search results" msgstr "Wyniki wyszukiwania" #: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:31 +#: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:35 msgid "Posts" msgstr "Posty" #: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:41 +#: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:46 msgid "IP address notes" msgstr "Notatki adresu IP" #: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:53 +#: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:59 msgid "Bans" msgstr "Bany" #. line 18 #: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:76 +#: ../../../../templates/cache/55/dd/8ffe738533bd12359200e5745905.php:85 msgid "" "(Search is case-insensitive and based on keywords. To match exact phrases, " "use \"quotes\". Use an asterisk (*) for wildcard.)" @@ -1742,24 +1960,29 @@ msgstr "" "Symbole wieloznaczne nie mogą być wykorzystane w filtrach." #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:57 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:61 msgid "edit" msgstr "edytuj" #. line 26 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:84 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:90 msgid "Messages" msgstr "Wiadomości" #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:161 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:170 msgid "View all noticeboard entries" msgstr "Pokaż wszystkie wpisy na tablicy ogłoszeń" #. line 70 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:192 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:204 msgid "Administration" msgstr "Administracja" #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:239 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:255 msgid "Change password" msgstr "Zmień hasło" @@ -1767,6 +1990,7 @@ msgstr "Zmień hasło" #. line 130 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:308 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:341 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:364 msgid "Debug" msgstr "Debug" @@ -1774,6 +1998,7 @@ msgstr "Debug" #. line 132 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:312 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:345 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:369 msgid "Anti-spam" msgstr "Antyspam" @@ -1781,11 +2006,13 @@ msgstr "Antyspam" #. line 133 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:315 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:348 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:373 msgid "Recent posts" msgstr "Ostatnie posty" #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:321 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:354 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:380 msgid "SQL" msgstr "SQL" @@ -1793,6 +2020,7 @@ msgstr "SQL" #. line 155 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:359 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:392 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:419 msgid "User account" msgstr "Konto użytkownika" @@ -1803,9 +2031,13 @@ msgstr "Konto użytkownika" #. line 67 #. line 25 #. line 67 +#. line 25 +#. line 67 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:77 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:179 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:54 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:82 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:190 msgid "Note" msgstr "Notka" @@ -1814,6 +2046,7 @@ msgstr "Notka" #. line 26 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:80 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:57 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:86 msgid "Date" msgstr "Data" @@ -1823,38 +2056,48 @@ msgstr "Data" #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:88 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:321 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:385 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:120 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:394 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:493 msgid "deleted?" msgstr "usunięty?" #. line 49 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:142 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:151 msgid "remove" msgstr "usuń" #. line 75 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:189 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:201 msgid "New note" msgstr "Nowa notka" #. line 92 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:226 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:240 msgid "Status" msgstr "Status" #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:233 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:248 msgid "Expired" msgstr "Wygasły" #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:238 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:254 msgid "Active" msgstr "Aktywny" #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:269 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:288 msgid "no reason" msgstr "brak powodu" #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:322 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:246 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:346 msgid "never" msgstr "nigdy" @@ -1863,21 +2106,25 @@ msgstr "nigdy" #. line 140 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:331 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:143 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:356 msgid "Seen" msgstr "Widziano" #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:338 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:273 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:364 msgid "Yes" msgstr "Tak" #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:343 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:278 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:370 msgid "No" msgstr "Nie" #. line 161 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:378 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:408 msgid "Remove ban" msgstr "Usuń ban" @@ -1886,22 +2133,27 @@ msgstr "Usuń ban" #. line 181 #: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:424 #: ../../../../templates/cache/4c/fb/a3bf13b0badfc09442bd42da1cce.php:352 +#: ../../../../templates/cache/24/a0/f1ddafed7a8f9625e747a5ca33f5.php:457 msgid "Time" msgstr "Czas" #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:41 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:36 msgid "You were banned! ;_;" msgstr "Byłeś zbanowany! ;_;" #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:46 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:42 msgid "You are banned! ;_;" msgstr "Jesteś zbanowany! ;_;" #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:56 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:53 msgid "You were banned from" msgstr "Byłeś zbanowany na" #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:61 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:59 msgid "You have been banned from" msgstr "Zostałeś zbanowany na" @@ -1910,34 +2162,42 @@ msgid "for the following reason:" msgstr "z następującego powodu:" #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:88 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:89 msgid "for an unspecified reason." msgstr "z nieokreślonego powodu." #. line 32 #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:109 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:111 msgid "Your ban was filed on" msgstr "Twój ban został nałożony" #. line 51 #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:120 #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:150 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:124 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:157 msgid "has since expired. Refresh the page to continue." msgstr "już wygasł. Odśwież stronę, aby kontynuować." #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:125 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:130 msgid "expires" msgstr "wygasa" #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:128 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:134 msgid "from now, which is on" msgstr "od teraz, czyli" #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:176 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:184 msgid "will not expire" msgstr "nie wygaśnie" #. line 78 #: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:184 +#: ../../../../templates/cache/e5/22/4711dd22e4c786b4de405db7a449.php:193 msgid "Your IP address is" msgstr "Twój adres IP to" @@ -1967,33 +2227,39 @@ msgid "Target board" msgstr "Board docelowy" #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:66 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:70 msgid "(or subnet)" msgstr "(lub podsieć)" #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:80 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:85 msgid "hidden" msgstr "ukryty" #. line 41 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:107 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:114 msgid "Message" msgstr "Wiadomość" #. line 46 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:117 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:122 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:130 msgid "public; attached to post" msgstr "publiczny; dołączony do posta" #. line 58 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:133 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:138 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:147 msgid "Length" msgstr "Długość" #. line 88 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:192 #: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:197 +#: ../../../../templates/cache/18/9c/c365d711719f494c684aab98a4ae.php:209 msgid "New Ban" msgstr "Nowy ban" @@ -2032,6 +2298,7 @@ msgid "No results." msgstr "Brak wyników." #: ../../../../inc/functions.php:594 ../../../../inc/functions.php:603 +#: ../../../../inc/functions.php:623 msgid "Banned!" msgstr "Zbanowany!" @@ -2045,6 +2312,7 @@ msgstr "Nie jesteś zbanowany." #: ../../../../inc/functions.php:549 ../../../../inc/functions.php:566 #: ../../../../inc/functions.php:558 ../../../../inc/functions.php:575 +#: ../../../../inc/functions.php:578 ../../../../inc/functions.php:595 msgid "second" msgid_plural "seconds" msgstr[0] "sekunda" @@ -2053,6 +2321,7 @@ msgstr[2] "sekund" #: ../../../../inc/functions.php:551 ../../../../inc/functions.php:568 #: ../../../../inc/functions.php:560 ../../../../inc/functions.php:577 +#: ../../../../inc/functions.php:580 ../../../../inc/functions.php:597 msgid "minute" msgid_plural "minutes" msgstr[0] "minuta" @@ -2061,6 +2330,7 @@ msgstr[2] "minut" #: ../../../../inc/functions.php:553 ../../../../inc/functions.php:570 #: ../../../../inc/functions.php:562 ../../../../inc/functions.php:579 +#: ../../../../inc/functions.php:582 ../../../../inc/functions.php:599 msgid "hour" msgid_plural "hours" msgstr[0] "godzina" @@ -2069,6 +2339,7 @@ msgstr[2] "godzin" #: ../../../../inc/functions.php:555 ../../../../inc/functions.php:572 #: ../../../../inc/functions.php:564 ../../../../inc/functions.php:581 +#: ../../../../inc/functions.php:584 ../../../../inc/functions.php:601 msgid "day" msgid_plural "days" msgstr[0] "dzień" @@ -2077,6 +2348,7 @@ msgstr[2] "dni" #: ../../../../inc/functions.php:557 ../../../../inc/functions.php:574 #: ../../../../inc/functions.php:566 ../../../../inc/functions.php:583 +#: ../../../../inc/functions.php:586 ../../../../inc/functions.php:603 msgid "week" msgid_plural "weeks" msgstr[0] "tydzień" @@ -2085,6 +2357,7 @@ msgstr[2] "tygodni" #: ../../../../inc/functions.php:560 ../../../../inc/functions.php:577 #: ../../../../inc/functions.php:569 ../../../../inc/functions.php:586 +#: ../../../../inc/functions.php:589 ../../../../inc/functions.php:606 msgid "year" msgid_plural "years" msgstr[0] "rok" @@ -2093,6 +2366,7 @@ msgstr[2] "lat" #. line 118 #: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:308 +#: ../../../../templates/cache/3a/df/ab38a77244cb9c729b4c6f99759a.php:330 msgid "Other" msgstr "Inne" @@ -2122,15 +2396,18 @@ msgstr "usuń" #. line 55 #: ../../../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:133 #: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:94 +#: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:91 msgid "by" msgstr "przez" #: ../../../../templates/cache/c8/8b/242bf87b3b6a29a67cdd09a3afeb.php:136 #: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:97 +#: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:95 msgid "at" msgstr "dnia" #: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:66 +#: ../../../../templates/cache/f3/ad/68dee281a64ebad9a5c774b53279.php:61 msgid "(No news to show.)" msgstr "(Nie ma newsów do wyświetlenia.)" @@ -2143,24 +2420,28 @@ msgstr "Nie ma dostępnych dodatków." msgid "Install theme" msgstr "Zainstaluj dodatek" -#: ../../../../inc/display.php:211 +#: ../../../../inc/display.php:211 ../../../../inc/display.php:215 #, php-format msgid "Post too long. Click <a href=\"%s\">here</a> to view the full text." -msgstr "Post za długi. Kliknij <a href=\"%s\">tutaj</a>, aby zobaczyć jego pełną treść." +msgstr "" +"Post za długi. Kliknij <a href=\"%s\">tutaj</a>, aby zobaczyć jego pełną " +"treść." #: ../../../../inc/display.php:342 ../../../../inc/display.php:443 +#: ../../../../inc/display.php:347 ../../../../inc/display.php:449 msgid "Delete file" msgstr "Usuń plik" #: ../../../../inc/display.php:342 ../../../../inc/display.php:443 +#: ../../../../inc/display.php:347 ../../../../inc/display.php:449 msgid "Are you sure you want to delete this file?" msgstr "Czy jesteś pewien, że chcesz usunąć ten plik?" -#: ../../../../inc/display.php:431 +#: ../../../../inc/display.php:431 ../../../../inc/display.php:437 msgid "Delete all posts by IP across all boards" msgstr "Usuń wszystkie posty z tego IP ze wszystkich boardów" -#: ../../../../inc/display.php:431 +#: ../../../../inc/display.php:431 ../../../../inc/display.php:437 msgid "" "Are you sure you want to delete all posts by this IP address, across all " "boards?" @@ -2169,7 +2450,8 @@ msgstr "" "wszystkich boardów?" #. Page footer -#: ../../../../inc/config.php:564 +#. Additional lines added to the footer of all pages. +#: ../../../../inc/config.php:564 ../../../../inc/config.php:653 msgid "" "All trademarks, copyrights, comments, and images on this page are owned by " "and are the responsibility of their respective parties." @@ -2186,3 +2468,25 @@ msgstr "Nie ma boardów do przeszukania!" #: ../../../../inc/database.php:72 msgid "Database error: " msgstr "Błąd bazy danych: " + +#. line 13 +#: ../../../../templates/cache/3c/80/0ebbee302f4fad8d0d7f13e62db5.php:56 +msgid "Error information" +msgstr "Informacje o błędzie" + +#. line 27 +#: ../../../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:68 +msgid "Update" +msgstr "Aktualizacja" + +#: ../../../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:97 +msgid "Currently editing raw HTML." +msgstr "Obecnie edytujesz czysty HTML" + +#: ../../../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:105 +msgid "Edit markup instead?" +msgstr "Edytować zamiast tego znaczniki?" + +#: ../../../../templates/cache/39/42/cbc36382096edfa72a8bc26e4514.php:115 +msgid "Edit raw HTML instead?" +msgstr "Edytować zamiast tego czysty HTML?" diff --git a/install.php b/install.php index 6971437a..778654b7 100644 --- a/install.php +++ b/install.php @@ -1,7 +1,7 @@ <?php // Installation/upgrade file -define('VERSION', 'v0.9.6-dev-11'); +define('VERSION', 'v0.9.6-dev-11 + <a href="https://int.vichan.net/devel/">vichan-devel-4.0.8-gold</a>'); require 'inc/functions.php'; @@ -228,8 +228,12 @@ if (file_exists($config['has_installed'])) { query(sprintf("ALTER TABLE `posts_%s` DROP INDEX `thread`", $_board['uri'])) or error(db_error()); } case 'v0.9.6-dev-7': + case 'v0.9.6-dev-7 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0-gold</a>': query("ALTER TABLE `bans` ADD `seen` BOOLEAN NOT NULL") or error(db_error()); case 'v0.9.6-dev-8': + case 'v0.9.6-dev-8 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.1</a>': + query("CREATE TABLE IF NOT EXISTS `search_queries` ( `ip` varchar(39) NOT NULL, `time` int(11) NOT NULL, `query` text NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8;") or error(db_error()); + case 'v0.9.6-dev-8 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.2</a>': query("ALTER TABLE `mods` CHANGE `password` `password` CHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'SHA256'") or error(db_error()); query("ALTER TABLE `mods` ADD `salt` CHAR( 32 ) NOT NULL AFTER `password`") or error(db_error()); $query = query("SELECT `id`,`password` FROM `mods`") or error(db_error()); @@ -248,7 +252,10 @@ if (file_exists($config['has_installed'])) { $_query->execute() or error(db_error($_query)); } } - case 'v0.9.6-dev-9': + case 'v0.9.6-dev-9': + case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.3</a>': + case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.4-gold</a>': + case 'v0.9.6-dev-9 + <a href="https://github.com/vichan-devel/Tinyboard/">vichan-devel-4.0.5-gold</a>': sql_open(); function __query($sql) { if (mysql_version() >= 50503) @@ -356,6 +363,9 @@ if (file_exists($config['has_installed'])) { CHANGE `boards` `boards` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;") or error(db_error()); query("ALTER TABLE `reports` CHANGE `board` `board` VARCHAR( 58 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;") or error(db_error()); + case 'v0.9.6-dev-11': + case 'v0.9.6-dev-11 + <a href="https://int.vichan.net/devel/">vichan-devel-4.0.6</a>': + case 'v0.9.6-dev-11 + <a href="https://int.vichan.net/devel/">vichan-devel-4.0.7-gold</a>': case false: // Update version number file_write($config['has_installed'], VERSION); diff --git a/install.sql b/install.sql index db89452b..84090999 100644 --- a/install.sql +++ b/install.sql @@ -230,6 +230,18 @@ CREATE TABLE IF NOT EXISTS `robot` ( -- -------------------------------------------------------- -- +-- Table structure for table `search_queries` +-- + +CREATE TABLE IF NOT EXISTS `search_queries` ( + `ip` varchar(39) NOT NULL, + `time` int(11) NOT NULL, + `query` text NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- -- Table structure for table `theme_settings` -- diff --git a/js/attention-bar.js b/js/attention-bar.js new file mode 100644 index 00000000..a84cadff --- /dev/null +++ b/js/attention-bar.js @@ -0,0 +1,8 @@ +$(document).ready(function(){ + $("#attention_bar").click(function(eO){ $("#attention_bar").css("display","none"); + $("#attention_bar_form").css("display","block"); }); + $.get(configRoot + "attentionbar.txt", function(data) { + $("#attention_bar").text(data); + $("#attention_bar_input").val(data); + }); +}); diff --git a/js/chrome-board-expanding-fix.js b/js/chrome-board-expanding-fix.js new file mode 100644 index 00000000..f0a5930a --- /dev/null +++ b/js/chrome-board-expanding-fix.js @@ -0,0 +1,7 @@ +$(document).ready(function(){ + $(".desktop-style .sub .sub").on("mouseover", function() { + $(this).addClass("hover"); + }).on("mouseout", function() { + $(this).removeClass("hover"); + }); +}); diff --git a/js/expand.js b/js/expand.js index 07ce9e43..b13d0bcf 100644 --- a/js/expand.js +++ b/js/expand.js @@ -14,8 +14,7 @@ $(document).ready(function(){ if($('div.banner').length != 0) return; // not index - $('div.post.op span.omitted').each(function() { - + var do_expand = function() { $(this) .html($(this).text().replace(_("Click reply to view."), '<a href="javascript:void(0)">'+_("Click to expand")+'</a>.')) diff --git a/js/hide-threads.js b/js/hide-threads.js index 575804b6..44bd829b 100644 --- a/js/hide-threads.js +++ b/js/hide-threads.js @@ -12,11 +12,9 @@ */ $(document).ready(function(){ - if($('div.banner').length != 0) + if (active_page != "index" && active_page != "ukko") return; // not index - - var board = $('form input[name="board"]').val().toString(); - + if (!localStorage.hiddenthreads) localStorage.hiddenthreads = '{}'; @@ -37,13 +35,16 @@ $(document).ready(function(){ } } - if (!hidden_data[board]) { - hidden_data[board] = {}; // id : timestamp - } - var do_hide_threads = function() { var id = $(this).children('p.intro').children('a.post_no:eq(1)').text(); var thread_container = $(this).parent(); + + var board = thread_container.data("board"); + + if (!hidden_data[board]) { + hidden_data[board] = {}; // id : timestamp + } + $('<a class="hide-thread-link" style="float:left;margin-right:5px" href="javascript:void(0)">[–]</a><span> </span>') .insertBefore(thread_container.find(':not(h2,h2 *):first')) .click(function() { diff --git a/js/inline-expanding-filename.js b/js/inline-expanding-filename.js new file mode 100644 index 00000000..048a0e1a --- /dev/null +++ b/js/inline-expanding-filename.js @@ -0,0 +1,33 @@ +/* + * inline-expanding-filename.js + * Binds image filename link to expanding, to make kusaba x users somewhat more accustomed. + * https://github.com/vichan-devel/Tinyboard/blob/master/js/inline-expanding.js + * + * Released under the MIT license + * Copyright (c) 2012-2013 Marcin Łabanowski <marcin@6irc.net> + * + * Usage: + * $config['additional_javascript'][] = 'js/jquery.min.js'; + * $config['additional_javascript'][] = 'js/inline-expanding.js'; + * $config['additional_javascript'][] = 'js/inline-expanding-filename.js'; + * + */ + +onready(function(){ + var inline_expanding_filename = function() { + $(this).find(".fileinfo > a").click(function(){ + var imagelink = $(this).parent().parent().find('a[target="_blank"]:first'); + if(imagelink.length > 0) { + imagelink.click(); + return false; + } + }); + }; + + $('div[id^="thread_"]').each(inline_expanding_filename); + + // allow to work with auto-reload.js, etc. + $(document).bind('new_post', function(e, post) { + inline_expanding_filename.call(post); + }); +}); diff --git a/js/inline-expanding.js b/js/inline-expanding.js index 61085b0d..398db181 100644 --- a/js/inline-expanding.js +++ b/js/inline-expanding.js @@ -65,5 +65,4 @@ onready(function(){ } else { inline_expand_post.call(document); } - }); diff --git a/js/mobile-style.js b/js/mobile-style.js new file mode 100644 index 00000000..89e01b73 --- /dev/null +++ b/js/mobile-style.js @@ -0,0 +1,8 @@ +if(navigator.userAgent.match(/iPhone|iPod|iPad|Android|Opera Mini|Blackberry|PlayBook|Windows Phone|Tablet PC|Windows CE|IEMobile/i)) { + $('html').addClass("mobile-style"); + device_type = "mobile"; +} +else { + $('html').addClass("desktop-style"); + device_type = "desktop"; +} diff --git a/js/post-hider.js b/js/post-hider.js new file mode 120000 index 00000000..693c14d6 --- /dev/null +++ b/js/post-hider.js @@ -0,0 +1 @@ +hide-threads.js
\ No newline at end of file diff --git a/js/post-hover.js b/js/post-hover.js index 48f0ed96..040b6a73 100644 --- a/js/post-hover.js +++ b/js/post-hover.js @@ -17,13 +17,28 @@ onready(function(){ var $link = $(this); var id; - - if(id = $link.text().match(/^>>(\d+)$/)) { - id = id[1]; + var matches; + + if(matches = $link.text().match(/^>>(?:>\/([^\/]+)\/)?(\d+)$/)) { + id = matches[2]; } else { return; } + var board = $(this); + while (board.data('board') === undefined) { + board = board.parent(); + } + var threadid = board.attr('id').replace("thread_", ""); + board = board.data('board'); + + var parentboard = board; + + if (matches[1] !== undefined) { + board = matches[1]; + } + + var $post = false; var hovering = false; var hovered_at; @@ -32,28 +47,34 @@ onready(function(){ hovered_at = {'x': e.pageX, 'y': e.pageY}; var start_hover = function($link) { - if($post.is(':visible') && + if($.contains($post[0], $link[0])) { + // link links to itself or to op; ignore + } + else if($post.is(':visible') && $post.offset().top + $post.height() >= $(window).scrollTop() && - $post.offset().top <= $(window).scrollTop() + $(window).height() - ) { + $post.offset().top <= $(window).scrollTop() + $(window).height()) { // post is in view $post.attr('style', 'border-style: none dashed dashed none; background: ' + $post.css('border-right-color')); } else { var $newPost = $post.clone(); + $newPost.find('>.reply, >br').remove(); $newPost.find('span.mentioned').remove(); + $newPost .attr('id', 'post-hover-' + id) + .attr('data-board', board) .addClass('post-hover') .css('position', 'absolute') .css('border-style', 'solid') .css('box-shadow', '1px 1px 1px #999') .css('display', 'block') - .insertAfter($link.parent()); + .addClass('reply').addClass('post') + .insertAfter($link.parent()) $link.trigger('mousemove'); } }; - $post = $('div.post#reply_' + id); + $post = $('[data-board="' + board + '"] div.post#reply_' + id + ', [data-board="' + board + '"]div#thread_' + id); if($post.length > 0) { start_hover($(this)); } else { @@ -68,13 +89,27 @@ onready(function(){ url: url, context: document.body, success: function(data) { - $(data).find('div.post.reply').each(function() { - if($('#' + $(this).attr('id')).length == 0) - $('div.post:first').prepend($(this).css('display', 'none').addClass('hidden')); + var mythreadid = $(data).find('div[id^="thread_"]').attr('id').replace("thread_", ""); - }); + if (mythreadid == threadid && parentboard == board) { + $(data).find('div.post.reply').each(function() { + if($('[data-board="' + board + '"] #' + $(this).attr('id')).length == 0) { + $('[data-board="' + board + '"]#thread_' + threadid + " .post.reply:first").before($(this).hide().addClass('hidden')); + } + }); + } + else if ($('[data-board="' + board + '"]#thread_'+mythreadid).length > 0) { + $(data).find('div.post.reply').each(function() { + if($('[data-board="' + board + '"] #' + $(this).attr('id')).length == 0) { + $('[data-board="' + board + '"]#thread_' + mythreadid + " .post.reply:first").before($(this).hide().addClass('hidden')); + } + }); + } + else { + $(data).find('div[id^="thread_"]').hide().attr('data-cached', 'yes').prependTo('form[name="postcontrols"]'); + } - $post = $('div.post#reply_' + id); + $post = $('[data-board="' + board + '"] div.post#reply_' + id + ', [data-board="' + board + '"]div#thread_' + id); if(hovering && $post.length > 0) { start_hover($link); } @@ -87,14 +122,14 @@ onready(function(){ return; $post.attr('style', ''); - if($post.hasClass('hidden')) + if($post.hasClass('hidden') || $post.data('cached') == 'yes') $post.css('display', 'none'); $('.post-hover').remove(); }).mousemove(function(e) { if(!$post) return; - var $hover = $('#post-hover-' + id); + var $hover = $('#post-hover-' + id + '[data-board="' + board + '"]'); if($hover.length == 0) return; diff --git a/js/quick-reply.js b/js/quick-reply.js index ea504b48..bee204b7 100644 --- a/js/quick-reply.js +++ b/js/quick-reply.js @@ -12,6 +12,7 @@ * */ +if (active_page == 'index') { $(document).ready(function(){ if($('div.banner').length != 0) return; // not index @@ -43,4 +44,4 @@ $(document).ready(function(){ }); }); }); - +} diff --git a/js/smartphone-spoiler.js b/js/smartphone-spoiler.js index 54c7a9a1..ee904b54 100644 --- a/js/smartphone-spoiler.js +++ b/js/smartphone-spoiler.js @@ -6,18 +6,28 @@ * Copyright (c) 2012 Michael Save <savetheinternet@tinyboard.org> * * Usage: + * $config['additional_javascript'][] = 'js/mobile-style.js'; * $config['additional_javascript'][] = 'js/smartphone-spoiler.js'; * */ onready(function(){ - if(navigator.userAgent.match(/iPhone|iPod|iPad|Android|Opera Mini|Blackberry|PlayBook|Windows Phone|Tablet PC|Windows CE|IEMobile/i)) { - var spoilers = document.getElementsByClassName('spoiler'); - for(var i = 0; i < spoilers.length; i++) { - spoilers[i].onmousedown = function() { - this.style.color = 'white'; - }; - } + if(device_type == 'mobile') { + var fix_spoilers = function(where) { + var spoilers = where.getElementsByClassName('spoiler'); + for(var i = 0; i < spoilers.length; i++) { + spoilers[i].onmousedown = function() { + this.style.color = 'white'; + }; + } + }; + fix_spoilers(document); + + // allow to work with auto-reload.js, etc. + $(document).bind('new_post', function(e, post) { + fix_spoilers(post); + }); + } }); @@ -79,6 +79,7 @@ if (isset($_POST['delete'])) { $is_mod = isset($_POST['mod']) && $_POST['mod']; $root = $is_mod ? $config['root'] . $config['file_mod'] . '?/' : $config['root']; + if (!$is_mod) header('X-Associated-Content: "' . $root . $board['dir'] . $config['file_index'] . '"'); header('Location: ' . $root . $board['dir'] . $config['file_index'], true, $config['redirect_http']); } elseif (isset($_POST['report'])) { @@ -136,6 +137,7 @@ if (isset($_POST['delete'])) { $is_mod = isset($_POST['mod']) && $_POST['mod']; $root = $is_mod ? $config['root'] . $config['file_mod'] . '?/' : $config['root']; + if (!$is_mod) header('X-Associated-Content: "' . $root . $board['dir'] . $config['file_index'] . '"'); header('Location: ' . $root . $board['dir'] . $config['file_index'], true, $config['redirect_http']); } elseif (isset($_POST['post'])) { @@ -665,6 +667,8 @@ if (isset($_POST['delete'])) { _syslog(LOG_INFO, 'New post: /' . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], $post['op'] ? $id : $post['thread']) . (!$post['op'] ? '#' . $id : '')); + if (!$post['mod']) header('X-Associated-Content: "' . $redirect . '"'); + if ($post['op']) rebuildThemes('post-thread', $board['uri']); else diff --git a/search.php b/search.php new file mode 100644 index 00000000..a40c4701 --- /dev/null +++ b/search.php @@ -0,0 +1,170 @@ +<?php + require 'inc/functions.php'; + + if (!$config['search']['enable']) { + die(_("Post search is disabled")); + } + + $queries_per_minutes = $config['search']['queries_per_minutes']; + $queries_per_minutes_all = $config['search']['queries_per_minutes_all']; + $search_limit = $config['search']['search_limit']; + + $boards = $config['search']['boards']; + + $body = Element('search_form.html', Array('boards' => $boards, 'board' => isset($_GET['board']) ? $_GET['board'] : false, 'search' => isset($_GET['search']) ? str_replace('"', '"', utf8tohtml($_GET['search'])) : false)); + + if(isset($_GET['search']) && !empty($_GET['search']) && isset($_GET['board']) && in_array($_GET['board'], $boards)) { + $phrase = $_GET['search']; + $_body = ''; + + $query = prepare("SELECT COUNT(*) FROM ``search_queries`` WHERE `ip` = :ip AND `time` > :time"); + $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']); + $query->bindValue(':time', time() - ($queries_per_minutes[1] * 60)); + $query->execute() or error(db_error($query)); + if($query->fetchColumn() > $queries_per_minutes[0]) + error(_('Wait a while before searching again, please.')); + + $query = prepare("SELECT COUNT(*) FROM ``search_queries`` WHERE `time` > :time"); + $query->bindValue(':time', time() - ($queries_per_minutes_all[1] * 60)); + $query->execute() or error(db_error($query)); + if($query->fetchColumn() > $queries_per_minutes_all[0]) + error(_('Wait a while before searching again, please.')); + + + $query = prepare("INSERT INTO ``search_queries`` VALUES (:ip, :time, :query)"); + $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']); + $query->bindValue(':time', time()); + $query->bindValue(':query', $phrase); + $query->execute() or error(db_error($query)); + + _syslog(LOG_NOTICE, 'Searched /' . $_GET['board'] . '/ for "' . $phrase . '"'); + + // Cleanup search queries table + $query = prepare("DELETE FROM ``search_queries`` WHERE `time` <= :time"); + $query->bindValue(':time', time() - ($queries_per_minutes_all[1] * 60)); + $query->execute() or error(db_error($query)); + + openBoard($_GET['board']); + + $filters = Array(); + + function search_filters($m) { + global $filters; + $name = $m[2]; + $value = isset($m[4]) ? $m[4] : $m[3]; + + if(!in_array($name, array('id', 'thread', 'subject', 'name'))) { + // unknown filter + return $m[0]; + } + + $filters[$name] = $value; + + return $m[1]; + } + + $phrase = trim(preg_replace_callback('/(^|\s)(\w+):("(.*)?"|[^\s]*)/', 'search_filters', $phrase)); + + if(!preg_match('/[^*^\s]/', $phrase) && empty($filters)) { + _syslog(LOG_WARNING, 'Query too broad.'); + $body .= '<p class="unimportant" style="text-align:center">(Query too broad.)</p>'; + echo Element('page.html', Array( + 'config'=>$config, + 'title'=>'Search', + 'body'=>$body, + )); + exit; + } + + // Escape escape character + $phrase = str_replace('!', '!!', $phrase); + + // Remove SQL wildcard + $phrase = str_replace('%', '!%', $phrase); + + // Use asterisk as wildcard to suit convention + $phrase = str_replace('*', '%', $phrase); + + // Remove `, it's used by table prefix magic + $phrase = str_replace('`', '!`', $phrase); + + $like = ''; + $match = Array(); + + // Find exact phrases + if(preg_match_all('/"(.+?)"/', $phrase, $m)) { + foreach($m[1] as &$quote) { + $phrase = str_replace("\"{$quote}\"", '', $phrase); + $match[] = $pdo->quote($quote); + } + } + + $words = explode(' ', $phrase); + foreach($words as &$word) { + if(empty($word)) + continue; + $match[] = $pdo->quote($word); + } + + $like = ''; + foreach($match as &$phrase) { + if(!empty($like)) + $like .= ' AND '; + $phrase = preg_replace('/^\'(.+)\'$/', '\'%$1%\'', $phrase); + $like .= '`body` LIKE ' . $phrase . ' ESCAPE \'!\''; + } + + foreach($filters as $name => $value) { + if(!empty($like)) + $like .= ' AND '; + $like .= '`' . $name . '` = '. $pdo->quote($value); + } + + $like = str_replace('%', '%%', $like); + + $query = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE " . $like . " ORDER BY `time` DESC LIMIT :limit", $board['uri'])); + $query->bindValue(':limit', $search_limit, PDO::PARAM_INT); + $query->execute() or error(db_error($query)); + + if($query->rowCount() == $search_limit) { + _syslog(LOG_WARNING, 'Query too broad.'); + $body .= '<p class="unimportant" style="text-align:center">('._('Query too broad.').')</p>'; + echo Element('page.html', Array( + 'config'=>$config, + 'title'=>'Search', + 'body'=>$body, + )); + exit; + } + + $temp = ''; + while($post = $query->fetch()) { + if(!$post['thread']) { + $po = new Thread($post['id'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'], $post['body'], $post['time'], $post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'], $post['fileheight'], $post['filesize'], $post['filename'], $post['ip'], $post['sticky'], $post['locked'], $post['sage'], $post['embed']); + } else { + $po = new Post($post['id'], $post['thread'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'], $post['body'], $post['time'], $post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'], $post['fileheight'], $post['filesize'], $post['filename'], $post['ip'], $post['embed']); + } + $temp .= $po->build(true) . '<hr/>'; + } + + if(!empty($temp)) + $_body .= '<fieldset><legend>' . + sprintf(ngettext('%d result in', '%d results in', $query->rowCount()), + $query->rowCount()) . ' <a href="/' . + sprintf($config['board_path'], $board['uri']) . $config['file_index'] . + '">' . + sprintf($config['board_abbreviation'], $board['uri']) . ' - ' . $board['title'] . + '</a></legend>' . $temp . '</fieldset>'; + + $body .= '<hr/>'; + if(!empty($_body)) + $body .= $_body; + else + $body .= '<p style="text-align:center" class="unimportant">('._('No results.').')</p>'; + } + + echo Element('page.html', Array( + 'config'=>$config, + 'title'=>_('Search'), + 'body'=>'' . $body + )); diff --git a/stylesheets/dark.css b/stylesheets/dark.css index c4a6855c..0982c278 100644 --- a/stylesheets/dark.css +++ b/stylesheets/dark.css @@ -9,7 +9,7 @@ body { font-size: 12px; } span.quote { - color:#B8D962; + color:#B8D962; } h1 { font-size: 20pt; @@ -45,10 +45,10 @@ a.post_no:hover { div.post.reply { background: #333333; border: #555555 1px solid; - -webkit-border-radius: 10px; - -khtml-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; + -webkit-border-radius: 10px; + -khtml-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; } div.post.reply.highlighted { @@ -112,7 +112,7 @@ div.banner { font-size: 12px; } div.banner a { - color:#000; + color:#000; } input[type="submit"] { background: #333333; @@ -125,7 +125,7 @@ input[type="submit"]:hover { color: #32DD72; } input[type="text"]:focus { - border:#aaa 1px solid; + border:#aaa 1px solid; } p.fileinfo a:hover { text-decoration: underline; @@ -149,7 +149,7 @@ hr { } div.boardlist { color: #999999; - background-color: rgba(12%, 12%, 12%, 0.10); + background-color: rgba(12%, 12%, 12%, 0.10); } div.ban { @@ -173,4 +173,4 @@ table.modlog tr th { .desktop-style div.boardlist:nth-child(1):hover { background-color: rgba(30%, 30%, 30%, 0.65); -}
\ No newline at end of file +} diff --git a/stylesheets/ferus.css b/stylesheets/ferus.css index 6a1dfb59..5dbf11ed 100644 --- a/stylesheets/ferus.css +++ b/stylesheets/ferus.css @@ -1,13 +1,8 @@ -@font-face { - font-family: Matrix; - src: url(data:application/x-font-tff;base64,AAEAAAAOAIAAAwBgRkZUTTHZQ8IAALw8AAAAHE9TLzKQGR/2AAABaAAAAFZjbWFw5AjWjgAACJAAAAMaY3Z0IA0AJ3gAABNsAAABoGZwZ23UiPsUAAALrAAABRhnbHlm1ZlQ+QAAGJgAAJbMaGVhZOxJsogAAADsAAAANmhoZWEN1gd9AAABJAAAACRobXR4Go/MGQAAAcAAAAbQbG9jYflSH7IAABUMAAADjG1heHADwQX3AAABSAAAACBuYW1lMsi/8gAAr2QAAAKLcG9zdHFsGbAAALHwAAAKSXByZXA+daKoAAAQxAAAAqUAAQAAAAEAAIHcJmpfDzz1AB8IAAAAAADDEDQMAAAAAMMQNAz/9v6WBwAG3QAAAAgAAgAAAAAAAAABAAAG3f6WAAAIAP/2/0MHAAABAAAAAAAAAAAAAAAAAAABowABAAABxQBTAAQAWgAEAAIAEAAvADgAAAGoBRgAAwABAAEETAGQAAUACAWaBTMAAACyBZoFMwAAAeMAfQISCA8CAQUJAgECAQMDgAAArxAAIEgAAAAAAAAAAE1PTk8AQAAA8AMFMf6YAfYG3QFqoAAAk43UAAAAAAgAAQAAAAAABNUAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAfQETADLBEwAzwRMAM0ETADLBEwA0QRMAc8ETAHNBEwBgwRMAOcETADLBEwBdwRMAM8ETAHJBEwA4wRMAMsETADJBEwAxwRMAMkETAD6BEwA4QRMAM8ETADLBEwAyQRMANEETAHNBEwBcQRMAM8ETADLBEwA5QRMAOUETADPBEwAzwRMAMsETADTBEwAywRMAM8ETADPBEwAywRMAMsETADNBEwBIQRMAM0ETADPBEwAywRMAM8ETADNBEwAzwRMAM0ETADRBEwAzQRMAM0ETADNBEwA0QRMAM0ETADbBEwA0QRMAM0ETADPBEwA5QRMAM0ETADfBEz/9gRMAYcETADLBEwA0wRMANAETADJBEwAzQRMAPoETADNBEwAzQRMASEETAEfBEwAzwRMASMETAC6BEwAzwRMAM0ETADPBEwAzwRMAM8ETADNBEwAzQRMANIETADNBEwAuARMANsETADNBEwAzwRMANEETAIXBEwA0QRMAPYETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwB9ARMANAETADHBEwAyQRMAMsETAIXBEwAzQRMAMsETACqBEwAywRMAM8ETADBBEwAzwRMAKoETP/2BEwA9gRMAMEETAGLBEwB3wRMAYcETADRBEwAugRMAckETAF3BEwB3QRMAM0ETADZBEwAFARMABQETAAUBEwAuARMAM8ETADPBEwAzwRMAM8ETADLBEwAzwRMANUETADTBEwAzwRMAM8ETADPBEwAywRMAM0ETADNBEwAzQRMAMsETADLBEwAzwRMAM0ETADNBEwAzQRMAM0ETADLBEwBEARMAN8ETADNBEwAzQRMAM0ETADLBEwA0QRMAM8ETADNBEwAywRMAMsETADLBEwAywRMAMsETADLBEwATARMANAETADNBEwAzQRMAM0ETADLBEwBDARMASEETACRBEwAZARMAM0ETADPBEwAzQRMAM0ETADNBEwAzQRMAMsETADBBEwAzQRMANIETADSBEwA0gRMAMsETADNBEwAzwRMAMsETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwBIQRMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMABkETAEjBEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAzQRMAEwETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETADNBEwAzQRMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETADLBEwAAARMAAAETAAABEwAAARMAM0ETADPBEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMAAAETAAABEwAAARMATsETAAABEwAAATVAO4E1QDuBNUBHQTVAOUE1QIXBNUBrATVAWIE1QD2BNUBOwRMAEwE1QE1AAABYgF3AXcA5QCgAKAAwQDBARkAeQDLAc0B1wBcAM0AzQDRACMAzwDBABQBLwC0AM8A9gDLAM8AyQCwARkAIwAjAYsAAAADAAAAAwAAABwAAQAAAAABEAADAAEAAAAcAAQA9AAAADgAIAAEABgBlALHAskC3QPAIBQgGiAeICIgJiAwIDohIiEmIgIiBiIPIhIiFSIaIh4iKyJIImAiZSXK8AP//wAAAAACxgLJAtgDwCATIBggHCAgICYgMCA5ISIhJiICIgYiDyIRIhUiGSIeIisiSCJgImQlyvAA//8AA/7S/tH+w/3h4Y/hjOGL4Yrhh+F+4Xbgj+CM37Hfrt+m36XfowAA35zfkN90313fWtv2EcEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAALoBuQAGAgoAAAAAAQAAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBz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AT8BQAFBAUIBQwFEAUUAowCEAIUAvQCWAOgAhgCOAIsAnQCpAKQBRgCKAUcAgwCTAPIA8wCNAJcAiADDAN4A8QCeAKoA9QD0APYAogCtAMkAxwCuAGIAYwCQAGQAywBlAMgAygDPAMwAzQDOAOkAZgDTANAA0QCvAGcA8ACRANYA1ADVAGgA6wDtAIkAagBpAGsAbQBsAG4AoABvAHEAcAByAHMAdQB0AHYAdwDqAHgAegB5AHsAfQB8ALgAoQB/AH4AgACBAOwA7gC6AUgBSQFKAUsBTAFNAP0A/gFOAU8BUAFRAP8BAAFSAVMBVAEBAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAPgA+QFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAPoA1wFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwDiAOMBgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4AsACxAY8BkAGRAZIBkwGUAZUBlgGXAZgA+wD8AOQA5QGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuALsBrwGwAbEBsgDmAOcBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQCmAcYBxwDYAOEA2gDbANwA3QDgANkA3wCbALIAswC2ALcAxAC0ALUAxQCCAMIAhwCrAMYAvgC/AIwAnwCYAKgAmgCZAO8AvAClAJIAnACnAI8AlACVALkA0gDAAMEByAZnbHlwaDEGZ2x5cGgyB3VuaTAwMDAHdW5pMDAwMQd1bmkwMDAyB3VuaTAwMDMHdW5pMDAwNAd1bmkwMDA1B3VuaTAwMDYHdW5pMDAwNwd1bmkwMDA4B3VuaTAwMDkHdW5pMDAwQQd1bmkwMDBCB3VuaTAwMEMHdW5pMDAwRAd1bmkwMDBFB3VuaTAwMEYHdW5pMDAxMAd1bmkwMDExB3VuaTAwMTIHdW5pMDAxMwd1bmkwMDE0B3VuaTAwMTUHdW5pMDAxNgd1bmkwMDE3B3VuaTAwMTgHdW5pMDAxOQd1bmkwMDFBB3VuaTAwMUIHdW5pMDAxQwd1bmkwMDFEB3VuaTAwMUUHdW5pMDAxRgd1bmkwMDdGB3VuaTAwODAHdW5pMDA4MQd1bmkwMDgyB3VuaTAwODMHdW5pMDA4NAd1bmkwMDg1B3VuaTAwODYHdW5pMDA4Nwd1bmkwMDg4B3VuaTAwODkHdW5pMDA4QQd1bmkwMDhCB3VuaTAwOEMHdW5pMDA4RAd1bmkwMDhFB3VuaTAwOEYHdW5pMDA5MAd1bmkwMDkxB3VuaTAwOTIHdW5pMDA5Mwd1bmkwMDk0B3VuaTAwOTUHdW5pMDA5Ngd1bmkwMDk3B3VuaTAwOTgHdW5pMDA5OQd1bmkwMDlBB3VuaTAwOUIHdW5pMDA5Qwd1bmkwMDlEB3VuaTAwOUUHdW5pMDA5RgduYnNwYWNlCXNmdGh5cGhlbglvdmVyc2NvcmUHQW1hY3JvbgdhbWFjcm9uBkFicmV2ZQZhYnJldmUHQW9nb25lawdhb2dvbmVrC0NjaXJjdW1mbGV4C2NjaXJjdW1mbGV4CkNkb3RhY2NlbnQKY2RvdGFjY2VudAZEY2Fyb24GZGNhcm9uBkRjcm9hdAdFbWFjcm9uB2VtYWNyb24GRWJyZXZlBmVicmV2ZQpFZG90YWNjZW50CmVkb3RhY2NlbnQHRW9nb25lawdlb2dvbmVrBkVjYXJvbgZlY2Fyb24LR2NpcmN1bWZsZXgLZ2NpcmN1bWZsZXgKR2RvdGFjY2VudApnZG90YWNjZW50DEdjb21tYWFjY2VudAxnY29tbWFhY2NlbnQLSGNpcmN1bWZsZXgLaGNpcmN1bWZsZXgESGJhcgRoYmFyBkl0aWxkZQZpdGlsZGUHSW1hY3JvbgdpbWFjcm9uBklicmV2ZQZpYnJldmUHSW9nb25lawdpb2dvbmVrAklKAmlqC0pjaXJjdW1mbGV4C2pjaXJjdW1mbGV4DEtjb21tYWFjY2VudAxrY29tbWFhY2NlbnQMa2dyZWVubGFuZGljBkxhY3V0ZQZsYWN1dGUMTGNvbW1hYWNjZW50DGxjb21tYWFjY2VudAZMY2Fyb24GbGNhcm9uBExkb3QEbGRvdAZOYWN1dGUGbmFjdXRlDE5jb21tYWFjY2VudAxuY29tbWFhY2NlbnQGTmNhcm9uBm5jYXJvbgtuYXBvc3Ryb3BoZQNFbmcDZW5nB09tYWNyb24Hb21hY3JvbgZPYnJldmUGb2JyZXZlDU9odW5nYXJ1bWxhdXQNb2h1bmdhcnVtbGF1dAZSYWN1dGUGcmFjdXRlDFJjb21tYWFjY2VudAxyY29tbWFhY2NlbnQGUmNhcm9uBnJjYXJvbgZTYWN1dGUGc2FjdXRlC1NjaXJjdW1mbGV4C3NjaXJjdW1mbGV4DFRjb21tYWFjY2VudAx0Y29tbWFhY2NlbnQGVGNhcm9uBnRjYXJvbgRUYmFyBHRiYXIGVXRpbGRlBnV0aWxkZQdVbWFjcm9uB3VtYWNyb24GVWJyZXZlBnVicmV2ZQVVcmluZwV1cmluZw1VaHVuZ2FydW1sYXV0DXVodW5nYXJ1bWxhdXQHVW9nb25lawd1b2dvbmVrC1djaXJjdW1mbGV4C3djaXJjdW1mbGV4C1ljaXJjdW1mbGV4C3ljaXJjdW1mbGV4BlphY3V0ZQZ6YWN1dGUKWmRvdGFjY2VudAp6ZG90YWNjZW50BWxvbmdzB3VuaTAxODAHdW5pMDE4MQd1bmkwMTgyB3VuaTAxODMHdW5pMDE4NAd1bmkwMTg1B3VuaTAxODYHdW5pMDE4Nwd1bmkwMTg4B3VuaTAxODkHdW5pMDE4QQd1bmkwMThCB3VuaTAxOEMHdW5pMDE4RAd1bmkwMThFB3VuaTAxOEYHdW5pMDE5MAd1bmkwMTkxB3VuaTAxOTMHdW5pMDE5NAxmb3Vyc3VwZXJpb3IAAAAAAAABAAAAAML+SiAAAAAAq8rFpAAAAADDEDP9); -} - body { background: #050505; color: #00FF00; - font-family: Matrix; - font-size: 13.3px; + font-family: monospace; + font-size: 11px; } h1 { font-size: 20pt; @@ -24,11 +19,11 @@ div.title p { a:link, a:visited, p.intro a.email span.name { color: #16C816; text-decoration: underline; - font-family: Matrix; + font-family: monospace; } a:link:hover, a:visited:hover { color: #003C00; - font-family: Matrix;; + font-family: monospace;; text-decoration: underline overline; } a.post_no { @@ -58,7 +53,7 @@ div.post.reply div.body a:link:hover, div.post.reply div.body a:visited:hover { } p.intro span.subject { font-size: 12px; - font-family: Matrix; + font-family: monospace; color: #446655; font-weight: 800; } @@ -72,7 +67,7 @@ p.intro a.capcode, p.intro a.nametag { } p.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name { color: #00CC64; - font-family: Matrix; + font-family: monospace; } input[type="text"], textarea, select { background: #333333; @@ -80,7 +75,7 @@ input[type="text"], textarea, select { border: #666666 1px solid; padding-left: 5px; padding-right: -5px; - font-family: Matrix; + font-family: monospace; font-size: 10pt; } input[type="password"] { diff --git a/stylesheets/futaba+vichan.css b/stylesheets/futaba+vichan.css index be0ab672..adf9baef 100644 --- a/stylesheets/futaba+vichan.css +++ b/stylesheets/futaba+vichan.css @@ -86,3 +86,19 @@ unimportant, .unimportant * { table.modlog tr th { background: #EA8; } +div.boardlist { + background-color: rgba(90%,90%,90%,0.2); +} +div.boardlist .sub { + background: none; +} +div.boardlist.bottom { + background-color:transparent; +} + +.desktop-style div.boardlist:nth-child(1) { + text-shadow: #fff 1px 1px 1px, #fff -1px -1px 1px; +} +.desktop-style div.boardlist:nth-child(1):hover { + background-color: rgba(90%, 90%, 90%, 0.55); +} diff --git a/stylesheets/futaba.css b/stylesheets/futaba.css index d30cb938..2a30bc00 100644 --- a/stylesheets/futaba.css +++ b/stylesheets/futaba.css @@ -75,3 +75,12 @@ unimportant, .unimportant * { table.modlog tr th { background: #EA8; } + +.desktop-style div.boardlist:nth-child(1) { + text-shadow: #fff 1px 1px 1px, #fff -1px -1px 1px; +} + + +.desktop-style div.boardlist:nth-child(1):hover { + background-color: rgba(90%, 90%, 90%, 0.55); +} diff --git a/stylesheets/img/arrow.png b/stylesheets/img/arrow.png Binary files differnew file mode 100644 index 00000000..f7403695 --- /dev/null +++ b/stylesheets/img/arrow.png diff --git a/stylesheets/miku.css b/stylesheets/miku.css index 23fb1d9d..2f55b48c 100644 --- a/stylesheets/miku.css +++ b/stylesheets/miku.css @@ -8,7 +8,7 @@ body { a:link, a:visited { text-decoration: none; - color: #0093AB; + color: #00637B; } a:link:hover, a:visited:hover { @@ -54,7 +54,7 @@ p.intro span.name { } div.post.reply.highlighted { - background: #9988EE; + background: #a9d8ff; } div.post.reply { @@ -84,4 +84,14 @@ hr { div.boardlist { color: #0093AB; + background-color: rgba(65%, 85%, 95%, 0.2); +} + +.desktop-style div.boardlist:nth-child(1) { + text-shadow: #D2FFEE 1px 1px 1px, #D2FFEE -1px -1px 1px; +} + + +.desktop-style div.boardlist:nth-child(1):hover { + background-color: rgba(70%, 95%, 100%, 0.45); } diff --git a/stylesheets/style.css b/stylesheets/style.css index c0430b7c..fbb5370f 100644 --- a/stylesheets/style.css +++ b/stylesheets/style.css @@ -285,6 +285,7 @@ span.spoiler:hover, div.post.reply div.body span.spoiler:hover a { div.styles { float: right; padding-bottom: 20px; + } div.styles a { margin: 0 10px; @@ -404,8 +405,59 @@ table.mod.config-editor td { table.mod.config-editor input[type="text"] { width: 98%; } +.desktop-style div.boardlist:nth-child(1) { + position: fixed; + top: 0px; + left: 0px; + right: 0px; + /*text-shadow: white 1px 0px 6px, white 1px 0px 6px, black 1px 0px 3px;*/ + margin-top: 0px; + z-index: 30; +} +.desktop-style div.boardlist:nth-child(1):hover { + background-color: rgba(90%, 90%, 90%, 0.6); +} + +.desktop-style body { + padding-top: 20px; +} + +.desktop-style .sub { + background: inherit; +} +.desktop-style .sub .sub { + display: inline-block; + text-indent: -9000px; + width: 7px; + background: url('img/arrow.png') right center no-repeat; +} +.desktop-style .sub .sub:hover, .desktop-style .sub .sub.hover { + display: inline; + text-indent: 0px; + background: inherit; +} + +#attention_bar { + height: 1.5em; + width: 100%; + text-align: center; +} +#attention_bar_form { + display: none; + padding: 0; + margin: 0; +} +#attention_bar_input { + width: 100%; + padding: 0; + margin: 0; + text-align: center; +} +#attention_bar:hover { + background-color: #fff; + opacity: 0.8; +} p.intro.thread-hidden { margin: 0px; padding: 0px; } - diff --git a/stylesheets/testorange.css b/stylesheets/testorange.css index 7b1ce0a6..c7250de4 100644 --- a/stylesheets/testorange.css +++ b/stylesheets/testorange.css @@ -12,6 +12,19 @@ body { background-position: right bottom, 0% 0%, 0% 0%; } +.desktop-style .bl-menu{ +background-image: url('img/testorange_bg.gif'); + background-repeat: repeat; +} + +.boardlist .board a { +background-image: url('img/testorange_bg.gif'); + background-repeat: repeat; +} + + + + a:link, a:visited, div.post.reply div.body a { color:#ff9100; text-decoration: none; @@ -22,7 +35,10 @@ a:link:hover, a:visited:hover, div.post.reply div.body a:hover { a.email span.name { color:#ff9100 !important; +} +div.post.reply.highlighted { +background: black; } input { @@ -150,11 +166,10 @@ span.trip, .postertrip { .omittedposts { color:#707070; } -.reply { +div.post.reply { padding: 5px; border: 1px #707070 solid !important; - background: #282828 !important; - + background: #282828; -webkit-border-radius: 10px; -khtml-border-radius: 10px; -moz-border-radius: 10px; @@ -164,45 +179,33 @@ span.trip, .postertrip { background-color: #1e1e1e; color: #bebebe; } -.doubledash { - vertical-align:top; - clear:both; - float:left; -} -.replytitle { - font-size: 1.2em; - color:#fff; - font-weight:800; -} -.commentpostername { - color: #fff; - font-weight:800; -} -.thumbnailmsg { - font-size: small; - color: #bebebe; -} form table th, div.banner, div.pages, .replymode, .postblock, .passvalid, .catalogmode { background: #ff9100 url('img/testorange_f_bg.gif') repeat-x !important; } -div.pages { +div.pages, div.pages a { color: black; border: 0; } - -.abbrev { - color:#707070; +div.boardlist { + background-color: rgba(5%,5%,5%,0.2); } -.highlight { - background:#000; - border: 1px dashed #ff9100; +div.boardlist.bottom { + background-color:transparent; } -#watchedthreads { - background-color: #282828 !important; +.desktop-style div.boardlist:nth-child(1) { + text-shadow: #000 1px 1px 1px, #500 -1px -1px 1px; } -.reflinkpreview { - background-color: #282828 !important; + +.desktop-style div.boardlist:nth-child(1):hover { + background-color: rgba(0%, 0%, 0%, 0.45); } +p.intro span.subject { + color:#ee8100; +} + +span.quote { + color: #a8c952; +} diff --git a/stylesheets/wasabi.css b/stylesheets/wasabi.css index a080a12a..3da974c3 100644 --- a/stylesheets/wasabi.css +++ b/stylesheets/wasabi.css @@ -345,6 +345,8 @@ div.boardlist.bottom { } div.boardlist a { text-decoration: none; + color:#ffff22; + text-shadow: #000 1px 1px 1px, #000 -1px -1px 1px, #950000 1px 1px 2px, #009500 -1px -1px 2px; } div.report { color: #333; @@ -389,3 +391,12 @@ div.blotter { font-weight: bold; text-align: center; } + +.desktop-style div.boardlist:nth-child(1) { + +} + + +.desktop-style div.boardlist:nth-child(1):hover { + background-color: rgba(100%, 100%, 30%, 0.35); +} diff --git a/templates/attention_bar.html b/templates/attention_bar.html new file mode 100644 index 00000000..35f6b8f0 --- /dev/null +++ b/templates/attention_bar.html @@ -0,0 +1,6 @@ +{% if config.attention_bar %} +<div id="attention_bar"></div> +<form method="post" action="{{ config.root }}attentionbar.php" id="attention_bar_form"> + <input id="attention_bar_input" name="text" value="" type="text"> +</form> +{% endif %} diff --git a/templates/boardlist.html b/templates/boardlist.html new file mode 100644 index 00000000..62646845 --- /dev/null +++ b/templates/boardlist.html @@ -0,0 +1 @@ +I'm your overboard boardlist. You can put here anything and I reside in templates/boardlist.html diff --git a/templates/generic_page.html b/templates/generic_page.html index 8f608a6a..70cb15aa 100644 --- a/templates/generic_page.html +++ b/templates/generic_page.html @@ -20,6 +20,7 @@ </div> </header> + {% include 'attention_bar.html' %} {% include 'post_form.html' %} {% if config.global_message %}<hr /><div class="blotter">{{ config.global_message }}</div>{% endif %} diff --git a/templates/header.html b/templates/header.html index 6929fdca..0f4bd260 100644 --- a/templates/header.html +++ b/templates/header.html @@ -40,4 +40,4 @@ .recaptchatable, #recaptcha_area tr, #recaptcha_area td, #recaptcha_area th { padding: 0 !important; } - {% endraw %}</style>{% endif %}
\ No newline at end of file + {% endraw %}</style>{% endif %} diff --git a/templates/index.html b/templates/index.html index e32ac253..12150d0b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -2,6 +2,18 @@ <html> <head> <meta charset="utf-8"> + + <script type="text/javascript"> + {% if config.quick_reply %} + var new_reply_string = "{{ config.button_reply }}"; + {% endif %} + {% if not no_post_form %} + var active_page = "index"; + {% else %} + var active_page = "ukko"; + {% endif %} + </script> + {% include 'header.html' %} <title>{{ board.url }} - {{ board.title|e }}</title> </head> @@ -19,8 +31,13 @@ </div> </header> - {% include 'post_form.html' %} - + {% include 'attention_bar.html' %} + {% if not no_post_form %} + {% include 'post_form.html' %} + {% else %} + {% include 'boardlist.html' %} + {% endif %} + {% if config.global_message %}<hr /><div class="blotter">{{ config.global_message }}</div>{% endif %} <hr /> <form name="postcontrols" action="{{ config.post_url }}" method="post"> diff --git a/templates/post_form.html b/templates/post_form.html index 4d7a37b7..12f1186b 100644 --- a/templates/post_form.html +++ b/templates/post_form.html @@ -27,24 +27,22 @@ <td> <input type="text" name="email" size="25" maxlength="40" autocomplete="off"> {{ antibot.html() }} + {% if not (not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %} + <input accesskey="s" style="margin-left:2px;" type="submit" name="post" value="{% if id %}{{ config.button_reply }}{% else %}{{ config.button_newtopic }}{% endif %}" />{% if config.spoiler_images %} <input id="spoiler" name="spoiler" type="checkbox"> <label for="spoiler">{% trans %}Spoiler Image{% endtrans %}</label>{% endif %} + {% endif %} </td> </tr>{% endif %} - <tr> - {% if not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri)) %}<th> + {% if not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri)) %}<tr> + <th> {% trans %}Subject{% endtrans %} {{ antibot.html() }} </th> <td> <input style="float:left;" type="text" name="subject" size="25" maxlength="100" autocomplete="off"> - {% else %}<th> - {% trans %}Submit{% endtrans %} - {{ antibot.html() }} - </th> - <td> - {% endif %} <input accesskey="s" style="margin-left:2px;" type="submit" name="post" value="{% if id %}{{ config.button_reply }}{% else %}{{ config.button_newtopic }}{% endif %}" />{% if config.spoiler_images %} <input id="spoiler" name="spoiler" type="checkbox"> <label for="spoiler">{% trans %}Spoiler Image{% endtrans %}</label>{% endif %} </td> </tr> + {% endif %} <tr> <th> {% trans %}Comment{% endtrans %} @@ -53,6 +51,11 @@ <td> <textarea name="body" id="body" rows="5" cols="35"></textarea> {{ antibot.html() }} + {% if not (not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %} + {% if not (not config.field_disable_email or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %} + <input accesskey="s" style="margin-left:2px;" type="submit" name="post" value="{% if id %}{{ config.button_reply }}{% else %}{{ config.button_newtopic }}{% endif %}" />{% if config.spoiler_images %} <input id="spoiler" name="spoiler" type="checkbox"> <label for="spoiler">{% trans %}Spoiler Image{% endtrans %}</label>{% endif %} + {% endif %} + {% endif %} </td> </tr> {% if config.recaptcha %} diff --git a/templates/post_thread.html b/templates/post_thread.html index 21add308..a24d7557 100644 --- a/templates/post_thread.html +++ b/templates/post_thread.html @@ -1,7 +1,7 @@ {% filter remove_whitespace %} {# tabs and new lines will be ignored #} -<div id="thread_{{ post.id }}"> +<div id="thread_{{ post.id }}" data-board="{{ board.uri }}"> {% if post.embed %} {{ post.embed }} diff --git a/templates/search_form.html b/templates/search_form.html new file mode 100644 index 00000000..4c8bd077 --- /dev/null +++ b/templates/search_form.html @@ -0,0 +1,19 @@ +<div class="ban"> + <h2>{% trans %}Search{% endtrans %}</h2> + <form style="display:inline" action="" method="get"> + <p> + <label style="display:inline" for="search">{% trans %}Phrase:{% endtrans %}</label> + <input id="search" name="search" type="text" size="40" value="{{ search }}"> + <select name="board"> + <option value="none">{% trans %}Select board{% endtrans %}…</option> + {% for b in boards %} + <option value="{{ b }}"{% if b == board %} selected{% endif %}>/{{ b }}/</option> + {% endfor %} + </select> + <input type="submit" value="{% trans %}Search{% endtrans %}" /> + </p> + </form> + <p style="font-size:8pt;margin:5px"> + {% trans %}Search is case-insensitive and based on keywords. To match exact phrases, use "quotes". Use an asterisk (*) for wildcard.</p><p style="font-size:8pt;margin:5px">You may apply the following filters to your searches: <strong>id</strong>, <strong>thread</strong>, <strong>subject</strong>, and <strong>name</strong>. To apply a filter, simply add to your query, for example, <em>name:Anonymous</em> or <em>subject:"Some Thread"</em>. Wildcards cannot be used in filters.{% endtrans %} + </p> +</div> diff --git a/templates/themes/ukko/info.php b/templates/themes/ukko/info.php new file mode 100644 index 00000000..34d59d4e --- /dev/null +++ b/templates/themes/ukko/info.php @@ -0,0 +1,53 @@ +<?php + $theme = Array(); + + // Theme name + $theme['name'] = 'Ukko'; + // Description (you can use Tinyboard markup here) + $theme['description'] = 'Board with threads and messages from all boards'; + $theme['version'] = 'v0.1'; + + // 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', + '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); + } + } + diff --git a/templates/themes/ukko/theme.php b/templates/themes/ukko/theme.php new file mode 100644 index 00000000..1682b4ec --- /dev/null +++ b/templates/themes/ukko/theme.php @@ -0,0 +1,111 @@ +<?php + require 'info.php'; + + function ukko_build($action, $settings) { + $ukko = new ukko(); + $ukko->settings = $settings; + $ukko->build(); + } + + class ukko { + 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 `bump` DESC', $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['id'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'], $post['body'], $post['time'], + $post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'], $post['fileheight'], $post['filesize'], + $post['filename'], $post['ip'], $post['sticky'], $post['locked'], $post['sage'], $post['embed'], $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['file']) + $num_images++; + + $thread->add(new Post( + $po['id'], $post['id'], $po['subject'], $po['email'], $po['name'], $po['trip'], $po['capcode'], $po['body'], $po['time'], + $po['thumb'], $po['thumbwidth'], $po['thumbheight'], $po['file'], $po['filewidth'], $po['fileheight'], $po['filesize'], + $po['filename'], $po['ip'], $po['embed'], $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 `file` 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="ukko.js"></script>'; + + file_write($this->settings['uri'] . '/index.html', Element('index.html', array( + 'config' => $config, + 'board' => $board, + 'no_post_form' => true, + 'body' => $body, + 'boardlist' => createBoardlist($mod) + ))); + + file_write($this->settings['uri'] . '/ukko.js', Element('themes/ukko/ukko.js', array())); + } + + }; + +?> diff --git a/templates/themes/ukko/thumb.png b/templates/themes/ukko/thumb.png Binary files differnew file mode 100644 index 00000000..49c4237b --- /dev/null +++ b/templates/themes/ukko/thumb.png diff --git a/templates/themes/ukko/ukko.js b/templates/themes/ukko/ukko.js new file mode 100644 index 00000000..4a36b394 --- /dev/null +++ b/templates/themes/ukko/ukko.js @@ -0,0 +1,115 @@ +(function(){ + +var cache = new Array(), + thread = false, + loading = false, + ukkotimer = false; +if (localStorage.hiddenboards !== null) { + 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 = '../' + 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/thread.html b/templates/thread.html index 97f8a3db..7fe60a39 100644 --- a/templates/thread.html +++ b/templates/thread.html @@ -2,6 +2,11 @@ <html> <head> <meta charset="utf-8"> + + <script type="text/javascript"> + var active_page = "thread"; + </script> + {% include 'header.html' %} <title>{{ board.url }} - {% if config.thread_subject_in_title and thread.subject %}{{ thread.subject }}{% else %}{{ board.title|e }}{% endif %}</title> </head> @@ -21,6 +26,8 @@ <div class="banner">{% trans %}Posting mode: Reply{% endtrans %} <a class="unimportant" href="{{ return }}">[{% trans %}Return{% endtrans %}]</a></div> + {% include 'attention_bar.html' %} + {% include 'post_form.html' %} {% if config.global_message %}<hr /><div class="blotter">{{ config.global_message }}</div>{% endif %} @@ -42,4 +49,4 @@ ready(); {% endraw %}</script> </body> -</html>
\ No newline at end of file +</html> diff --git a/tools/benchmark.php b/tools/benchmark.php new file mode 100644 index 00000000..8c97364c --- /dev/null +++ b/tools/benchmark.php @@ -0,0 +1,52 @@ +#!/usr/bin/php +<?php +/* + * benchmark.php - benchmarks thumbnailing methods + * + */ + +require dirname(__FILE__) . '/inc/cli.php'; +require 'inc/image.php'; + +// move back to this directory +chdir(dirname(__FILE__)); + +if(count($argv) != 2) + die("Usage: {$argv[0]} [file]\n"); + +$file = $argv[1]; +$extension = strtolower(substr($file, strrpos($file, '.') + 1)); +$out = tempnam($config['tmp'], 'thumb'); +$count = 300; + +function benchmark($method) { + global $config, $file, $extension, $out, $count; + + $config['thumb_method'] = $method; + + printf("Method: %s\nThumbnailing %d times... ", $method, $count); + + $start = microtime(true); + for($i = 0; $i < $count; $i++) { + $image = new Image($file, $extension); + $thumb = $image->resize( + $config['thumb_ext'] ? $config['thumb_ext'] : $extension, + $config['thumb_width'], + $config['thumb_height'] + ); + + $thumb->to($out); + $thumb->_destroy(); + $image->destroy(); + } + $end = microtime(true); + + printf("Took %.2f seconds (%.2f/second; %.2f ms)\n", $end - $start, $rate = ($count / ($end - $start)), 1000 / $rate); + + unlink($out); +} + +benchmark('gd'); +benchmark('imagick'); +benchmark('convert'); + diff --git a/tools/i18n_compile.php b/tools/i18n_compile.php new file mode 100755 index 00000000..ba193767 --- /dev/null +++ b/tools/i18n_compile.php @@ -0,0 +1,44 @@ +#!/usr/bin/php +<?php + +/* + * i18n_compile.php - compiles the i18n + * + * Options: + * -l [locale], --locale=[locale] + * Compiles [locale] locale. + * + */ + +require dirname(__FILE__) . '/inc/cli.php'; + +// parse command line +$opts = getopt('l:', Array('locale:')); +$options = Array(); + +$options['locale'] = isset($opts['l']) ? $opts['l'] : (isset($opts['locale']) ? $opts['locale'] : false); + +if ($options['locale']) $locales = array($options['locale']); +else die("Error: no locales specified; use -l switch, eg. -l pl_PL\n"); + +foreach ($locales as $loc) { + if (file_exists ($locdir = "inc/locale/".$loc)) { + if (!is_dir ($locdir)) { + continue; + } + } + else { + die("Error: $locdir does not exist\n"); + } + + // Generate tinyboard.po + if (file_exists($locdir."/LC_MESSAGES/tinyboard.po")) $join = "-j"; + else $join = ""; + passthru("cd $locdir/LC_MESSAGES; + msgfmt tinyboard.po -o tinyboard.mo"); + + // Generate javascript.po + passthru("cd tools/inc/lib/jsgettext/; + php po2json.php -i ../../../../$locdir/LC_MESSAGES/javascript.po \ + -o ../../../../$locdir/LC_MESSAGES/javascript.js"); +} diff --git a/tools/i18n_extract.php b/tools/i18n_extract.php new file mode 100755 index 00000000..4c32b688 --- /dev/null +++ b/tools/i18n_extract.php @@ -0,0 +1,47 @@ +#!/usr/bin/php +<?php + +/* + * i18n_extract.php - extracts the strings and updates all locales + * + * Options: + * -l [locale], --locale=[locale] + * Updates only [locale] locale. If it does not exist yet, we create a new directory. + * + */ + +require dirname(__FILE__) . '/inc/cli.php'; + +// parse command line +$opts = getopt('l:', Array('locale:')); +$options = Array(); + +$options['locale'] = isset($opts['l']) ? $opts['l'] : (isset($opts['locale']) ? $opts['locale'] : false); + +$locales = glob("inc/locale/*"); +$locales = array_map("basename", $locales); + +if ($options['locale']) $locales = array($options['locale']); + + +foreach ($locales as $loc) { + if (file_exists ($locdir = "inc/locale/".$loc)) { + if (!is_dir ($locdir)) { + continue; + } + } + else { + mkdir($locdir); + mkdir($locdir."/LC_MESSAGES"); + } + + // Generate tinyboard.po + if (file_exists($locdir."/LC_MESSAGES/tinyboard.po")) $join = "-j"; + else $join = ""; + passthru("cd $locdir/LC_MESSAGES; + xgettext -d tinyboard -L php --from-code utf-8 $join -c $(find ../../../../ -name \*.php)"); + + // Generate javascript.po + passthru("cd $locdir/LC_MESSAGES; + xgettext -d javascript -L Python --force-po --from-code utf-8 $join -c $(find ../../../../js/ ../../../../templates/ -name \*.js)"); +} diff --git a/tools/inc/cli.php b/tools/inc/cli.php new file mode 100644 index 00000000..294609cd --- /dev/null +++ b/tools/inc/cli.php @@ -0,0 +1,100 @@ +<?php + +/* + * This script will look for Tinyboard in the following places (in order): + * - $TINYBOARD_PATH environment varaible + * - ./ + * - ./Tinyboard/ + * - ../ + */ + +set_time_limit(0); +$shell_path = getcwd(); + +if(getenv('TINYBOARD_PATH') !== false) + $dir = getenv('TINYBOARD_PATH'); +elseif(file_exists('inc/functions.php')) + $dir = false; +elseif(file_exists('Tinyboard') && is_dir('Tinyboard') && file_exists('Tinyboard/inc/functions.php')) + $dir = 'Tinyboard'; +elseif(file_exists('../inc/functions.php')) + $dir = '..'; +else + die("Could not locate Tinyboard directory!\n"); + +if($dir && !chdir($dir)) + die("Could not change directory to {$dir}\n"); + +if(!getenv('TINYBOARD_PATH')) { + // follow symlink + chdir(realpath('inc') . '/..'); +} + +putenv('TINYBOARD_PATH=' . getcwd()); + +require 'inc/functions.php'; +require 'inc/mod.php'; + +$mod = Array( + 'id' => -1, + 'type' => ADMIN, + 'username' => '?', + 'boards' => Array('*') +); + +function get_httpd_privileges() { + global $config, $shell_path, $argv; + + if(php_sapi_name() != 'cli') + die("get_httpd_privileges(): invoked from HTTP client.\n"); + + echo "Dropping priviledges...\n"; + + if(!is_writable('.')) + die("get_httpd_privileges(): web directory is not writable\n"); + + $filename = '.' . md5(rand()) . '.php'; + $inc_filename = '.' . md5(rand()) . '.php'; + + echo "Copying rebuilder to web directory...\n"; + + // replace "/inc/cli.php" with its new filename + passthru("cat " . escapeshellarg($shell_path . '/' . $_SERVER['PHP_SELF']) . " | sed \"s/'\/inc\/cli\.php'/'\/{$inc_filename}'/\" > {$filename}"); + + $inc_header = "<?php\n"; + + // copy environment + $env = explode("\n", shell_exec('printenv | grep ^TINYBOARD')); + foreach($env as $line) { + if(!empty($line)) + $inc_header .= "putenv('" . addslashes($line) . "');\n"; + } + + // copy command line arguments + $inc_header .= "\$argv = " . var_export($argv, true) . ";\n"; + + // copy this file + file_put_contents($inc_filename, $inc_header . substr($inc = file_get_contents(__FILE__), strpos($inc, "\n"))); + + chmod($filename, 0666); + chmod($inc_filename, 0666); + + if(preg_match('/^https?:\/\//', $config['root'])) { + $url = $config['root'] . $filename; + } elseif($host = getenv('TINYBOARD_HOST')) { + $url = 'http://' . $host . $config['root'] . $filename; + } else { + // assume localhost + $url = 'http://localhost' . $config['root'] . $filename; + } + + echo "Downloading $url\n"; + + passthru('curl -s -N ' . escapeshellarg($url)); + + unlink($filename); + unlink($inc_filename); + + exit(0); +} + diff --git a/tools/inc/lib/jsgettext/JSParser.php b/tools/inc/lib/jsgettext/JSParser.php new file mode 100644 index 00000000..adba59bc --- /dev/null +++ b/tools/inc/lib/jsgettext/JSParser.php @@ -0,0 +1,94 @@ +<?php + +class JSParser { + + protected $content; + protected $keywords; + protected $regs = array(); + protected $regsCounter = 0; + protected $strings = array(); + protected $stringsCounter = 0; + + protected function _extractRegs($match) { + $this->regs[$this->regsCounter] = $match[1]; + $id = "<<reg{$this->regsCounter}>>"; + $this->regsCounter++; + return $id; + } + protected function _extractStrings($match) { + $this->strings[$this->stringsCounter] = $this->importRegExps($match[0]); + $id = "<<s{$this->stringsCounter}>>"; + $this->stringsCounter++; + return $id; + } + protected function importRegExps($input) { + $regs = $this->regs; + return preg_replace_callback("#<<reg(\d+)>>#", function ($match) use($regs) { + return $regs[$match[1]]; + }, $input); + } + + protected function importStrings($input) { + $strings = $this->strings; + return preg_replace_callback("#<<s(\d+)>>#", function ($match) use($strings) { + return $strings[$match[1]]; + }, $input); + } + + public function __construct($file, $keywords = '_') { + $this->content = file_get_contents($file); + $this->keywords = (array)$keywords; + } + + public function parse() { + $output = $this->content; //htmlspecialchars($this->content, ENT_NOQUOTES); + + // extract reg exps + $output = preg_replace_callback( + '# ( / (?: (?>[^/\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\/ )+ (?<!\\\\)/ ) [a-z]* \b #ix', + array($this, '_extractRegs'), $output + ); + + // extract strings + $output = preg_replace_callback( + array( + '# " ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)" #ix', + "# ' ( (?: (?>[^'\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\' )* ) (?<!\\\\)' #ix" + ), array($this, '_extractStrings'), $output + ); + + // delete line comments + $output = preg_replace("#(//.*?)$#m", '', $output); + + // delete multiline comments + $output = preg_replace('#/\*(.*?)\*/#is', '', $output); + + $strings = $this->strings; + $output = preg_replace_callback("#<<s(\d+)>>#", function($match) use($strings) { + return $strings[$match[1]]; + }, $output); + + $keywords = implode('|', $this->keywords); + + $strings = array(); + + // extract func calls + preg_match_all( + '# (?:'.$keywords.') \(\\ *" ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)"\\ *\) #ix', + $output, $matches, PREG_SET_ORDER + ); + + foreach ($matches as $m) $strings[] = stripslashes($m[1]); + + $matches = array(); + preg_match_all( + "# (?:$keywords) \(\\ *' ( (?: (?>[^'\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\' )* ) (?<!\\\\)'\\ *\) #ix", + $output, $matches, PREG_SET_ORDER + ); + + foreach ($matches as $m) $strings[] = stripslashes($m[1]); + + return $strings; + } +} +?> diff --git a/tools/inc/lib/jsgettext/PoeditParser.php b/tools/inc/lib/jsgettext/PoeditParser.php new file mode 100644 index 00000000..eebd816e --- /dev/null +++ b/tools/inc/lib/jsgettext/PoeditParser.php @@ -0,0 +1,83 @@ +<?php + +require_once 'PoeditString.php'; + +class PoeditParser { + + protected $file; + protected $header = ''; + protected $strings = array(); + + protected function _fixQuotes($str) { + return stripslashes($str); + } + + public function __construct($file) { + $this->file = $file; + } + + public function parse() { + $contents = file_get_contents($this->file); + + $parts = preg_split('#(\r\n|\n){2}#', $contents, -1, PREG_SPLIT_NO_EMPTY); + + $this->header = array_shift($parts); + + foreach ($parts as $part) { + + // parse comments + $comments = array(); + preg_match_all('#^\\#: (.*?)$#m', $part, $matches, PREG_SET_ORDER); + foreach ($matches as $m) $comments[] = $m[1]; + + $isFuzzy = preg_match('#^\\#, fuzzy$#im', $part) ? true : false; + + preg_match_all('# ^ (msgid|msgstr)\ " ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)" $ #ixm', $part, $matches2, PREG_SET_ORDER); + + $k = $this->_fixQuotes($matches2[0][2]); + $v = !empty($matches2[1][2]) ? $this->_fixQuotes($matches2[1][2]) : ''; + + $this->strings[$k] = new PoeditString($k, $v, $isFuzzy, $comments); + } + } + + public function merge($strings) { + foreach ((array)$strings as $str) { + if (!in_array($str, array_keys($this->strings))) { + $this->strings[$str] = new PoeditString($str); + } + } + } + + public function getHeader() { + return $this->header; + } + + public function getStrings() { + return $this->strings; + } + + public function getJSON() { + $str = array(); + foreach ($this->strings as $s) { + if ($s->value) $str[$s->key] = $s->value; + } + return json_encode($str); + } + + public function toJSON($outputFilename, $varName = 'l10n') { + $str = "$varName = " . $this->getJSON() . ";"; + return file_put_contents($outputFilename, $str) !== false; + } + + public function save($filename = null) { + $data = $this->header . "\n\n"; + foreach ($this->strings as $str) { + $data .= $str; + } + return file_put_contents($filename ? $filename : $this->file, $data) !== false; + } +} + + +?> diff --git a/tools/inc/lib/jsgettext/PoeditString.php b/tools/inc/lib/jsgettext/PoeditString.php new file mode 100644 index 00000000..3d59d004 --- /dev/null +++ b/tools/inc/lib/jsgettext/PoeditString.php @@ -0,0 +1,29 @@ +<?php + +class PoeditString { + public $key; + public $value; + public $fuzzy; + public $comments; + + function __construct($key, $value = '', $fuzzy = false, $comments = array()) { + $this->key = $key; + $this->value = $value; + $this->fuzzy = $fuzzy; + $this->comments = (array)$comments; + } + + public function __toString() { + $str =''; + foreach ($this->comments as $c) { + $str .= "#: $c\n"; + } + if ($this->fuzzy) $str .= "#, fuzzy\n"; + $str .= 'msgid "'.str_replace('"', '\\"', $this->key).'"' . "\n"; + $str .= 'msgstr "'.str_replace('"', '\\"', $this->value).'"' . "\n"; + $str .= "\n"; + return $str; + } +} + +?>
\ No newline at end of file diff --git a/tools/inc/lib/jsgettext/jsgettext.php b/tools/inc/lib/jsgettext/jsgettext.php new file mode 100644 index 00000000..6c70f0b4 --- /dev/null +++ b/tools/inc/lib/jsgettext/jsgettext.php @@ -0,0 +1,63 @@ +<?php + + require_once 'JSParser.php'; + require_once 'PoeditParser.php'; + + function buildOptions($args) { + $options = array( + 'files' => array(), + '-o' => null, + '-k' => '_' + ); + $len = count($args); + $i = 1; + while ($i < $len) { + if (preg_match('#^-[a-z]$#i', $args[$i])) { + $options[$args[$i]] = isset($args[$i+1]) ? trim($args[$i+1]) : true; + $i += 2; + } + else { + $options['files'][] = $args[$i]; + $i++; + } + } + return $options; + } + + $options = buildOptions($argv); + + if (!file_exists($options['-o'])) { + touch($options['-o']); + } + + if (!is_writable($options['-o'])) { + die("Invalid output file name. Make sure it exists and is writable."); + } + + $inputFiles = $options['files']; + + if (empty($inputFiles)) { + die("You did not provide any input file."); + } + + $poeditParser = new PoeditParser($options['-o']); + $poeditParser->parse(); + + $errors = array(); + + foreach ($inputFiles as $f) { + if (!is_readable($f) || !preg_match('#\.js$#', $f)) { + $errors[] = ("$f is not a valid javascript file."); + continue; + } + $jsparser = new JSParser($f, explode(' ', $options['-k'])); + $jsStrings = $jsparser->parse(); + $poeditParser->merge($jsStrings); + } + + if (!empty($errors)) { + echo "\nThe following errors occured:\n" . implode("\n", $errors) . "\n"; + } + + $poeditParser->save(); +?> diff --git a/tools/inc/lib/jsgettext/po2json.php b/tools/inc/lib/jsgettext/po2json.php new file mode 100644 index 00000000..847b0899 --- /dev/null +++ b/tools/inc/lib/jsgettext/po2json.php @@ -0,0 +1,42 @@ +<?php + + require_once 'PoeditParser.php'; + + function buildOptions($args) { + $options = array( + '-o' => null, + '-i' => null, + '-n' => 'l10n' + ); + $len = count($args); + $i = 0; + while ($i < $len) { + if (preg_match('#^-[a-z]$#i', $args[$i])) { + $options[$args[$i]] = isset($args[$i+1]) ? trim($args[$i+1]) : true; + $i += 2; + } + else { + $options[] = $args[$i]; + $i++; + } + } + return $options; + } + + $options = buildOptions($argv); + + if (!file_exists($options['-i']) || !is_readable($options['-i'])) { + die("Invalid input file. Make sure it exists and is readable."); + } + + $poeditParser = new PoeditParser($options['-i']); + $poeditParser->parse(); + + if ($poeditParser->toJSON($options['-o'], $options['-n'])) { + $strings = count($poeditParser->getStrings()); + echo "Successfully exported " . count($strings) . " strings.\n"; + } + else { + echo "Cannor write to file '{$options['-o']}'.\n"; + } +?> diff --git a/tools/rebuild.php b/tools/rebuild.php new file mode 100755 index 00000000..3b5c0de2 --- /dev/null +++ b/tools/rebuild.php @@ -0,0 +1,105 @@ +#!/usr/bin/php +<?php + +/* + * rebuild.php - rebuilds all static files + * + * Command line arguments: + * -q, --quiet + * Suppress output. + * + * --quick + * Do not rebuild posts. + * + * -b, --board <string> + * Rebuild only the specified board. + * + * -f, --full + * Rebuild replies as well as threads (re-markup). + * + */ + +require dirname(__FILE__) . '/inc/cli.php'; + +if(!is_writable($config['file_script'])) { + get_httpd_privileges(); +} + +$start = microtime(true); + +// parse command line +$opts = getopt('qfb:', Array('board:', 'quick', 'full', 'quiet')); +$options = Array(); + +$options['board'] = isset($opts['board']) ? $opts['board'] : (isset($opts['b']) ? $opts['b'] : false); +$options['quiet'] = isset($opts['q']) || isset($opts['quiet']); +$options['quick'] = isset($opts['quick']); +$options['full'] = isset($opts['full']) || isset($opts['f']); + +if(!$options['quiet']) + echo "== Tinyboard {$config['version']} ==\n"; + +if(!$options['quiet']) + echo "Clearing template cache...\n"; + +load_twig(); +$twig->clearCacheFiles(); + +if(!$options['quiet']) + echo "Regenerating theme files...\n"; +rebuildThemes('all'); + +if(!$options['quiet']) + echo "Generating Javascript file...\n"; +buildJavascript(); + +$main_js = $config['file_script']; + +$boards = listBoards(); + +foreach($boards as &$board) { + if($options['board'] && $board['uri'] != $options['board']) + continue; + + if(!$options['quiet']) + echo "Opening board /{$board['uri']}/...\n"; + openBoard($board['uri']); + + if($config['file_script'] != $main_js) { + // different javascript file + if(!$options['quiet']) + echo "Generating Javascript file...\n"; + buildJavascript(); + } + + + if(!$options['quiet']) + echo "Creating index pages...\n"; + buildIndex(); + + if($options['quick']) + continue; // do no more + + if($options['full']) { + $query = query(sprintf("SELECT `id` FROM `posts_%s`", $board['uri'])) or error(db_error()); + while($post = $query->fetch()) { + if(!$options['quiet']) + echo "Rebuilding #{$post['id']}...\n"; + rebuildPost($post['id']); + } + } + + $query = query(sprintf("SELECT `id` FROM `posts_%s` WHERE `thread` IS NULL", $board['uri'])) or error(db_error()); + while($post = $query->fetch()) { + if(!$options['quiet']) + echo "Rebuilding #{$post['id']}...\n"; + buildThread($post['id']); + } +} + +if(!$options['quiet']) + printf("Complete! Took %g seconds\n", microtime(true) - $start); + +unset($board); +modLog('Rebuilt everything using tools/rebuild.php'); + |
