diff options
| author | czaks <marcin@6irc.net> | 2013-07-31 14:54:20 -0400 |
|---|---|---|
| committer | czaks <marcin@6irc.net> | 2013-07-31 14:54:20 -0400 |
| commit | 55c7146d884005f70d15e991a9e8ea31b7021361 (patch) | |
| tree | 57b6548601dfd1542febe05375efe49d439e1fb4 | |
| parent | ee23ec1e24bb2a0cec24af011012e95652ce85a9 (diff) | |
| parent | 8e4c493a4c5bbff07483fd4a11c44c687c99e441 (diff) | |
Merge branch 'master' of https://github.com/savetheinternet/Tinyboard
Conflicts:
inc/config.php
inc/display.php
inc/functions.php
inc/image.php
js/expand.js
js/hide-threads.js
js/local-time.js
js/smartphone-spoiler.js
templates/header.html
templates/index.html
templates/main.js
templates/page.html
templates/post_reply.html
templates/post_thread.html
templates/thread.html
| -rw-r--r-- | inc/config.php | 21 | ||||
| -rw-r--r-- | inc/display.php | 1 | ||||
| -rw-r--r-- | inc/functions.php | 9 | ||||
| -rw-r--r-- | inc/image.php | 8 | ||||
| -rw-r--r-- | inc/mod/pages.php | 17 | ||||
| -rw-r--r-- | inc/template.php | 144 | ||||
| -rw-r--r-- | js/expand.js | 2 | ||||
| -rw-r--r-- | js/inline-expanding.js | 5 | ||||
| -rw-r--r-- | js/local-time.js | 14 | ||||
| -rw-r--r-- | post.php | 18 | ||||
| -rw-r--r-- | templates/index.html | 122 | ||||
| -rw-r--r-- | templates/main.js | 460 | ||||
| -rw-r--r-- | templates/mod/login.html | 52 | ||||
| -rw-r--r-- | templates/page.html | 50 | ||||
| -rw-r--r-- | templates/post_reply.html | 222 | ||||
| -rw-r--r-- | templates/post_thread.html | 42 | ||||
| -rw-r--r-- | templates/posts.sql | 2 | ||||
| -rw-r--r-- | templates/thread.html | 102 |
18 files changed, 668 insertions, 623 deletions
diff --git a/inc/config.php b/inc/config.php index f24a035c..38a17e03 100644 --- a/inc/config.php +++ b/inc/config.php @@ -335,9 +335,14 @@ $config['auto_unicode'] = true; // Whether to turn URLs into functional links $config['markup_urls'] = true; + // Prefix those functional links with some other url, for example some service for hiding referers // (eg. 'http://www.nullrefer.com/?', or 'http://anonym.to/?'), a pay-per-view exit page, etc. - $config['url_ads'] = ''; + $config['url_ads'] = &$config['link_prefix']; // leave alias + + // Optional URL prefix for links (eg. "http://anonym.to/?") + $config['link_prefix'] = ''; + // Wordfilters are used to automatically replace certain words/phrases with something else. // For a normal string replacement: @@ -486,7 +491,7 @@ // Display the file's original filename $config['show_filename']= true; - // Image identification buttons using regex.info/exif, tineye and google images + // Image identification links using regex.info/exif, TinEye and Google Images $config['image_identification'] = false; // Redraw the image using GD functions to strip any excess data (commonly ZIP archives) @@ -542,8 +547,8 @@ $config['ban_date'] = '%A %e %B, %Y'; // The names on the post buttons. (On most imageboards, these are both "Post") - $config['button_newtopic'] = 'New Topic'; - $config['button_reply'] = 'New Reply'; + $config['button_newtopic'] = _('New Topic'); + $config['button_reply'] = _('New Reply'); // Assign each poster in a thread a unique ID, shown by "ID: {id}" before the post number. $config['poster_ids'] = false; @@ -554,7 +559,7 @@ $config['thread_subject_in_title'] = false; // Page footer - $config['footer'][] = 'All trademarks, copyrights, comments, and images on this page are owned by and are the responsibility of their respective parties.'; + $config['footer'][] = _('All trademarks, copyrights, comments, and images on this page are owned by and are the responsibility of their respective parties.'); // Characters used to generate a random password (with Javascript) $config['genpassword_chars'] = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+'; @@ -764,9 +769,9 @@ else $config['root'] = '/'; // CLI mode - // The scheme and domain. This is needed to get absolute URL of some page (for instance image - // identification buttons). If you use the CLI tools, it would be wise to override this setting. - $config['domain'] = (isset ($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? "https://" : "http://"; + // The scheme and domain. This is used to get the site's absolute URL (eg. for image identification links). + // If you use the CLI tools, it would be wise to override this setting. + $config['domain'] = (isset ($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? "https://" : "http://"; $config['domain'] .= isset ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost'; // If for some reason the folders and static HTML index files aren't in the current working direcotry, diff --git a/inc/display.php b/inc/display.php index a2d50f74..3ce8eced 100644 --- a/inc/display.php +++ b/inc/display.php @@ -25,6 +25,7 @@ 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> '; else { if (($key = array_search($board, $list)) && gettype($key) == 'string') { diff --git a/inc/functions.php b/inc/functions.php index 42cdb660..8d1ae920 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -1311,6 +1311,13 @@ function buildJavascript() { 'config' => $config, 'stylesheets' => $stylesheets )); + + // Check if we have translation for the javascripts; if yes, we add it to additional javascripts + list($pure_locale) = explode(".", $config['locale']); + if (file_exists ($jsloc = "inc/locale/$pure_locale/LC_MESSAGES/javascript.js")) { + $script = file_get_contents($jsloc) . "\n\n" . $script; + } + if ($config['additional_javascript_compile']) { foreach ($config['additional_javascript'] as $file) { $script .= file_get_contents($file); @@ -1415,7 +1422,7 @@ function markup_url($matches) { $markup_urls[] = $url; - return '<a target="_blank" rel="nofollow" href="'. $config['url_ads'] . $url . '">' . $url . '</a>' . $after; + return '<a target="_blank" rel="nofollow" href="'. $config['link_prefix'] . $url . '">' . $url . '</a>' . $after; } function unicodify($body) { diff --git a/inc/image.php b/inc/image.php index 7aea9bfe..8cc9d69b 100644 --- a/inc/image.php +++ b/inc/image.php @@ -81,9 +81,7 @@ class Image { $height = $max_height; } - if ($gifsicle) { - $thumb->gifsicle = 1; - } + $thumb->gifsicle = $gifsicle; $thumb->_resize($this->image->image, $width, $height); return $thumb; @@ -288,8 +286,12 @@ class ImageConvert extends ImageBase { if (shell_exec("gifsicle --unoptimize -O2 --resize {$this->width}x{$this->height} < " . escapeshellarg($this->src . '') . " > " . escapeshellarg($this->temp)) || !file_exists($this->temp)) error('Failed to resize image!'); +<<<<<<< HEAD } else { +======= + } else { +>>>>>>> 8e4c493a4c5bbff07483fd4a11c44c687c99e441 if (shell_exec("convert -background transparent -filter Point -sample {$this->width}x{$this->height} +antialias -quality {$quality} " . escapeshellarg($this->src . '') . " " . escapeshellarg($this->temp)) || !file_exists($this->temp)) error('Failed to resize image!'); diff --git a/inc/mod/pages.php b/inc/mod/pages.php index ab4cdaaf..08604039 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -446,6 +446,23 @@ function mod_new_board() { if (!preg_match('/^' . $config['board_regex'] . '$/u', $_POST['uri'])) error(sprintf($config['error']['invalidfield'], 'URI')); + $bytes = 0; + $chars = preg_split('//u', $_POST['uri'], -1, PREG_SPLIT_NO_EMPTY); + foreach ($chars as $char) { + $o = 0; + $ord = ordutf8($char, $o); + if ($ord > 0x0080) + $bytes += 5; // @01ff + else + $bytes ++; + } + $bytes + strlen('posts_.frm'); + + if ($bytes > 255) { + error('Your filesystem cannot handle a board URI of that length (' . $bytes . '/255 bytes)'); + exit; + } + if (openBoard($_POST['uri'])) { error(sprintf($config['error']['boardexists'], $board['url'])); } diff --git a/inc/template.php b/inc/template.php index 071fa761..09e27c26 100644 --- a/inc/template.php +++ b/inc/template.php @@ -1,72 +1,72 @@ -<?php
-
-/*
- * Copyright (c) 2010-2013 Tinyboard Development Group
- */
-
-if (realpath($_SERVER['SCRIPT_FILENAME']) == str_replace('\\', '/', __FILE__)) {
- // You cannot request this file directly.
- exit;
-}
-
-$twig = false;
-
-function load_twig() {
- global $twig, $config;
-
- require 'lib/Twig/Autoloader.php';
- Twig_Autoloader::register();
-
- Twig_Autoloader::autoload('Twig_Extensions_Node_Trans');
- Twig_Autoloader::autoload('Twig_Extensions_TokenParser_Trans');
- Twig_Autoloader::autoload('Twig_Extensions_Extension_I18n');
- Twig_Autoloader::autoload('Twig_Extensions_Extension_Tinyboard');
-
- $loader = new Twig_Loader_Filesystem($config['dir']['template']);
- $loader->setPaths($config['dir']['template']);
- $twig = new Twig_Environment($loader, array(
- 'autoescape' => false,
- 'cache' => "{$config['dir']['template']}/cache",
- 'debug' => $config['debug']
- ));
- $twig->addExtension(new Twig_Extensions_Extension_Tinyboard());
- $twig->addExtension(new Twig_Extensions_Extension_I18n());
-}
-
-function Element($templateFile, array $options) {
- global $config, $debug, $twig;
-
- if (!$twig)
- load_twig();
-
- if (function_exists('create_pm_header') && ((isset($options['mod']) && $options['mod']) || isset($options['__mod'])) && !preg_match('!^mod/!', $templateFile)) {
- $options['pm'] = create_pm_header();
- }
-
- if (isset($options['body']) && $config['debug']) {
- if (isset($debug['start'])) {
- $debug['time'] = '~' . round((microtime(true) - $debug['start']) * 1000, 2) . 'ms';
- unset($debug['start']);
- }
- $debug['included'] = get_included_files();
- $debug['memory'] = round(memory_get_usage(true) / (1024 * 1024), 2) . ' MiB';
- $options['body'] .=
- '<h3>Debug</h3><pre style="white-space: pre-wrap;font-size: 10px;">' .
- str_replace("\n", '<br/>', utf8tohtml(print_r($debug, true))) .
- '</pre>';
- }
-
- // Read the template file
- if (@file_get_contents("{$config['dir']['template']}/${templateFile}")) {
- $body = $twig->render($templateFile, $options);
-
- if ($config['minify_html'] && preg_match('/\.html$/', $templateFile)) {
- $body = trim(preg_replace("/[\t\r\n]/", '', $body));
- }
-
- return $body;
- } else {
- throw new Exception("Template file '${templateFile}' does not exist or is empty in '{$config['dir']['template']}'!");
- }
-}
-
+<?php + +/* + * Copyright (c) 2010-2013 Tinyboard Development Group + */ + +if (realpath($_SERVER['SCRIPT_FILENAME']) == str_replace('\\', '/', __FILE__)) { + // You cannot request this file directly. + exit; +} + +$twig = false; + +function load_twig() { + global $twig, $config; + + require 'lib/Twig/Autoloader.php'; + Twig_Autoloader::register(); + + Twig_Autoloader::autoload('Twig_Extensions_Node_Trans'); + Twig_Autoloader::autoload('Twig_Extensions_TokenParser_Trans'); + Twig_Autoloader::autoload('Twig_Extensions_Extension_I18n'); + Twig_Autoloader::autoload('Twig_Extensions_Extension_Tinyboard'); + + $loader = new Twig_Loader_Filesystem($config['dir']['template']); + $loader->setPaths($config['dir']['template']); + $twig = new Twig_Environment($loader, array( + 'autoescape' => false, + 'cache' => "{$config['dir']['template']}/cache", + 'debug' => $config['debug'] + )); + $twig->addExtension(new Twig_Extensions_Extension_Tinyboard()); + $twig->addExtension(new Twig_Extensions_Extension_I18n()); +} + +function Element($templateFile, array $options) { + global $config, $debug, $twig; + + if (!$twig) + load_twig(); + + if (function_exists('create_pm_header') && ((isset($options['mod']) && $options['mod']) || isset($options['__mod'])) && !preg_match('!^mod/!', $templateFile)) { + $options['pm'] = create_pm_header(); + } + + if (isset($options['body']) && $config['debug']) { + if (isset($debug['start'])) { + $debug['time'] = '~' . round((microtime(true) - $debug['start']) * 1000, 2) . 'ms'; + unset($debug['start']); + } + $debug['included'] = get_included_files(); + $debug['memory'] = round(memory_get_usage(true) / (1024 * 1024), 2) . ' MiB'; + $options['body'] .= + '<h3>Debug</h3><pre style="white-space: pre-wrap;font-size: 10px;">' . + str_replace("\n", '<br/>', utf8tohtml(print_r($debug, true))) . + '</pre>'; + } + + // Read the template file + if (@file_get_contents("{$config['dir']['template']}/${templateFile}")) { + $body = $twig->render($templateFile, $options); + + if ($config['minify_html'] && preg_match('/\.html$/', $templateFile)) { + $body = trim(preg_replace("/[\t\r\n]/", '', $body)); + } + + return $body; + } else { + throw new Exception("Template file '${templateFile}' does not exist or is empty in '{$config['dir']['template']}'!"); + } +} + diff --git a/js/expand.js b/js/expand.js index c69979f9..b13d0bcf 100644 --- a/js/expand.js +++ b/js/expand.js @@ -14,7 +14,7 @@ $(document).ready(function(){ if($('div.banner').length != 0) return; // not index - + 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/inline-expanding.js b/js/inline-expanding.js index 7edb2715..87bf0b11 100644 --- a/js/inline-expanding.js +++ b/js/inline-expanding.js @@ -14,7 +14,7 @@ onready(function(){ var inline_expand_post = function() { var link = this.getElementsByTagName('a'); - + for (var i = 0; i < link.length; i++) { if (typeof link[i] == "object" && link[i].childNodes && typeof link[i].childNodes[0] !== 'undefined' && link[i].childNodes[0].src && link[i].className != 'file') { link[i].childNodes[0].style.maxWidth = '95%'; @@ -54,7 +54,7 @@ onready(function(){ if (window.jQuery) { $('div[id^="thread_"]').each(inline_expand_post); - + // allow to work with auto-reload.js, etc. $(document).bind('new_post', function(e, post) { inline_expand_post.call(post); @@ -63,4 +63,3 @@ onready(function(){ inline_expand_post.call(document); } }); - diff --git a/js/local-time.js b/js/local-time.js index a4e2fb51..d581e304 100644 --- a/js/local-time.js +++ b/js/local-time.js @@ -6,7 +6,7 @@ * Copyright (c) 2012 Michael Save <savetheinternet@tinyboard.org> * * Usage: - * $config['additional_javascript'][] = 'js/jquery.min.js'; + * // $config['additional_javascript'][] = 'js/jquery.min.js'; * $config['additional_javascript'][] = 'js/local-time.js'; * */ @@ -44,10 +44,12 @@ onready(function(){ }; do_localtime(document); - - // allow to work with auto-reload.js, etc. - $(document).bind('new_post', function(e, post) { - do_localtime(post); - }); + + if (window.jQuery) { + // allow to work with auto-reload.js, etc. + $(document).bind('new_post', function(e, post) { + do_localtime(post); + }); + } }); @@ -380,10 +380,22 @@ if (isset($_POST['delete'])) { wordfilters($post['body']); - if (mysql_version() >= 50503) + if (mysql_version() >= 50503) { $post['body_nomarkup'] = $post['body']; // Assume we're using the utf8mb4 charset - else - $post['body_nomarkup'] = preg_replace('/[\x{010000}-\x{ffffff}]/u', '', $post['body']); // MySQL's `utf8` charset only supports up to 3-byte symbols + } else { + // MySQL's `utf8` charset only supports up to 3-byte symbols + // Remove anything >= 0x010000 + + $chars = preg_split('//u', $post['body'], -1, PREG_SPLIT_NO_EMPTY); + $post['body_nomarkup'] = ''; + foreach ($chars as $char) { + $o = 0; + $ord = ordutf8($char, $o); + if ($ord >= 0x010000) + continue; + $post['body_nomarkup'] .= $char; + } + } if (!($mod && isset($post['raw']) && $post['raw'])) $post['tracked_cites'] = markup($post['body'], true); diff --git a/templates/index.html b/templates/index.html index 451ca8b1..f01d6851 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,61 +1,61 @@ -<!doctype html>
-<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>
-<body>
- {{ boardlist.top }}
- {% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr />{% endif %}
- {% if config.url_banner %}<img class="banner" src="{{ config.url_banner }}" {% if config.banner_width or config.banner_height %}style="{% if config.banner_width %}width:{{ config.banner_width }}px{% endif %};{% if config.banner_width %}height:{{ config.banner_height }}px{% endif %}" {% endif %}alt="" />{% endif %}
- <header>
- <h1>{{ board.url }} - {{ board.title|e }}</h1>
- <div class="subtitle">
- {% if board.subtitle %}
- {{ board.subtitle|e }}
- {% endif %}
- {% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
- </div>
- </header>
-
- {% include 'attention_bar.html' %}
- {% if not no_post_form %}
- {% include 'post_form.html' %}
- {% else %}
- {% include 'boardlist.html' %}
- {% endif %}
-
- {% if config.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %}
- <hr />
- <form name="postcontrols" action="{{ config.post_url }}" method="post">
- <input type="hidden" name="board" value="{{ board.uri }}" />
- {% if mod %}<input type="hidden" name="mod" value="1" />{% endif %}
- {{ body }}
- {% include 'report_delete.html' %}
- </form>
- <div class="pages">{{ btn.prev }} {% for page in pages %}
- [<a {% if page.selected %}class="selected"{% endif %}{% if not page.selected %}href="{{ page.link }}"{% endif %}>{{ page.num }}</a>]{% if loop.last %} {% endif %}
- {% endfor %} {{ btn.next }}</div>
- {{ boardlist.bottom }}
- <footer>
- <p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2013 Tinyboard Development Group</p>
- {% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %}
- </footer>
- <script type="text/javascript">{% raw %}
- ready();
- {% endraw %}</script>
-</body>
-</html>
+<!doctype html> +<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> +<body> + {{ boardlist.top }} + {% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr />{% endif %} + {% if config.url_banner %}<img class="banner" src="{{ config.url_banner }}" {% if config.banner_width or config.banner_height %}style="{% if config.banner_width %}width:{{ config.banner_width }}px{% endif %};{% if config.banner_width %}height:{{ config.banner_height }}px{% endif %}" {% endif %}alt="" />{% endif %} + <header> + <h1>{{ board.url }} - {{ board.title|e }}</h1> + <div class="subtitle"> + {% if board.subtitle %} + {{ board.subtitle|e }} + {% endif %} + {% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %} + </div> + </header> + + {% include 'attention_bar.html' %} + {% if not no_post_form %} + {% include 'post_form.html' %} + {% else %} + {% include 'boardlist.html' %} + {% endif %} + + {% if config.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %} + <hr /> + <form name="postcontrols" action="{{ config.post_url }}" method="post"> + <input type="hidden" name="board" value="{{ board.uri }}" /> + {% if mod %}<input type="hidden" name="mod" value="1" />{% endif %} + {{ body }} + {% include 'report_delete.html' %} + </form> + <div class="pages">{{ btn.prev }} {% for page in pages %} + [<a {% if page.selected %}class="selected"{% endif %}{% if not page.selected %}href="{{ page.link }}"{% endif %}>{{ page.num }}</a>]{% if loop.last %} {% endif %} + {% endfor %} {{ btn.next }}</div> + {{ boardlist.bottom }} + <footer> + <p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2013 Tinyboard Development Group</p> + {% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %} + </footer> + <script type="text/javascript">{% raw %} + ready(); + {% endraw %}</script> +</body> +</html> diff --git a/templates/main.js b/templates/main.js index 401d3504..71dcd92a 100644 --- a/templates/main.js +++ b/templates/main.js @@ -1,38 +1,38 @@ -{% raw %}
-
-/* gettext-compatible _ function, example of usage:
- *
- * > // Loading pl_PL.json here (containing polish translation strings generated by tools/i18n_compile.php)
- * > alert(_("Hello!"));
- * Witaj!
- */
-function _(s) {
- return (typeof l10n != 'undefined' && typeof l10n[s] != 'undefined') ? l10n[s] : s;
-}
-
-/* printf-like formatting function, example of usage:
- *
- * > alert(fmt("There are {0} birds on {1} trees", [3,4]));
- * There are 3 birds on 4 trees
- * > // Loading pl_PL.json here (containing polish translation strings generated by tools/locale_compile.php)
- * > alert(fmt(_("{0} users"), [3]));
- * 3 uzytkownikow
- */
-function fmt(s,a) {
- return s.replace(/\{([0-9]+)\}/g, function(x) { return a[x[1]]; });
-}
-
-var saved = {};
-
-
-var selectedstyle = '{% endraw %}{{ config.default_stylesheet.0|addslashes }}{% raw %}';
-var styles = {
- {% endraw %}
- {% for stylesheet in stylesheets %}{% raw %}'{% endraw %}{{ stylesheet.name|addslashes }}{% raw %}' : '{% endraw %}{{ stylesheet.uri|addslashes }}{% raw %}',
- {% endraw %}{% endfor %}{% raw %}
-};
+{% raw %} + +/* gettext-compatible _ function, example of usage: + * + * > // Loading pl_PL.json here (containing polish translation strings generated by tools/i18n_compile.php) + * > alert(_("Hello!")); + * Witaj! + */ +function _(s) { + return (typeof l10n != 'undefined' && typeof l10n[s] != 'undefined') ? l10n[s] : s; +} + +/* printf-like formatting function, example of usage: + * + * > alert(fmt("There are {0} birds on {1} trees", [3,4])); + * There are 3 birds on 4 trees + * > // Loading pl_PL.json here (containing polish translation strings generated by tools/locale_compile.php) + * > alert(fmt(_("{0} users"), [3])); + * 3 uzytkownikow + */ +function fmt(s,a) { + return s.replace(/\{([0-9]+)\}/g, function(x) { return a[x[1]]; }); +} + +var saved = {}; + + +var selectedstyle = '{% endraw %}{{ config.default_stylesheet.0|addslashes }}{% raw %}'; +var styles = { + {% endraw %} + {% for stylesheet in stylesheets %}{% raw %}'{% endraw %}{{ stylesheet.name|addslashes }}{% raw %}' : '{% endraw %}{{ stylesheet.uri|addslashes }}{% raw %}', + {% endraw %}{% endfor %}{% raw %} +}; var board_name = false; -
+ function changeStyle(styleName, link) { {% endraw %} {% if config.stylesheets_board %}{% raw %} @@ -43,31 +43,31 @@ function changeStyle(styleName, link) { {% endraw %}{% else %} localStorage.stylesheet = styleName; {% endif %} - {% raw %}
-
- if (!document.getElementById('stylesheet')) {
- var s = document.createElement('link');
- s.rel = 'stylesheet';
- s.type = 'text/css';
- s.id = 'stylesheet';
- var x = document.getElementsByTagName('head')[0];
- x.appendChild(s);
- }
-
- document.getElementById('stylesheet').href = styles[styleName];
- selectedstyle = styleName;
-
- if (document.getElementsByClassName('styles').length != 0) {
- var styleLinks = document.getElementsByClassName('styles')[0].childNodes;
- for (var i = 0; i < styleLinks.length; i++) {
- styleLinks[i].className = '';
- }
- }
-
- if (link) {
- link.className = 'selected';
- }
-}
+ {% raw %} + + if (!document.getElementById('stylesheet')) { + var s = document.createElement('link'); + s.rel = 'stylesheet'; + s.type = 'text/css'; + s.id = 'stylesheet'; + var x = document.getElementsByTagName('head')[0]; + x.appendChild(s); + } + + document.getElementById('stylesheet').href = styles[styleName]; + selectedstyle = styleName; + + if (document.getElementsByClassName('styles').length != 0) { + var styleLinks = document.getElementsByClassName('styles')[0].childNodes; + for (var i = 0; i < styleLinks.length; i++) { + styleLinks[i].className = ''; + } + } + + if (link) { + link.className = 'selected'; + } +} {% endraw %} @@ -95,177 +95,177 @@ function changeStyle(styleName, link) { {% endraw%} {% else %} {% raw %} - if (localStorage.stylesheet) {
- for (var styleName in styles) {
- if (styleName == localStorage.stylesheet) {
- changeStyle(styleName);
- break;
- }
- }
+ if (localStorage.stylesheet) { + for (var styleName in styles) { + if (styleName == localStorage.stylesheet) { + changeStyle(styleName); + break; + } + } } - {% endraw %}
+ {% endraw %} {% endif %} {% raw %} -
-function init_stylechooser() {
- var newElement = document.createElement('div');
- newElement.className = 'styles';
-
- for (styleName in styles) {
- var style = document.createElement('a');
- style.innerHTML = '[' + styleName + ']';
- style.onclick = function() {
- changeStyle(this.innerHTML.substring(1, this.innerHTML.length - 1), this);
- };
- if (styleName == selectedstyle) {
- style.className = 'selected';
- }
- style.href = 'javascript:void(0);';
- newElement.appendChild(style);
- }
-
- document.getElementsByTagName('body')[0].insertBefore(newElement, document.getElementsByTagName('body')[0].lastChild.nextSibling);
-}
-
-function get_cookie(cookie_name) {
- var results = document.cookie.match ( '(^|;) ?' + cookie_name + '=([^;]*)(;|$)');
- if (results)
- return (unescape(results[2]));
- else
- return null;
-}
-
-function highlightReply(id) {
- if (typeof window.event != "undefined" && event.which == 2) {
- // don't highlight on middle click
- return true;
- }
-
- var divs = document.getElementsByTagName('div');
- for (var i = 0; i < divs.length; i++)
- {
- if (divs[i].className.indexOf('post') != -1)
- divs[i].className = divs[i].className.replace(/highlighted/, '');
- }
- if (id) {
- var post = document.getElementById('reply_'+id);
- if (post)
- post.className += ' highlighted';
- }
-}
-
-function generatePassword() {
- var pass = '';
- var chars = '{% endraw %}{{ config.genpassword_chars }}{% raw %}';
- for (var i = 0; i < 8; i++) {
- var rnd = Math.floor(Math.random() * chars.length);
- pass += chars.substring(rnd, rnd + 1);
- }
- return pass;
-}
-
-function dopost(form) {
- if (form.elements['name']) {
- localStorage.name = form.elements['name'].value.replace(/( |^)## .+$/, '');
- }
- if (form.elements['email'] && form.elements['email'].value != 'sage') {
- localStorage.email = form.elements['email'].value;
- }
-
- saved[document.location] = form.elements['body'].value;
- sessionStorage.body = JSON.stringify(saved);
-
- return form.elements['body'].value != "" || form.elements['file'].value != "";
-}
-
-function citeReply(id) {
- var body = document.getElementById('body');
-
- if (document.selection) {
- // IE
- body.focus();
- var sel = document.selection.createRange();
- sel.text = '>>' + id + '\n';
- } else if (body.selectionStart || body.selectionStart == '0') {
- // Mozilla
- var start = body.selectionStart;
- var end = body.selectionEnd;
- body.value = body.value.substring(0, start) + '>>' + id + '\n' + body.value.substring(end, body.value.length);
- } else {
- // ???
- body.value += '>>' + id + '\n';
- }
-}
-
-function rememberStuff() {
- if (document.forms.post) {
- if (document.forms.post.password) {
- if (!localStorage.password)
- localStorage.password = generatePassword();
- document.forms.post.password.value = localStorage.password;
- }
-
- if (localStorage.name && document.forms.post.elements['name'])
- document.forms.post.elements['name'].value = localStorage.name;
- if (localStorage.email && document.forms.post.elements['email'])
- document.forms.post.elements['email'].value = localStorage.email;
-
- if (window.location.hash.indexOf('q') == 1)
- citeReply(window.location.hash.substring(2));
-
- if (sessionStorage.body) {
- var saved = JSON.parse(sessionStorage.body);
- if (get_cookie('{% endraw %}{{ config.cookies.js }}{% raw %}')) {
- // Remove successful posts
- var successful = JSON.parse(get_cookie('{% endraw %}{{ config.cookies.js }}{% raw %}'));
- for (var url in successful) {
- saved[url] = null;
- }
- sessionStorage.body = JSON.stringify(saved);
-
- document.cookie = '{% endraw %}{{ config.cookies.js }}{% raw %}={};expires=0;path=/;';
- }
- if (saved[document.location]) {
- document.forms.post.body.value = saved[document.location];
- }
- }
-
- if (localStorage.body) {
- document.forms.post.body.value = localStorage.body;
- localStorage.body = '';
- }
- }
-}
-
-function init() {
- init_stylechooser();
-
- if (document.forms.postcontrols) {
- document.forms.postcontrols.password.value = localStorage.password;
- }
-
- if (window.location.hash.indexOf('q') != 1 && window.location.hash.substring(1))
- highlightReply(window.location.hash.substring(1));
-}
-
-var RecaptchaOptions = {
- theme : 'clean'
-};
-
-onready_callbacks = [];
-function onready(fnc) {
- onready_callbacks.push(fnc);
-}
-
-function ready() {
- for (var i = 0; i < onready_callbacks.length; i++) {
- onready_callbacks[i]();
- }
-}
-
-onready(init);
-
-{% endraw %}{% if config.google_analytics %}{% raw %}
-
-var _gaq = _gaq || [];_gaq.push(['_setAccount', '{% endraw %}{{ config.google_analytics }}{% raw %}']);{% endraw %}{% if config.google_analytics_domain %}{% raw %}_gaq.push(['_setDomainName', '{% endraw %}{{ config.google_analytics_domain }}{% raw %}']){% endraw %}{% endif %}{% if not config.google_analytics_domain %}{% raw %}_gaq.push(['_setDomainName', 'none']){% endraw %}{% endif %}{% raw %};_gaq.push(['_trackPageview']);(function() {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();{% endraw %}{% endif %}
-
+ +function init_stylechooser() { + var newElement = document.createElement('div'); + newElement.className = 'styles'; + + for (styleName in styles) { + var style = document.createElement('a'); + style.innerHTML = '[' + styleName + ']'; + style.onclick = function() { + changeStyle(this.innerHTML.substring(1, this.innerHTML.length - 1), this); + }; + if (styleName == selectedstyle) { + style.className = 'selected'; + } + style.href = 'javascript:void(0);'; + newElement.appendChild(style); + } + + document.getElementsByTagName('body')[0].insertBefore(newElement, document.getElementsByTagName('body')[0].lastChild.nextSibling); +} + +function get_cookie(cookie_name) { + var results = document.cookie.match ( '(^|;) ?' + cookie_name + '=([^;]*)(;|$)'); + if (results) + return (unescape(results[2])); + else + return null; +} + +function highlightReply(id) { + if (typeof window.event != "undefined" && event.which == 2) { + // don't highlight on middle click + return true; + } + + var divs = document.getElementsByTagName('div'); + for (var i = 0; i < divs.length; i++) + { + if (divs[i].className.indexOf('post') != -1) + divs[i].className = divs[i].className.replace(/highlighted/, ''); + } + if (id) { + var post = document.getElementById('reply_'+id); + if (post) + post.className += ' highlighted'; + } +} + +function generatePassword() { + var pass = ''; + var chars = '{% endraw %}{{ config.genpassword_chars }}{% raw %}'; + for (var i = 0; i < 8; i++) { + var rnd = Math.floor(Math.random() * chars.length); + pass += chars.substring(rnd, rnd + 1); + } + return pass; +} + +function dopost(form) { + if (form.elements['name']) { + localStorage.name = form.elements['name'].value.replace(/( |^)## .+$/, ''); + } + if (form.elements['email'] && form.elements['email'].value != 'sage') { + localStorage.email = form.elements['email'].value; + } + + saved[document.location] = form.elements['body'].value; + sessionStorage.body = JSON.stringify(saved); + + return form.elements['body'].value != "" || form.elements['file'].value != ""; +} + +function citeReply(id) { + var body = document.getElementById('body'); + + if (document.selection) { + // IE + body.focus(); + var sel = document.selection.createRange(); + sel.text = '>>' + id + '\n'; + } else if (body.selectionStart || body.selectionStart == '0') { + // Mozilla + var start = body.selectionStart; + var end = body.selectionEnd; + body.value = body.value.substring(0, start) + '>>' + id + '\n' + body.value.substring(end, body.value.length); + } else { + // ??? + body.value += '>>' + id + '\n'; + } +} + +function rememberStuff() { + if (document.forms.post) { + if (document.forms.post.password) { + if (!localStorage.password) + localStorage.password = generatePassword(); + document.forms.post.password.value = localStorage.password; + } + + if (localStorage.name && document.forms.post.elements['name']) + document.forms.post.elements['name'].value = localStorage.name; + if (localStorage.email && document.forms.post.elements['email']) + document.forms.post.elements['email'].value = localStorage.email; + + if (window.location.hash.indexOf('q') == 1) + citeReply(window.location.hash.substring(2)); + + if (sessionStorage.body) { + var saved = JSON.parse(sessionStorage.body); + if (get_cookie('{% endraw %}{{ config.cookies.js }}{% raw %}')) { + // Remove successful posts + var successful = JSON.parse(get_cookie('{% endraw %}{{ config.cookies.js }}{% raw %}')); + for (var url in successful) { + saved[url] = null; + } + sessionStorage.body = JSON.stringify(saved); + + document.cookie = '{% endraw %}{{ config.cookies.js }}{% raw %}={};expires=0;path=/;'; + } + if (saved[document.location]) { + document.forms.post.body.value = saved[document.location]; + } + } + + if (localStorage.body) { + document.forms.post.body.value = localStorage.body; + localStorage.body = ''; + } + } +} + +function init() { + init_stylechooser(); + + if (document.forms.postcontrols) { + document.forms.postcontrols.password.value = localStorage.password; + } + + if (window.location.hash.indexOf('q') != 1 && window.location.hash.substring(1)) + highlightReply(window.location.hash.substring(1)); +} + +var RecaptchaOptions = { + theme : 'clean' +}; + +onready_callbacks = []; +function onready(fnc) { + onready_callbacks.push(fnc); +} + +function ready() { + for (var i = 0; i < onready_callbacks.length; i++) { + onready_callbacks[i](); + } +} + +onready(init); + +{% endraw %}{% if config.google_analytics %}{% raw %} + +var _gaq = _gaq || [];_gaq.push(['_setAccount', '{% endraw %}{{ config.google_analytics }}{% raw %}']);{% endraw %}{% if config.google_analytics_domain %}{% raw %}_gaq.push(['_setDomainName', '{% endraw %}{{ config.google_analytics_domain }}{% raw %}']){% endraw %}{% endif %}{% if not config.google_analytics_domain %}{% raw %}_gaq.push(['_setDomainName', 'none']){% endraw %}{% endif %}{% raw %};_gaq.push(['_trackPageview']);(function() {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();{% endraw %}{% endif %} + diff --git a/templates/mod/login.html b/templates/mod/login.html index 43a28d56..476897a6 100644 --- a/templates/mod/login.html +++ b/templates/mod/login.html @@ -1,26 +1,26 @@ -{% if error %}<h2 style="text-align:center">{{ error }}</h2>{% endif %}
-<form action="" method="post">
-<table style="margin-top:25px;">
- <tr>
- <th>
- {% trans 'Username' %}
- </th>
- <td>
- <input type="text" name="username" size="20" maxlength="30" value="{{ username|e }}">
- </td>
- </tr>
- <tr>
- <th>
- {% trans 'Password' %}
- </th>
- <td>
- <input type="password" name="password" size="20" maxlength="30" value="">
- </td>
- </tr>
- <tr>
- <td></td>
- <td>
- <input type="submit" name="login" value="{% trans %}Continue{% endtrans %}" />
- </td>
-</table>
-</form>
+{% if error %}<h2 style="text-align:center">{{ error }}</h2>{% endif %} +<form action="" method="post"> +<table style="margin-top:25px;"> + <tr> + <th> + {% trans 'Username' %} + </th> + <td> + <input type="text" name="username" size="20" maxlength="30" value="{{ username|e }}"> + </td> + </tr> + <tr> + <th> + {% trans 'Password' %} + </th> + <td> + <input type="password" name="password" size="20" maxlength="30" value=""> + </td> + </tr> + <tr> + <td></td> + <td> + <input type="submit" name="login" value="{% trans %}Continue{% endtrans %}" /> + </td> +</table> +</form> diff --git a/templates/page.html b/templates/page.html index 07eea62e..a7c6a300 100644 --- a/templates/page.html +++ b/templates/page.html @@ -1,25 +1,25 @@ -<!doctype html>
-<html>
-<head>
- <meta charset="utf-8">
- {% include 'header.html' %}
- <title>{{ title }}</title>
-</head>
-<body>
- {% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr>{% endif %}
- <header>
- <h1>{{ title }}</h1>
- <div class="subtitle">
- {% if subtitle %}
- {{ subtitle }}
- {% endif %}
- {% if mod and not hide_dashboard_link %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
- </div>
- </header>
- {{ body }}
- <hr>
- <footer>
- <p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2013 Tinyboard Development Group</p>
- </footer>
-</body>
-</html>
+<!doctype html> +<html> +<head> + <meta charset="utf-8"> + {% include 'header.html' %} + <title>{{ title }}</title> +</head> +<body> + {% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr>{% endif %} + <header> + <h1>{{ title }}</h1> + <div class="subtitle"> + {% if subtitle %} + {{ subtitle }} + {% endif %} + {% if mod and not hide_dashboard_link %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %} + </div> + </header> + {{ body }} + <hr> + <footer> + <p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2013 Tinyboard Development Group</p> + </footer> +</body> +</html> diff --git a/templates/post_reply.html b/templates/post_reply.html index 450f8246..bc96e74c 100644 --- a/templates/post_reply.html +++ b/templates/post_reply.html @@ -1,111 +1,111 @@ -{% filter remove_whitespace %}
-{# tabs and new lines will be ignored #}
-<div class="post reply" id="reply_{{ post.id }}">
-
-<p class="intro"{% if not index %} id="{{ post.id }}"{% endif %}>
- <input type="checkbox" class="delete" name="delete_{{ post.id }}" id="delete_{{ post.id }}" />
- <label for="delete_{{ post.id }}">
- {% if post.subject|length > 0 %}
- {# show subject #}
- <span class="subject">{{ post.subject|bidi_cleanup }}</span>
- {% endif %}
- {% if post.email|length > 0 %}
- {# start email #}
- <a class="email" href="mailto:{{ post.email }}">
- {% endif %}
- {% set capcode = post.capcode|capcode %}
- <span {% if capcode.name %}style="{{ capcode.name }}" {% endif %}class="name">{{ post.name|bidi_cleanup }}</span>
- {% if post.trip|length > 0 %}
- <span {% if capcode.trip %}style="{{ capcode.trip }}" {% endif %}class="trip">{{ post.trip }}</span>
- {% endif %}
- {% if post.email|length > 0 %}
- {# end email #}
- </a>
- {% endif %}
- {% if capcode %}
- {{ capcode.cap }}
- {% endif %}
- {% if post.mod and post.mod|hasPermission(config.mod.show_ip, board.uri) %}
- [<a style="margin:0;" href="?/IP/{{ post.ip }}">{{ post.ip }}</a>]
- {% endif %}
- <time datetime="{{ post.time|date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}">{{ post.time|date(config.post_date) }}</time>
- </label>
- {% if config.poster_ids %}
- ID: {{ post.ip|poster_id(post.thread) }}
- {% endif %}
- <a class="post_no" {% if not index %}onclick="highlightReply({{ post.id }})" {% endif %}href="{{ post.link }}">No.</a>
- <a class="post_no"
- {% if not index %}
- onclick="citeReply({{ post.id }});"
- {% endif %}
- href="{% if index %}
- {{ post.link('q') }}
- {% else %}
- javascript:void(0);
- {% endif %}">
- {{ post.id }}
- </a>
- </p>
- {% if post.embed %}
- {{ post.embed }}
- {% elseif post.file == 'deleted' %}
- <img src="{{ config.image_deleted }}" alt="" />
- {% elseif post.file and post.file %}
- <p class="fileinfo">File: <a href="{{ config.uri_img }}{{ post.file }}">{{ post.file }}</a> <span class="unimportant">
- (
- {% if post.thumb == 'spoiler' %}
- Spoiler Image,
- {% endif %}
- {{ post.filesize|filesize }}
- {% if post.filex and post.filey %}
- , {{ post.filex}}x{{ post.filey }}
- {% if config.show_ratio %}
- , {{ post.ratio }}
- {% endif %}
- {% endif %}
- {% if config.show_filename and post.filename %}
- ,
- {% if post.filename|length > config.max_filename_display %}
- <span class="postfilename" title="{{ post.filename|bidi_cleanup }}">{{ post.filename|truncate(config.max_filename_display)|bidi_cleanup }}</span>
- {% else %}
- <span class="postfilename">{{ post.filename|bidi_cleanup }}</span>
- {% endif %}
- {% endif %}
- {% if post.thumb != 'file' and config.image_identification %}
- ,
- <span class='image_id'>
- <a href="http://imgops.com/{{ config.domain }}{{ config.uri_img }}{{ post.file }}">io</a>
- {% if post.file|extension == 'jpg' %}
- <a href="http://regex.info/exif.cgi?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">e</a>
- {% endif %}
- <a href="http://www.google.com/searchbyimage?image_url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">g</a>
- <a href="http://www.tineye.com/search?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">t</a>
- </span>
- {% endif %}
-
- )
- </span>
-</p>
- <a href="{{ config.uri_img }}{{ post.file }}" target="_blank"{% if post.thumb == 'file' %} class="file"{% endif %}>
- <img src="
- {% if post.thumb == 'file' %}
- {{ config.root }}
- {% if config.file_icons[post.filename|extension] %}
- {{ config.file_thumb|sprintf(config.file_icons[post.filename|extension]) }}
- {% else %}
- {{ config.file_thumb|sprintf(config.file_icons.default) }}
- {% endif %}
- {% elseif post.thumb == 'spoiler' %}
- {{ config.root }}{{ config.spoiler_image }}
- {% else %}
- {{ config.uri_thumb }}{{ post.thumb }}
- {% endif %}" style="width:{{ post.thumbx }}px;height:{{ post.thumby }}px" alt="" />
- </a>
- {% endif %}
- {{ post.postControls }}
- <div class="body">
- {% endfilter %}{% if index %}{{ post.body|truncate_body(post.link) }}{% else %}{{ post.body }}{% endif %}{% filter remove_whitespace %}
- </div>
-</div>
-<br/>
-{% endfilter %}
+{% filter remove_whitespace %} +{# tabs and new lines will be ignored #} +<div class="post reply" id="reply_{{ post.id }}"> + +<p class="intro"{% if not index %} id="{{ post.id }}"{% endif %}> + <input type="checkbox" class="delete" name="delete_{{ post.id }}" id="delete_{{ post.id }}" /> + <label for="delete_{{ post.id }}"> + {% if post.subject|length > 0 %} + {# show subject #} + <span class="subject">{{ post.subject|bidi_cleanup }}</span> + {% endif %} + {% if post.email|length > 0 %} + {# start email #} + <a class="email" href="mailto:{{ post.email }}"> + {% endif %} + {% set capcode = post.capcode|capcode %} + <span {% if capcode.name %}style="{{ capcode.name }}" {% endif %}class="name">{{ post.name|bidi_cleanup }}</span> + {% if post.trip|length > 0 %} + <span {% if capcode.trip %}style="{{ capcode.trip }}" {% endif %}class="trip">{{ post.trip }}</span> + {% endif %} + {% if post.email|length > 0 %} + {# end email #} + </a> + {% endif %} + {% if capcode %} + {{ capcode.cap }} + {% endif %} + {% if post.mod and post.mod|hasPermission(config.mod.show_ip, board.uri) %} + [<a style="margin:0;" href="?/IP/{{ post.ip }}">{{ post.ip }}</a>] + {% endif %} + <time datetime="{{ post.time|date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}">{{ post.time|date(config.post_date) }}</time> + </label> + {% if config.poster_ids %} + ID: {{ post.ip|poster_id(post.thread) }} + {% endif %} + <a class="post_no" {% if not index %}onclick="highlightReply({{ post.id }})" {% endif %}href="{{ post.link }}">No.</a> + <a class="post_no" + {% if not index %} + onclick="citeReply({{ post.id }});" + {% endif %} + href="{% if index %} + {{ post.link('q') }} + {% else %} + javascript:void(0); + {% endif %}"> + {{ post.id }} + </a> + </p> + {% if post.embed %} + {{ post.embed }} + {% elseif post.file == 'deleted' %} + <img src="{{ config.image_deleted }}" alt="" /> + {% elseif post.file and post.file %} + <p class="fileinfo">File: <a href="{{ config.uri_img }}{{ post.file }}">{{ post.file }}</a> <span class="unimportant"> + ( + {% if post.thumb == 'spoiler' %} + Spoiler Image, + {% endif %} + {{ post.filesize|filesize }} + {% if post.filex and post.filey %} + , {{ post.filex}}x{{ post.filey }} + {% if config.show_ratio %} + , {{ post.ratio }} + {% endif %} + {% endif %} + {% if config.show_filename and post.filename %} + , + {% if post.filename|length > config.max_filename_display %} + <span class="postfilename" title="{{ post.filename|bidi_cleanup }}">{{ post.filename|truncate(config.max_filename_display)|bidi_cleanup }}</span> + {% else %} + <span class="postfilename">{{ post.filename|bidi_cleanup }}</span> + {% endif %} + {% endif %} + {% if post.thumb != 'file' and config.image_identification %} + , + <span class='image_id'> + <a href="http://imgops.com/{{ config.domain }}{{ config.uri_img }}{{ post.file }}">io</a> + {% if post.file|extension == 'jpg' %} + <a href="http://regex.info/exif.cgi?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">e</a> + {% endif %} + <a href="http://www.google.com/searchbyimage?image_url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">g</a> + <a href="http://www.tineye.com/search?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">t</a> + </span> + {% endif %} + + ) + </span> +</p> + <a href="{{ config.uri_img }}{{ post.file }}" target="_blank"{% if post.thumb == 'file' %} class="file"{% endif %}> + <img src=" + {% if post.thumb == 'file' %} + {{ config.root }} + {% if config.file_icons[post.filename|extension] %} + {{ config.file_thumb|sprintf(config.file_icons[post.filename|extension]) }} + {% else %} + {{ config.file_thumb|sprintf(config.file_icons.default) }} + {% endif %} + {% elseif post.thumb == 'spoiler' %} + {{ config.root }}{{ config.spoiler_image }} + {% else %} + {{ config.uri_thumb }}{{ post.thumb }} + {% endif %}" style="width:{{ post.thumbx }}px;height:{{ post.thumby }}px" alt="" /> + </a> + {% endif %} + {{ post.postControls }} + <div class="body"> + {% endfilter %}{% if index %}{{ post.body|truncate_body(post.link) }}{% else %}{{ post.body }}{% endif %}{% filter remove_whitespace %} + </div> +</div> +<br/> +{% endfilter %} diff --git a/templates/post_thread.html b/templates/post_thread.html index cbd37229..c8da07e3 100644 --- a/templates/post_thread.html +++ b/templates/post_thread.html @@ -99,27 +99,27 @@ {% endif %}"> {{ post.id }} </a> - {% if post.sticky %} - {% if config.font_awesome %} - <i class="icon-pushpin icon"></i> - {% else %} - <img class="icon" title="Sticky" src="{{ config.image_sticky }}" alt="Sticky" /> - {% endif %} - {% endif %} - {% if post.locked %} - {% if config.font_awesome %} - <i class="icon-lock icon"></i> - {% else %} - <img class="icon" title="Locked" src="{{ config.image_locked }}" alt="Locked" /> - {% endif %} - {% endif %} - {% if post.bumplocked and (config.mod.view_bumplock < 0 or (post.mod and post.mod|hasPermission(config.mod.view_bumplock, board.uri))) %} - {% if config.font_awesome %} - <i class="icon-anchor icon"></i> - {% else %} - <img class="icon" title="Bumplocked" src="{{ config.image_bumplocked }}" alt="Bumplocked" /> - {% endif %} - {% endif %} + {% if post.sticky %} + {% if config.font_awesome %} + <i class="icon-pushpin icon"></i> + {% else %} + <img class="icon" title="Sticky" src="{{ config.image_sticky }}" alt="Sticky" /> + {% endif %} + {% endif %} + {% if post.locked %} + {% if config.font_awesome %} + <i class="icon-lock icon"></i> + {% else %} + <img class="icon" title="Locked" src="{{ config.image_locked }}" alt="Locked" /> + {% endif %} + {% endif %} + {% if post.bumplocked and (config.mod.view_bumplock < 0 or (post.mod and post.mod|hasPermission(config.mod.view_bumplock, board.uri))) %} + {% if config.font_awesome %} + <i class="icon-anchor icon"></i> + {% else %} + <img class="icon" title="Bumplocked" src="{{ config.image_bumplocked }}" alt="Bumplocked" /> + {% endif %} + {% endif %} {% if index %} <a href="{{ post.root }}{{ board.dir }}{{ config.dir.res }}{{ config.file_page|sprintf(post.id) }}">[{% trans %}Reply{% endtrans %}]</a> {% endif %} diff --git a/templates/posts.sql b/templates/posts.sql index 0a1dc92a..698fad77 100644 --- a/templates/posts.sql +++ b/templates/posts.sql @@ -1,4 +1,4 @@ -CREATE TABLE IF NOT EXISTS `posts_{{ board }}` (
+CREATE TABLE IF NOT EXISTS `posts_{{ board }}` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `thread` int(11) DEFAULT NULL, `subject` varchar(100) DEFAULT NULL, diff --git a/templates/thread.html b/templates/thread.html index 1b217c2f..619480b4 100644 --- a/templates/thread.html +++ b/templates/thread.html @@ -1,51 +1,51 @@ -<!doctype html>
-<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>
-<body>
- {{ boardlist.top }}
- {% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr />{% endif %}
- {% if config.url_banner %}<img class="banner" src="{{ config.url_banner }}" {% if config.banner_width or config.banner_height %}style="{% if config.banner_width %}width:{{ config.banner_width }}px{% endif %};{% if config.banner_width %}height:{{ config.banner_height }}px{% endif %}" {% endif %}alt="" />{% endif %}
- <header>
- <h1>{{ board.url }} - {{ board.title|e }}</h1>
- <div class="subtitle">
- {% if board.subtitle %}
- {{ board.subtitle|e }}
- {% endif %}
- {% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
- </div>
- </header>
-
- <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.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %}
- <hr />
- <form name="postcontrols" action="{{ config.post_url }}" method="post">
- <input type="hidden" name="board" value="{{ board.uri }}" />
- {% if mod %}<input type="hidden" name="mod" value="1" />{% endif %}
- {{ body }}
- {% include 'report_delete.html' %}
- </form>
- <a href="{{ return }}">[{% trans %}Return{% endtrans %}]</a>
-
- {{ boardlist.bottom }}
- <footer>
- <p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2013 Tinyboard Development Group</p>
- {% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %}
- </footer>
- <script type="text/javascript">{% raw %}
- ready();
- {% endraw %}</script>
-</body>
-</html>
+<!doctype html> +<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> +<body> + {{ boardlist.top }} + {% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr />{% endif %} + {% if config.url_banner %}<img class="banner" src="{{ config.url_banner }}" {% if config.banner_width or config.banner_height %}style="{% if config.banner_width %}width:{{ config.banner_width }}px{% endif %};{% if config.banner_width %}height:{{ config.banner_height }}px{% endif %}" {% endif %}alt="" />{% endif %} + <header> + <h1>{{ board.url }} - {{ board.title|e }}</h1> + <div class="subtitle"> + {% if board.subtitle %} + {{ board.subtitle|e }} + {% endif %} + {% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %} + </div> + </header> + + <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.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %} + <hr /> + <form name="postcontrols" action="{{ config.post_url }}" method="post"> + <input type="hidden" name="board" value="{{ board.uri }}" /> + {% if mod %}<input type="hidden" name="mod" value="1" />{% endif %} + {{ body }} + {% include 'report_delete.html' %} + </form> + <a href="{{ return }}">[{% trans %}Return{% endtrans %}]</a> + + {{ boardlist.bottom }} + <footer> + <p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2013 Tinyboard Development Group</p> + {% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %} + </footer> + <script type="text/javascript">{% raw %} + ready(); + {% endraw %}</script> +</body> +</html> |
