1
0
mirror of https://github.com/vichan-devel/vichan.git synced 2024-11-24 07:30:10 +01:00
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
This commit is contained in:
czaks 2013-07-31 14:54:20 -04:00
commit 55c7146d88
18 changed files with 668 additions and 623 deletions

View File

@ -335,9 +335,14 @@
$config['auto_unicode'] = true; $config['auto_unicode'] = true;
// Whether to turn URLs into functional links // Whether to turn URLs into functional links
$config['markup_urls'] = true; $config['markup_urls'] = true;
// Prefix those functional links with some other url, for example some service for hiding referers // 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. // (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. // Wordfilters are used to automatically replace certain words/phrases with something else.
// For a normal string replacement: // For a normal string replacement:
@ -486,7 +491,7 @@
// Display the file's original filename // Display the file's original filename
$config['show_filename']= true; $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; $config['image_identification'] = false;
// Redraw the image using GD functions to strip any excess data (commonly ZIP archives) // 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'; $config['ban_date'] = '%A %e %B, %Y';
// 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 "Post")
$config['button_newtopic'] = 'New Topic'; $config['button_newtopic'] = _('New Topic');
$config['button_reply'] = 'New Reply'; $config['button_reply'] = _('New Reply');
// Assign each poster in a thread a unique ID, shown by "ID: {id}" before the post number. // Assign each poster in a thread a unique ID, shown by "ID: {id}" before the post number.
$config['poster_ids'] = false; $config['poster_ids'] = false;
@ -554,7 +559,7 @@
$config['thread_subject_in_title'] = false; $config['thread_subject_in_title'] = false;
// Page footer // 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) // Characters used to generate a random password (with Javascript)
$config['genpassword_chars'] = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+'; $config['genpassword_chars'] = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+';
@ -764,9 +769,9 @@
else else
$config['root'] = '/'; // CLI mode $config['root'] = '/'; // CLI mode
// The scheme and domain. This is needed to get absolute URL of some page (for instance image // The scheme and domain. This is used to get the site's absolute URL (eg. for image identification links).
// identification buttons). If you use the CLI tools, it would be wise to override this setting. // 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['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? "https://" : "http://";
$config['domain'] .= isset ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost'; $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, // If for some reason the folders and static HTML index files aren't in the current working direcotry,

View File

@ -25,6 +25,7 @@ function doBoardListPart($list, $root) {
$body = ''; $body = '';
foreach ($list as $board) { foreach ($list as $board) {
if (is_array($board)) if (is_array($board))
// $body .= ' [' . doBoardListPart($board, $root) . '] ';
$body .= ' <span class="sub">[' . doBoardListPart($board, $root) . ']</span> '; $body .= ' <span class="sub">[' . doBoardListPart($board, $root) . ']</span> ';
else { else {
if (($key = array_search($board, $list)) && gettype($key) == 'string') { if (($key = array_search($board, $list)) && gettype($key) == 'string') {

View File

@ -1311,6 +1311,13 @@ function buildJavascript() {
'config' => $config, 'config' => $config,
'stylesheets' => $stylesheets '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']) { if ($config['additional_javascript_compile']) {
foreach ($config['additional_javascript'] as $file) { foreach ($config['additional_javascript'] as $file) {
$script .= file_get_contents($file); $script .= file_get_contents($file);
@ -1415,7 +1422,7 @@ function markup_url($matches) {
$markup_urls[] = $url; $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) { function unicodify($body) {

View File

@ -81,9 +81,7 @@ class Image {
$height = $max_height; $height = $max_height;
} }
if ($gifsicle) { $thumb->gifsicle = $gifsicle;
$thumb->gifsicle = 1;
}
$thumb->_resize($this->image->image, $width, $height); $thumb->_resize($this->image->image, $width, $height);
return $thumb; return $thumb;
@ -288,8 +286,12 @@ class ImageConvert extends ImageBase {
if (shell_exec("gifsicle --unoptimize -O2 --resize {$this->width}x{$this->height} < " . if (shell_exec("gifsicle --unoptimize -O2 --resize {$this->width}x{$this->height} < " .
escapeshellarg($this->src . '') . " > " . escapeshellarg($this->temp)) || !file_exists($this->temp)) escapeshellarg($this->src . '') . " > " . escapeshellarg($this->temp)) || !file_exists($this->temp))
error('Failed to resize image!'); error('Failed to resize image!');
<<<<<<< HEAD
} }
else { else {
=======
} else {
>>>>>>> 8e4c493a4c5bbff07483fd4a11c44c687c99e441
if (shell_exec("convert -background transparent -filter Point -sample {$this->width}x{$this->height} +antialias -quality {$quality} " . 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)) escapeshellarg($this->src . '') . " " . escapeshellarg($this->temp)) || !file_exists($this->temp))
error('Failed to resize image!'); error('Failed to resize image!');

View File

@ -446,6 +446,23 @@ function mod_new_board() {
if (!preg_match('/^' . $config['board_regex'] . '$/u', $_POST['uri'])) if (!preg_match('/^' . $config['board_regex'] . '$/u', $_POST['uri']))
error(sprintf($config['error']['invalidfield'], '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'])) { if (openBoard($_POST['uri'])) {
error(sprintf($config['error']['boardexists'], $board['url'])); error(sprintf($config['error']['boardexists'], $board['url']));
} }

View File

@ -1,72 +1,72 @@
<?php <?php
/* /*
* Copyright (c) 2010-2013 Tinyboard Development Group * Copyright (c) 2010-2013 Tinyboard Development Group
*/ */
if (realpath($_SERVER['SCRIPT_FILENAME']) == str_replace('\\', '/', __FILE__)) { if (realpath($_SERVER['SCRIPT_FILENAME']) == str_replace('\\', '/', __FILE__)) {
// You cannot request this file directly. // You cannot request this file directly.
exit; exit;
} }
$twig = false; $twig = false;
function load_twig() { function load_twig() {
global $twig, $config; global $twig, $config;
require 'lib/Twig/Autoloader.php'; require 'lib/Twig/Autoloader.php';
Twig_Autoloader::register(); Twig_Autoloader::register();
Twig_Autoloader::autoload('Twig_Extensions_Node_Trans'); Twig_Autoloader::autoload('Twig_Extensions_Node_Trans');
Twig_Autoloader::autoload('Twig_Extensions_TokenParser_Trans'); Twig_Autoloader::autoload('Twig_Extensions_TokenParser_Trans');
Twig_Autoloader::autoload('Twig_Extensions_Extension_I18n'); Twig_Autoloader::autoload('Twig_Extensions_Extension_I18n');
Twig_Autoloader::autoload('Twig_Extensions_Extension_Tinyboard'); Twig_Autoloader::autoload('Twig_Extensions_Extension_Tinyboard');
$loader = new Twig_Loader_Filesystem($config['dir']['template']); $loader = new Twig_Loader_Filesystem($config['dir']['template']);
$loader->setPaths($config['dir']['template']); $loader->setPaths($config['dir']['template']);
$twig = new Twig_Environment($loader, array( $twig = new Twig_Environment($loader, array(
'autoescape' => false, 'autoescape' => false,
'cache' => "{$config['dir']['template']}/cache", 'cache' => "{$config['dir']['template']}/cache",
'debug' => $config['debug'] 'debug' => $config['debug']
)); ));
$twig->addExtension(new Twig_Extensions_Extension_Tinyboard()); $twig->addExtension(new Twig_Extensions_Extension_Tinyboard());
$twig->addExtension(new Twig_Extensions_Extension_I18n()); $twig->addExtension(new Twig_Extensions_Extension_I18n());
} }
function Element($templateFile, array $options) { function Element($templateFile, array $options) {
global $config, $debug, $twig; global $config, $debug, $twig;
if (!$twig) if (!$twig)
load_twig(); load_twig();
if (function_exists('create_pm_header') && ((isset($options['mod']) && $options['mod']) || isset($options['__mod'])) && !preg_match('!^mod/!', $templateFile)) { if (function_exists('create_pm_header') && ((isset($options['mod']) && $options['mod']) || isset($options['__mod'])) && !preg_match('!^mod/!', $templateFile)) {
$options['pm'] = create_pm_header(); $options['pm'] = create_pm_header();
} }
if (isset($options['body']) && $config['debug']) { if (isset($options['body']) && $config['debug']) {
if (isset($debug['start'])) { if (isset($debug['start'])) {
$debug['time'] = '~' . round((microtime(true) - $debug['start']) * 1000, 2) . 'ms'; $debug['time'] = '~' . round((microtime(true) - $debug['start']) * 1000, 2) . 'ms';
unset($debug['start']); unset($debug['start']);
} }
$debug['included'] = get_included_files(); $debug['included'] = get_included_files();
$debug['memory'] = round(memory_get_usage(true) / (1024 * 1024), 2) . ' MiB'; $debug['memory'] = round(memory_get_usage(true) / (1024 * 1024), 2) . ' MiB';
$options['body'] .= $options['body'] .=
'<h3>Debug</h3><pre style="white-space: pre-wrap;font-size: 10px;">' . '<h3>Debug</h3><pre style="white-space: pre-wrap;font-size: 10px;">' .
str_replace("\n", '<br/>', utf8tohtml(print_r($debug, true))) . str_replace("\n", '<br/>', utf8tohtml(print_r($debug, true))) .
'</pre>'; '</pre>';
} }
// Read the template file // Read the template file
if (@file_get_contents("{$config['dir']['template']}/${templateFile}")) { if (@file_get_contents("{$config['dir']['template']}/${templateFile}")) {
$body = $twig->render($templateFile, $options); $body = $twig->render($templateFile, $options);
if ($config['minify_html'] && preg_match('/\.html$/', $templateFile)) { if ($config['minify_html'] && preg_match('/\.html$/', $templateFile)) {
$body = trim(preg_replace("/[\t\r\n]/", '', $body)); $body = trim(preg_replace("/[\t\r\n]/", '', $body));
} }
return $body; return $body;
} else { } else {
throw new Exception("Template file '${templateFile}' does not exist or is empty in '{$config['dir']['template']}'!"); throw new Exception("Template file '${templateFile}' does not exist or is empty in '{$config['dir']['template']}'!");
} }
} }

View File

@ -14,7 +14,7 @@
$(document).ready(function(){ $(document).ready(function(){
if($('div.banner').length != 0) if($('div.banner').length != 0)
return; // not index return; // not index
var do_expand = function() { var do_expand = function() {
$(this) $(this)
.html($(this).text().replace(_("Click reply to view."), '<a href="javascript:void(0)">'+_("Click to expand")+'</a>.')) .html($(this).text().replace(_("Click reply to view."), '<a href="javascript:void(0)">'+_("Click to expand")+'</a>.'))

View File

@ -14,7 +14,7 @@
onready(function(){ onready(function(){
var inline_expand_post = function() { var inline_expand_post = function() {
var link = this.getElementsByTagName('a'); var link = this.getElementsByTagName('a');
for (var i = 0; i < link.length; i++) { 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') { 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%'; link[i].childNodes[0].style.maxWidth = '95%';
@ -54,7 +54,7 @@ onready(function(){
if (window.jQuery) { if (window.jQuery) {
$('div[id^="thread_"]').each(inline_expand_post); $('div[id^="thread_"]').each(inline_expand_post);
// allow to work with auto-reload.js, etc. // allow to work with auto-reload.js, etc.
$(document).bind('new_post', function(e, post) { $(document).bind('new_post', function(e, post) {
inline_expand_post.call(post); inline_expand_post.call(post);
@ -63,4 +63,3 @@ onready(function(){
inline_expand_post.call(document); inline_expand_post.call(document);
} }
}); });

View File

@ -6,7 +6,7 @@
* Copyright (c) 2012 Michael Save <savetheinternet@tinyboard.org> * Copyright (c) 2012 Michael Save <savetheinternet@tinyboard.org>
* *
* Usage: * Usage:
* $config['additional_javascript'][] = 'js/jquery.min.js'; * // $config['additional_javascript'][] = 'js/jquery.min.js';
* $config['additional_javascript'][] = 'js/local-time.js'; * $config['additional_javascript'][] = 'js/local-time.js';
* *
*/ */
@ -44,10 +44,12 @@ onready(function(){
}; };
do_localtime(document); do_localtime(document);
// allow to work with auto-reload.js, etc. if (window.jQuery) {
$(document).bind('new_post', function(e, post) { // allow to work with auto-reload.js, etc.
do_localtime(post); $(document).bind('new_post', function(e, post) {
}); do_localtime(post);
});
}
}); });

View File

@ -380,10 +380,22 @@ if (isset($_POST['delete'])) {
wordfilters($post['body']); wordfilters($post['body']);
if (mysql_version() >= 50503) if (mysql_version() >= 50503) {
$post['body_nomarkup'] = $post['body']; // Assume we're using the utf8mb4 charset $post['body_nomarkup'] = $post['body']; // Assume we're using the utf8mb4 charset
else } else {
$post['body_nomarkup'] = preg_replace('/[\x{010000}-\x{ffffff}]/u', '', $post['body']); // MySQL's `utf8` charset only supports up to 3-byte symbols // 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'])) if (!($mod && isset($post['raw']) && $post['raw']))
$post['tracked_cites'] = markup($post['body'], true); $post['tracked_cites'] = markup($post['body'], true);

View File

@ -1,61 +1,61 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<script type="text/javascript"> <script type="text/javascript">
{% if config.quick_reply %} {% if config.quick_reply %}
var new_reply_string = "{{ config.button_reply }}"; var new_reply_string = "{{ config.button_reply }}";
{% endif %} {% endif %}
{% if not no_post_form %} {% if not no_post_form %}
var active_page = "index"; var active_page = "index";
{% else %} {% else %}
var active_page = "ukko"; var active_page = "ukko";
{% endif %} {% endif %}
</script> </script>
{% include 'header.html' %} {% include 'header.html' %}
<title>{{ board.url }} - {{ board.title|e }}</title> <title>{{ board.url }} - {{ board.title|e }}</title>
</head> </head>
<body> <body>
{{ boardlist.top }} {{ 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 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 %} {% 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> <header>
<h1>{{ board.url }} - {{ board.title|e }}</h1> <h1>{{ board.url }} - {{ board.title|e }}</h1>
<div class="subtitle"> <div class="subtitle">
{% if board.subtitle %} {% if board.subtitle %}
{{ board.subtitle|e }} {{ board.subtitle|e }}
{% endif %} {% endif %}
{% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %} {% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
</div> </div>
</header> </header>
{% include 'attention_bar.html' %} {% include 'attention_bar.html' %}
{% if not no_post_form %} {% if not no_post_form %}
{% include 'post_form.html' %} {% include 'post_form.html' %}
{% else %} {% else %}
{% include 'boardlist.html' %} {% include 'boardlist.html' %}
{% endif %} {% endif %}
{% if config.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %} {% if config.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %}
<hr /> <hr />
<form name="postcontrols" action="{{ config.post_url }}" method="post"> <form name="postcontrols" action="{{ config.post_url }}" method="post">
<input type="hidden" name="board" value="{{ board.uri }}" /> <input type="hidden" name="board" value="{{ board.uri }}" />
{% if mod %}<input type="hidden" name="mod" value="1" />{% endif %} {% if mod %}<input type="hidden" name="mod" value="1" />{% endif %}
{{ body }} {{ body }}
{% include 'report_delete.html' %} {% include 'report_delete.html' %}
</form> </form>
<div class="pages">{{ btn.prev }} {% for page in pages %} <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 %} [<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> {% endfor %} {{ btn.next }}</div>
{{ boardlist.bottom }} {{ boardlist.bottom }}
<footer> <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 &copy; 2010-2013 Tinyboard Development Group</p> <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 &copy; 2010-2013 Tinyboard Development Group</p>
{% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %} {% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %}
</footer> </footer>
<script type="text/javascript">{% raw %} <script type="text/javascript">{% raw %}
ready(); ready();
{% endraw %}</script> {% endraw %}</script>
</body> </body>
</html> </html>

View File

@ -1,38 +1,38 @@
{% raw %} {% raw %}
/* gettext-compatible _ function, example of usage: /* gettext-compatible _ function, example of usage:
* *
* > // Loading pl_PL.json here (containing polish translation strings generated by tools/i18n_compile.php) * > // Loading pl_PL.json here (containing polish translation strings generated by tools/i18n_compile.php)
* > alert(_("Hello!")); * > alert(_("Hello!"));
* Witaj! * Witaj!
*/ */
function _(s) { function _(s) {
return (typeof l10n != 'undefined' && typeof l10n[s] != 'undefined') ? l10n[s] : s; return (typeof l10n != 'undefined' && typeof l10n[s] != 'undefined') ? l10n[s] : s;
} }
/* printf-like formatting function, example of usage: /* printf-like formatting function, example of usage:
* *
* > alert(fmt("There are {0} birds on {1} trees", [3,4])); * > alert(fmt("There are {0} birds on {1} trees", [3,4]));
* There are 3 birds on 4 trees * There are 3 birds on 4 trees
* > // Loading pl_PL.json here (containing polish translation strings generated by tools/locale_compile.php) * > // Loading pl_PL.json here (containing polish translation strings generated by tools/locale_compile.php)
* > alert(fmt(_("{0} users"), [3])); * > alert(fmt(_("{0} users"), [3]));
* 3 uzytkownikow * 3 uzytkownikow
*/ */
function fmt(s,a) { function fmt(s,a) {
return s.replace(/\{([0-9]+)\}/g, function(x) { return a[x[1]]; }); return s.replace(/\{([0-9]+)\}/g, function(x) { return a[x[1]]; });
} }
var saved = {}; var saved = {};
var selectedstyle = '{% endraw %}{{ config.default_stylesheet.0|addslashes }}{% raw %}'; var selectedstyle = '{% endraw %}{{ config.default_stylesheet.0|addslashes }}{% raw %}';
var styles = { var styles = {
{% endraw %} {% endraw %}
{% for stylesheet in stylesheets %}{% raw %}'{% endraw %}{{ stylesheet.name|addslashes }}{% raw %}' : '{% endraw %}{{ stylesheet.uri|addslashes }}{% raw %}', {% for stylesheet in stylesheets %}{% raw %}'{% endraw %}{{ stylesheet.name|addslashes }}{% raw %}' : '{% endraw %}{{ stylesheet.uri|addslashes }}{% raw %}',
{% endraw %}{% endfor %}{% raw %} {% endraw %}{% endfor %}{% raw %}
}; };
var board_name = false; var board_name = false;
function changeStyle(styleName, link) { function changeStyle(styleName, link) {
{% endraw %} {% endraw %}
{% if config.stylesheets_board %}{% raw %} {% if config.stylesheets_board %}{% raw %}
@ -43,31 +43,31 @@ function changeStyle(styleName, link) {
{% endraw %}{% else %} {% endraw %}{% else %}
localStorage.stylesheet = styleName; localStorage.stylesheet = styleName;
{% endif %} {% endif %}
{% raw %} {% raw %}
if (!document.getElementById('stylesheet')) { if (!document.getElementById('stylesheet')) {
var s = document.createElement('link'); var s = document.createElement('link');
s.rel = 'stylesheet'; s.rel = 'stylesheet';
s.type = 'text/css'; s.type = 'text/css';
s.id = 'stylesheet'; s.id = 'stylesheet';
var x = document.getElementsByTagName('head')[0]; var x = document.getElementsByTagName('head')[0];
x.appendChild(s); x.appendChild(s);
} }
document.getElementById('stylesheet').href = styles[styleName]; document.getElementById('stylesheet').href = styles[styleName];
selectedstyle = styleName; selectedstyle = styleName;
if (document.getElementsByClassName('styles').length != 0) { if (document.getElementsByClassName('styles').length != 0) {
var styleLinks = document.getElementsByClassName('styles')[0].childNodes; var styleLinks = document.getElementsByClassName('styles')[0].childNodes;
for (var i = 0; i < styleLinks.length; i++) { for (var i = 0; i < styleLinks.length; i++) {
styleLinks[i].className = ''; styleLinks[i].className = '';
} }
} }
if (link) { if (link) {
link.className = 'selected'; link.className = 'selected';
} }
} }
{% endraw %} {% endraw %}
@ -95,177 +95,177 @@ function changeStyle(styleName, link) {
{% endraw%} {% endraw%}
{% else %} {% else %}
{% raw %} {% raw %}
if (localStorage.stylesheet) { if (localStorage.stylesheet) {
for (var styleName in styles) { for (var styleName in styles) {
if (styleName == localStorage.stylesheet) { if (styleName == localStorage.stylesheet) {
changeStyle(styleName); changeStyle(styleName);
break; break;
} }
} }
} }
{% endraw %} {% endraw %}
{% endif %} {% endif %}
{% raw %} {% raw %}
function init_stylechooser() { function init_stylechooser() {
var newElement = document.createElement('div'); var newElement = document.createElement('div');
newElement.className = 'styles'; newElement.className = 'styles';
for (styleName in styles) { for (styleName in styles) {
var style = document.createElement('a'); var style = document.createElement('a');
style.innerHTML = '[' + styleName + ']'; style.innerHTML = '[' + styleName + ']';
style.onclick = function() { style.onclick = function() {
changeStyle(this.innerHTML.substring(1, this.innerHTML.length - 1), this); changeStyle(this.innerHTML.substring(1, this.innerHTML.length - 1), this);
}; };
if (styleName == selectedstyle) { if (styleName == selectedstyle) {
style.className = 'selected'; style.className = 'selected';
} }
style.href = 'javascript:void(0);'; style.href = 'javascript:void(0);';
newElement.appendChild(style); newElement.appendChild(style);
} }
document.getElementsByTagName('body')[0].insertBefore(newElement, document.getElementsByTagName('body')[0].lastChild.nextSibling); document.getElementsByTagName('body')[0].insertBefore(newElement, document.getElementsByTagName('body')[0].lastChild.nextSibling);
} }
function get_cookie(cookie_name) { function get_cookie(cookie_name) {
var results = document.cookie.match ( '(^|;) ?' + cookie_name + '=([^;]*)(;|$)'); var results = document.cookie.match ( '(^|;) ?' + cookie_name + '=([^;]*)(;|$)');
if (results) if (results)
return (unescape(results[2])); return (unescape(results[2]));
else else
return null; return null;
} }
function highlightReply(id) { function highlightReply(id) {
if (typeof window.event != "undefined" && event.which == 2) { if (typeof window.event != "undefined" && event.which == 2) {
// don't highlight on middle click // don't highlight on middle click
return true; return true;
} }
var divs = document.getElementsByTagName('div'); var divs = document.getElementsByTagName('div');
for (var i = 0; i < divs.length; i++) for (var i = 0; i < divs.length; i++)
{ {
if (divs[i].className.indexOf('post') != -1) if (divs[i].className.indexOf('post') != -1)
divs[i].className = divs[i].className.replace(/highlighted/, ''); divs[i].className = divs[i].className.replace(/highlighted/, '');
} }
if (id) { if (id) {
var post = document.getElementById('reply_'+id); var post = document.getElementById('reply_'+id);
if (post) if (post)
post.className += ' highlighted'; post.className += ' highlighted';
} }
} }
function generatePassword() { function generatePassword() {
var pass = ''; var pass = '';
var chars = '{% endraw %}{{ config.genpassword_chars }}{% raw %}'; var chars = '{% endraw %}{{ config.genpassword_chars }}{% raw %}';
for (var i = 0; i < 8; i++) { for (var i = 0; i < 8; i++) {
var rnd = Math.floor(Math.random() * chars.length); var rnd = Math.floor(Math.random() * chars.length);
pass += chars.substring(rnd, rnd + 1); pass += chars.substring(rnd, rnd + 1);
} }
return pass; return pass;
} }
function dopost(form) { function dopost(form) {
if (form.elements['name']) { if (form.elements['name']) {
localStorage.name = form.elements['name'].value.replace(/( |^)## .+$/, ''); localStorage.name = form.elements['name'].value.replace(/( |^)## .+$/, '');
} }
if (form.elements['email'] && form.elements['email'].value != 'sage') { if (form.elements['email'] && form.elements['email'].value != 'sage') {
localStorage.email = form.elements['email'].value; localStorage.email = form.elements['email'].value;
} }
saved[document.location] = form.elements['body'].value; saved[document.location] = form.elements['body'].value;
sessionStorage.body = JSON.stringify(saved); sessionStorage.body = JSON.stringify(saved);
return form.elements['body'].value != "" || form.elements['file'].value != ""; return form.elements['body'].value != "" || form.elements['file'].value != "";
} }
function citeReply(id) { function citeReply(id) {
var body = document.getElementById('body'); var body = document.getElementById('body');
if (document.selection) { if (document.selection) {
// IE // IE
body.focus(); body.focus();
var sel = document.selection.createRange(); var sel = document.selection.createRange();
sel.text = '>>' + id + '\n'; sel.text = '>>' + id + '\n';
} else if (body.selectionStart || body.selectionStart == '0') { } else if (body.selectionStart || body.selectionStart == '0') {
// Mozilla // Mozilla
var start = body.selectionStart; var start = body.selectionStart;
var end = body.selectionEnd; var end = body.selectionEnd;
body.value = body.value.substring(0, start) + '>>' + id + '\n' + body.value.substring(end, body.value.length); body.value = body.value.substring(0, start) + '>>' + id + '\n' + body.value.substring(end, body.value.length);
} else { } else {
// ??? // ???
body.value += '>>' + id + '\n'; body.value += '>>' + id + '\n';
} }
} }
function rememberStuff() { function rememberStuff() {
if (document.forms.post) { if (document.forms.post) {
if (document.forms.post.password) { if (document.forms.post.password) {
if (!localStorage.password) if (!localStorage.password)
localStorage.password = generatePassword(); localStorage.password = generatePassword();
document.forms.post.password.value = localStorage.password; document.forms.post.password.value = localStorage.password;
} }
if (localStorage.name && document.forms.post.elements['name']) if (localStorage.name && document.forms.post.elements['name'])
document.forms.post.elements['name'].value = localStorage.name; document.forms.post.elements['name'].value = localStorage.name;
if (localStorage.email && document.forms.post.elements['email']) if (localStorage.email && document.forms.post.elements['email'])
document.forms.post.elements['email'].value = localStorage.email; document.forms.post.elements['email'].value = localStorage.email;
if (window.location.hash.indexOf('q') == 1) if (window.location.hash.indexOf('q') == 1)
citeReply(window.location.hash.substring(2)); citeReply(window.location.hash.substring(2));
if (sessionStorage.body) { if (sessionStorage.body) {
var saved = JSON.parse(sessionStorage.body); var saved = JSON.parse(sessionStorage.body);
if (get_cookie('{% endraw %}{{ config.cookies.js }}{% raw %}')) { if (get_cookie('{% endraw %}{{ config.cookies.js }}{% raw %}')) {
// Remove successful posts // Remove successful posts
var successful = JSON.parse(get_cookie('{% endraw %}{{ config.cookies.js }}{% raw %}')); var successful = JSON.parse(get_cookie('{% endraw %}{{ config.cookies.js }}{% raw %}'));
for (var url in successful) { for (var url in successful) {
saved[url] = null; saved[url] = null;
} }
sessionStorage.body = JSON.stringify(saved); sessionStorage.body = JSON.stringify(saved);
document.cookie = '{% endraw %}{{ config.cookies.js }}{% raw %}={};expires=0;path=/;'; document.cookie = '{% endraw %}{{ config.cookies.js }}{% raw %}={};expires=0;path=/;';
} }
if (saved[document.location]) { if (saved[document.location]) {
document.forms.post.body.value = saved[document.location]; document.forms.post.body.value = saved[document.location];
} }
} }
if (localStorage.body) { if (localStorage.body) {
document.forms.post.body.value = localStorage.body; document.forms.post.body.value = localStorage.body;
localStorage.body = ''; localStorage.body = '';
} }
} }
} }
function init() { function init() {
init_stylechooser(); init_stylechooser();
if (document.forms.postcontrols) { if (document.forms.postcontrols) {
document.forms.postcontrols.password.value = localStorage.password; document.forms.postcontrols.password.value = localStorage.password;
} }
if (window.location.hash.indexOf('q') != 1 && window.location.hash.substring(1)) if (window.location.hash.indexOf('q') != 1 && window.location.hash.substring(1))
highlightReply(window.location.hash.substring(1)); highlightReply(window.location.hash.substring(1));
} }
var RecaptchaOptions = { var RecaptchaOptions = {
theme : 'clean' theme : 'clean'
}; };
onready_callbacks = []; onready_callbacks = [];
function onready(fnc) { function onready(fnc) {
onready_callbacks.push(fnc); onready_callbacks.push(fnc);
} }
function ready() { function ready() {
for (var i = 0; i < onready_callbacks.length; i++) { for (var i = 0; i < onready_callbacks.length; i++) {
onready_callbacks[i](); onready_callbacks[i]();
} }
} }
onready(init); onready(init);
{% endraw %}{% if config.google_analytics %}{% raw %} {% 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 %} 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 %}

View File

@ -1,26 +1,26 @@
{% if error %}<h2 style="text-align:center">{{ error }}</h2>{% endif %} {% if error %}<h2 style="text-align:center">{{ error }}</h2>{% endif %}
<form action="" method="post"> <form action="" method="post">
<table style="margin-top:25px;"> <table style="margin-top:25px;">
<tr> <tr>
<th> <th>
{% trans 'Username' %} {% trans 'Username' %}
</th> </th>
<td> <td>
<input type="text" name="username" size="20" maxlength="30" value="{{ username|e }}"> <input type="text" name="username" size="20" maxlength="30" value="{{ username|e }}">
</td> </td>
</tr> </tr>
<tr> <tr>
<th> <th>
{% trans 'Password' %} {% trans 'Password' %}
</th> </th>
<td> <td>
<input type="password" name="password" size="20" maxlength="30" value=""> <input type="password" name="password" size="20" maxlength="30" value="">
</td> </td>
</tr> </tr>
<tr> <tr>
<td></td> <td></td>
<td> <td>
<input type="submit" name="login" value="{% trans %}Continue{% endtrans %}" /> <input type="submit" name="login" value="{% trans %}Continue{% endtrans %}" />
</td> </td>
</table> </table>
</form> </form>

View File

@ -1,25 +1,25 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
{% include 'header.html' %} {% include 'header.html' %}
<title>{{ title }}</title> <title>{{ title }}</title>
</head> </head>
<body> <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 %} {% 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> <header>
<h1>{{ title }}</h1> <h1>{{ title }}</h1>
<div class="subtitle"> <div class="subtitle">
{% if subtitle %} {% if subtitle %}
{{ subtitle }} {{ subtitle }}
{% endif %} {% endif %}
{% if mod and not hide_dashboard_link %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %} {% if mod and not hide_dashboard_link %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
</div> </div>
</header> </header>
{{ body }} {{ body }}
<hr> <hr>
<footer> <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 &copy; 2010-2013 Tinyboard Development Group</p> <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 &copy; 2010-2013 Tinyboard Development Group</p>
</footer> </footer>
</body> </body>
</html> </html>

View File

@ -1,111 +1,111 @@
{% filter remove_whitespace %} {% filter remove_whitespace %}
{# tabs and new lines will be ignored #} {# tabs and new lines will be ignored #}
<div class="post reply" id="reply_{{ post.id }}"> <div class="post reply" id="reply_{{ post.id }}">
<p class="intro"{% if not index %} id="{{ post.id }}"{% endif %}> <p class="intro"{% if not index %} id="{{ post.id }}"{% endif %}>
<input type="checkbox" class="delete" name="delete_{{ post.id }}" id="delete_{{ post.id }}" /> <input type="checkbox" class="delete" name="delete_{{ post.id }}" id="delete_{{ post.id }}" />
<label for="delete_{{ post.id }}"> <label for="delete_{{ post.id }}">
{% if post.subject|length > 0 %} {% if post.subject|length > 0 %}
{# show subject #} {# show subject #}
<span class="subject">{{ post.subject|bidi_cleanup }}</span> <span class="subject">{{ post.subject|bidi_cleanup }}</span>
{% endif %} {% endif %}
{% if post.email|length > 0 %} {% if post.email|length > 0 %}
{# start email #} {# start email #}
<a class="email" href="mailto:{{ post.email }}"> <a class="email" href="mailto:{{ post.email }}">
{% endif %} {% endif %}
{% set capcode = post.capcode|capcode %} {% set capcode = post.capcode|capcode %}
<span {% if capcode.name %}style="{{ capcode.name }}" {% endif %}class="name">{{ post.name|bidi_cleanup }}</span> <span {% if capcode.name %}style="{{ capcode.name }}" {% endif %}class="name">{{ post.name|bidi_cleanup }}</span>
{% if post.trip|length > 0 %} {% if post.trip|length > 0 %}
<span {% if capcode.trip %}style="{{ capcode.trip }}" {% endif %}class="trip">{{ post.trip }}</span> <span {% if capcode.trip %}style="{{ capcode.trip }}" {% endif %}class="trip">{{ post.trip }}</span>
{% endif %} {% endif %}
{% if post.email|length > 0 %} {% if post.email|length > 0 %}
{# end email #} {# end email #}
</a> </a>
{% endif %} {% endif %}
{% if capcode %} {% if capcode %}
{{ capcode.cap }} {{ capcode.cap }}
{% endif %} {% endif %}
{% if post.mod and post.mod|hasPermission(config.mod.show_ip, board.uri) %} {% if post.mod and post.mod|hasPermission(config.mod.show_ip, board.uri) %}
[<a style="margin:0;" href="?/IP/{{ post.ip }}">{{ post.ip }}</a>] [<a style="margin:0;" href="?/IP/{{ post.ip }}">{{ post.ip }}</a>]
{% endif %} {% endif %}
<time datetime="{{ post.time|date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}">{{ post.time|date(config.post_date) }}</time> <time datetime="{{ post.time|date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}">{{ post.time|date(config.post_date) }}</time>
</label> </label>
{% if config.poster_ids %} {% if config.poster_ids %}
ID: {{ post.ip|poster_id(post.thread) }} ID: {{ post.ip|poster_id(post.thread) }}
{% endif %} {% 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="highlightReply({{ post.id }})" {% endif %}href="{{ post.link }}">No.</a>
<a class="post_no" <a class="post_no"
{% if not index %} {% if not index %}
onclick="citeReply({{ post.id }});" onclick="citeReply({{ post.id }});"
{% endif %} {% endif %}
href="{% if index %} href="{% if index %}
{{ post.link('q') }} {{ post.link('q') }}
{% else %} {% else %}
javascript:void(0); javascript:void(0);
{% endif %}"> {% endif %}">
{{ post.id }} {{ post.id }}
</a> </a>
</p> </p>
{% if post.embed %} {% if post.embed %}
{{ post.embed }} {{ post.embed }}
{% elseif post.file == 'deleted' %} {% elseif post.file == 'deleted' %}
<img src="{{ config.image_deleted }}" alt="" /> <img src="{{ config.image_deleted }}" alt="" />
{% elseif post.file and post.file %} {% elseif post.file and post.file %}
<p class="fileinfo">File: <a href="{{ config.uri_img }}{{ post.file }}">{{ post.file }}</a> <span class="unimportant"> <p class="fileinfo">File: <a href="{{ config.uri_img }}{{ post.file }}">{{ post.file }}</a> <span class="unimportant">
( (
{% if post.thumb == 'spoiler' %} {% if post.thumb == 'spoiler' %}
Spoiler Image, Spoiler Image,
{% endif %} {% endif %}
{{ post.filesize|filesize }} {{ post.filesize|filesize }}
{% if post.filex and post.filey %} {% if post.filex and post.filey %}
, {{ post.filex}}x{{ post.filey }} , {{ post.filex}}x{{ post.filey }}
{% if config.show_ratio %} {% if config.show_ratio %}
, {{ post.ratio }} , {{ post.ratio }}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if config.show_filename and post.filename %} {% if config.show_filename and post.filename %}
, ,
{% if post.filename|length > config.max_filename_display %} {% 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> <span class="postfilename" title="{{ post.filename|bidi_cleanup }}">{{ post.filename|truncate(config.max_filename_display)|bidi_cleanup }}</span>
{% else %} {% else %}
<span class="postfilename">{{ post.filename|bidi_cleanup }}</span> <span class="postfilename">{{ post.filename|bidi_cleanup }}</span>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if post.thumb != 'file' and config.image_identification %} {% if post.thumb != 'file' and config.image_identification %}
, ,
<span class='image_id'> <span class='image_id'>
<a href="http://imgops.com/{{ config.domain }}{{ config.uri_img }}{{ post.file }}">io</a> <a href="http://imgops.com/{{ config.domain }}{{ config.uri_img }}{{ post.file }}">io</a>
{% if post.file|extension == 'jpg' %} {% if post.file|extension == 'jpg' %}
<a href="http://regex.info/exif.cgi?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">e</a> <a href="http://regex.info/exif.cgi?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">e</a>
{% endif %} {% endif %}
<a href="http://www.google.com/searchbyimage?image_url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">g</a> <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> <a href="http://www.tineye.com/search?url={{ config.domain }}{{ config.uri_img }}{{ post.file }}">t</a>
</span> </span>
{% endif %} {% endif %}
) )
</span> </span>
</p> </p>
<a href="{{ config.uri_img }}{{ post.file }}" target="_blank"{% if post.thumb == 'file' %} class="file"{% endif %}> <a href="{{ config.uri_img }}{{ post.file }}" target="_blank"{% if post.thumb == 'file' %} class="file"{% endif %}>
<img src=" <img src="
{% if post.thumb == 'file' %} {% if post.thumb == 'file' %}
{{ config.root }} {{ config.root }}
{% if config.file_icons[post.filename|extension] %} {% if config.file_icons[post.filename|extension] %}
{{ config.file_thumb|sprintf(config.file_icons[post.filename|extension]) }} {{ config.file_thumb|sprintf(config.file_icons[post.filename|extension]) }}
{% else %} {% else %}
{{ config.file_thumb|sprintf(config.file_icons.default) }} {{ config.file_thumb|sprintf(config.file_icons.default) }}
{% endif %} {% endif %}
{% elseif post.thumb == 'spoiler' %} {% elseif post.thumb == 'spoiler' %}
{{ config.root }}{{ config.spoiler_image }} {{ config.root }}{{ config.spoiler_image }}
{% else %} {% else %}
{{ config.uri_thumb }}{{ post.thumb }} {{ config.uri_thumb }}{{ post.thumb }}
{% endif %}" style="width:{{ post.thumbx }}px;height:{{ post.thumby }}px" alt="" /> {% endif %}" style="width:{{ post.thumbx }}px;height:{{ post.thumby }}px" alt="" />
</a> </a>
{% endif %} {% endif %}
{{ post.postControls }} {{ post.postControls }}
<div class="body"> <div class="body">
{% endfilter %}{% if index %}{{ post.body|truncate_body(post.link) }}{% else %}{{ post.body }}{% endif %}{% filter remove_whitespace %} {% endfilter %}{% if index %}{{ post.body|truncate_body(post.link) }}{% else %}{{ post.body }}{% endif %}{% filter remove_whitespace %}
</div> </div>
</div> </div>
<br/> <br/>
{% endfilter %} {% endfilter %}

View File

@ -99,27 +99,27 @@
{% endif %}"> {% endif %}">
{{ post.id }} {{ post.id }}
</a> </a>
{% if post.sticky %} {% if post.sticky %}
{% if config.font_awesome %} {% if config.font_awesome %}
<i class="icon-pushpin icon"></i> <i class="icon-pushpin icon"></i>
{% else %} {% else %}
<img class="icon" title="Sticky" src="{{ config.image_sticky }}" alt="Sticky" /> <img class="icon" title="Sticky" src="{{ config.image_sticky }}" alt="Sticky" />
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if post.locked %} {% if post.locked %}
{% if config.font_awesome %} {% if config.font_awesome %}
<i class="icon-lock icon"></i> <i class="icon-lock icon"></i>
{% else %} {% else %}
<img class="icon" title="Locked" src="{{ config.image_locked }}" alt="Locked" /> <img class="icon" title="Locked" src="{{ config.image_locked }}" alt="Locked" />
{% endif %} {% endif %}
{% 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 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 %} {% if config.font_awesome %}
<i class="icon-anchor icon"></i> <i class="icon-anchor icon"></i>
{% else %} {% else %}
<img class="icon" title="Bumplocked" src="{{ config.image_bumplocked }}" alt="Bumplocked" /> <img class="icon" title="Bumplocked" src="{{ config.image_bumplocked }}" alt="Bumplocked" />
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if index %} {% if index %}
<a href="{{ post.root }}{{ board.dir }}{{ config.dir.res }}{{ config.file_page|sprintf(post.id) }}">[{% trans %}Reply{% endtrans %}]</a> <a href="{{ post.root }}{{ board.dir }}{{ config.dir.res }}{{ config.file_page|sprintf(post.id) }}">[{% trans %}Reply{% endtrans %}]</a>
{% endif %} {% endif %}

View File

@ -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, `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`thread` int(11) DEFAULT NULL, `thread` int(11) DEFAULT NULL,
`subject` varchar(100) DEFAULT NULL, `subject` varchar(100) DEFAULT NULL,

View File

@ -1,51 +1,51 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<script type="text/javascript"> <script type="text/javascript">
var active_page = "thread"; var active_page = "thread";
</script> </script>
{% include 'header.html' %} {% include 'header.html' %}
<title>{{ board.url }} - {% if config.thread_subject_in_title and thread.subject %}{{ thread.subject }}{% else %}{{ board.title|e }}{% endif %}</title> <title>{{ board.url }} - {% if config.thread_subject_in_title and thread.subject %}{{ thread.subject }}{% else %}{{ board.title|e }}{% endif %}</title>
</head> </head>
<body> <body>
{{ boardlist.top }} {{ 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 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 %} {% 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> <header>
<h1>{{ board.url }} - {{ board.title|e }}</h1> <h1>{{ board.url }} - {{ board.title|e }}</h1>
<div class="subtitle"> <div class="subtitle">
{% if board.subtitle %} {% if board.subtitle %}
{{ board.subtitle|e }} {{ board.subtitle|e }}
{% endif %} {% endif %}
{% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %} {% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
</div> </div>
</header> </header>
<div class="banner">{% trans %}Posting mode: Reply{% endtrans %} <a class="unimportant" href="{{ return }}">[{% trans %}Return{% endtrans %}]</a></div> <div class="banner">{% trans %}Posting mode: Reply{% endtrans %} <a class="unimportant" href="{{ return }}">[{% trans %}Return{% endtrans %}]</a></div>
{% include 'attention_bar.html' %} {% include 'attention_bar.html' %}
{% include 'post_form.html' %} {% include 'post_form.html' %}
{% if config.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %} {% if config.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %}
<hr /> <hr />
<form name="postcontrols" action="{{ config.post_url }}" method="post"> <form name="postcontrols" action="{{ config.post_url }}" method="post">
<input type="hidden" name="board" value="{{ board.uri }}" /> <input type="hidden" name="board" value="{{ board.uri }}" />
{% if mod %}<input type="hidden" name="mod" value="1" />{% endif %} {% if mod %}<input type="hidden" name="mod" value="1" />{% endif %}
{{ body }} {{ body }}
{% include 'report_delete.html' %} {% include 'report_delete.html' %}
</form> </form>
<a href="{{ return }}">[{% trans %}Return{% endtrans %}]</a> <a href="{{ return }}">[{% trans %}Return{% endtrans %}]</a>
{{ boardlist.bottom }} {{ boardlist.bottom }}
<footer> <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 &copy; 2010-2013 Tinyboard Development Group</p> <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 &copy; 2010-2013 Tinyboard Development Group</p>
{% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %} {% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %}
</footer> </footer>
<script type="text/javascript">{% raw %} <script type="text/javascript">{% raw %}
ready(); ready();
{% endraw %}</script> {% endraw %}</script>
</body> </body>
</html> </html>