merge with vichan-gold
This commit is contained in:
@@ -1,9 +1,17 @@
|
||||
{% filter remove_whitespace %}
|
||||
{# Automatically removes unnecessary whitespace #}
|
||||
<div class="ban">
|
||||
<h2>{% trans %}You are banned! ;_;{% endtrans %}</h2>
|
||||
{% if ban.expires and time() >= ban.expires %}
|
||||
<h2>{% trans %}You were banned! ;_;{% endtrans %}</h2>
|
||||
{% else %}
|
||||
<h2>{% trans %}You are banned! ;_;{% endtrans %}</h2>
|
||||
{% endif %}
|
||||
<p>
|
||||
{% trans %}You have been banned from{% endtrans %}
|
||||
{% if ban.expires and time() >= ban.expires %}
|
||||
{% trans %}You were banned from{% endtrans %}
|
||||
{% else %}
|
||||
{% trans %}You have been banned from{% endtrans %}
|
||||
{% endif %}
|
||||
{% if ban.board %}
|
||||
<strong>{{ config.board_abbreviation|sprintf(ban.board) }}</strong>
|
||||
{% else %}
|
||||
@@ -23,7 +31,9 @@
|
||||
<p>
|
||||
{% trans %}Your ban was filed on{% endtrans %}
|
||||
<strong>{{ ban.set|date(config.ban_date) }}</strong> {% trans %}and{% endtrans %} <span id="expires">
|
||||
{% if ban.expires %}
|
||||
{% if ban.expires and time() >= ban.expires %}
|
||||
{% trans %} has since expired. Refresh the page to continue.{% endtrans %}
|
||||
{% elseif ban.expires %}
|
||||
{% trans %}expires{% endtrans %} <span id="countdown">{{ ban.expires|until }}</span> {% trans %}from now, which is on{% endtrans %}
|
||||
<strong>
|
||||
{{ ban.expires|date(config.ban_date) }}
|
||||
|
1
templates/boardlist.html
Normal file
1
templates/boardlist.html
Normal file
@@ -0,0 +1 @@
|
||||
I'm your overboard boardlist. You can put here anything and I reside in templates/boardlist.html
|
@@ -1,9 +1,21 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
{% include 'header.html' %}
|
||||
<meta charset="utf-8">
|
||||
<title>{{ board.url }} - {{ board.name }}</title>
|
||||
|
||||
<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 }}
|
||||
@@ -20,7 +32,11 @@
|
||||
</header>
|
||||
|
||||
{% include 'attention_bar.html' %}
|
||||
{% include 'post_form.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 />
|
||||
|
@@ -1,5 +1,27 @@
|
||||
{% 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 = {};
|
||||
|
||||
|
||||
@@ -105,7 +127,7 @@ function generatePassword() {
|
||||
|
||||
function dopost(form) {
|
||||
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') {
|
||||
localStorage.email = form.elements['email'].value;
|
||||
|
@@ -10,6 +10,7 @@
|
||||
<th>{% trans 'Set' %}</th>
|
||||
<th>{% trans 'Duration' %}</th>
|
||||
<th>{% trans 'Expires' %}</th>
|
||||
<th>{% trans 'Seen' %}</th>
|
||||
<th>{% trans 'Staff' %}</th>
|
||||
</tr>
|
||||
{% for ban in bans %}
|
||||
@@ -58,6 +59,13 @@
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if ban.seen %}
|
||||
{% trans 'Yes' %}
|
||||
{% else %}
|
||||
{% trans 'No' %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if ban.username %}
|
||||
{% if mod|hasPermission(config.mod.view_banstaff) %}
|
||||
|
@@ -101,6 +101,7 @@
|
||||
</ul>
|
||||
</fieldset>
|
||||
|
||||
{#
|
||||
<fieldset>
|
||||
<legend>{% trans 'Search' %}</legend>
|
||||
|
||||
@@ -115,6 +116,7 @@
|
||||
</li>
|
||||
</ul>
|
||||
</fieldset>
|
||||
#}
|
||||
|
||||
{% if config.debug %}
|
||||
<fieldset>
|
||||
|
@@ -136,6 +136,16 @@
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{% trans 'Seen' %}</th>
|
||||
<td>
|
||||
{% if ban.seen %}
|
||||
{% trans 'Yes' %}
|
||||
{% else %}
|
||||
{% trans 'No' %}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{% trans 'Staff' %}</th>
|
||||
<td>
|
||||
@@ -161,3 +171,43 @@
|
||||
{% include 'mod/ban_form.html' %}
|
||||
</fieldset>
|
||||
{% endif %}
|
||||
|
||||
{% if logs|count > 0 %}
|
||||
<fieldset id="history">
|
||||
<legend>History</legend>
|
||||
<table class="modlog" style="width:100%">
|
||||
<tr>
|
||||
<th>{% trans 'Staff' %}</th>
|
||||
<th>{% trans 'Time' %}</th>
|
||||
<th>{% trans 'Board' %}</th>
|
||||
<th>{% trans 'Action' %}</th>
|
||||
</tr>
|
||||
{% for log in logs %}
|
||||
<tr>
|
||||
<td class="minimal">
|
||||
{% if log.username %}
|
||||
<a href="?/log:{{ log.username|e }}">{{ log.username|e }}</a>
|
||||
{% elseif log.mod == -1 %}
|
||||
<em>system</em>
|
||||
{% else %}
|
||||
<em>{% trans 'deleted?' %}</em>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="minimal">
|
||||
<span title="{{ log.time|date(config.post_date) }}">{{ log.time|ago }}</span>
|
||||
</td>
|
||||
<td class="minimal">
|
||||
{% if log.board %}
|
||||
<a href="?/{{ config.board_path|sprintf(log.board) }}{{ config.file_index }}">{{ config.board_abbreviation|sprintf(log.board) }}</a>
|
||||
{% else %}
|
||||
-
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ log.text }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</fieldset>
|
||||
{% endif %}
|
||||
|
@@ -1,8 +1,8 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
{% include 'header.html' %}
|
||||
<meta charset="utf-8">
|
||||
{% include 'header.html' %}
|
||||
<title>{{ title }}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
@@ -24,24 +24,22 @@
|
||||
<td>
|
||||
<input type="text" name="email" size="25" maxlength="40" autocomplete="off">
|
||||
{{ antibot.html() }}
|
||||
{% if not (not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %}
|
||||
<input accesskey="s" style="margin-left:2px;" type="submit" name="post" value="{% if id %}{{ config.button_reply }}{% else %}{{ config.button_newtopic }}{% endif %}" />{% if config.spoiler_images %} <input id="spoiler" name="spoiler" type="checkbox"> <label for="spoiler">{% trans %}Spoiler Image{% endtrans %}</label>{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>{% endif %}
|
||||
<tr>
|
||||
{% if not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri)) %}<th>
|
||||
{% if not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri)) %}<tr>
|
||||
<th>
|
||||
{% trans %}Subject{% endtrans %}
|
||||
{{ antibot.html() }}
|
||||
</th>
|
||||
<td>
|
||||
<input style="float:left;" type="text" name="subject" size="25" maxlength="100" autocomplete="off">
|
||||
{% else %}<th>
|
||||
{% trans %}Submit{% endtrans %}
|
||||
{{ antibot.html() }}
|
||||
</th>
|
||||
<td>
|
||||
{% endif %}
|
||||
<input accesskey="s" style="margin-left:2px;" type="submit" name="post" value="{% if id %}{{ config.button_reply }}{% else %}{{ config.button_newtopic }}{% endif %}" />{% if config.spoiler_images %} <input id="spoiler" name="spoiler" type="checkbox"> <label for="spoiler">{% trans %}Spoiler Image{% endtrans %}</label>{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<th>
|
||||
{% trans %}Comment{% endtrans %}
|
||||
@@ -50,6 +48,11 @@
|
||||
<td>
|
||||
<textarea name="body" id="body" rows="5" cols="35"></textarea>
|
||||
{{ antibot.html() }}
|
||||
{% if not (not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %}
|
||||
{% if not (not config.field_disable_email or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri))) %}
|
||||
<input accesskey="s" style="margin-left:2px;" type="submit" name="post" value="{% if id %}{{ config.button_reply }}{% else %}{{ config.button_newtopic }}{% endif %}" />{% if config.spoiler_images %} <input id="spoiler" name="spoiler" type="checkbox"> <label for="spoiler">{% trans %}Spoiler Image{% endtrans %}</label>{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% if config.recaptcha %}
|
||||
@@ -59,7 +62,7 @@
|
||||
{{ antibot.html() }}
|
||||
</th>
|
||||
<td>
|
||||
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k={{ config.recaptcha_public }}"></script>
|
||||
<script type="text/javascript" src="//www.google.com/recaptcha/api/challenge?k={{ config.recaptcha_public }}"></script>
|
||||
{{ antibot.html() }}
|
||||
</td>
|
||||
</tr>
|
||||
|
@@ -7,14 +7,14 @@
|
||||
<label for="delete_{{ post.id }}">
|
||||
{% if post.subject|length > 0 %}
|
||||
{# show subject #}
|
||||
<span class="subject">{{ post.subject }}</span>
|
||||
<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 }}</span>
|
||||
<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 %}
|
||||
@@ -66,9 +66,9 @@
|
||||
{% if config.show_filename and post.filename %}
|
||||
,
|
||||
{% if post.filename|length > config.max_filename_display %}
|
||||
<span title="{{ post.filename }}">{{ post.filename|truncate(config.max_filename_display) }}</span>
|
||||
<span class="postfilename" title="{{ post.filename|bidi_cleanup }}">{{ post.filename|truncate(config.max_filename_display)|bidi_cleanup }}</span>
|
||||
{% else %}
|
||||
{{ post.filename }}
|
||||
<span class="postfilename">{{ post.filename|bidi_cleanup }}</span>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if post.thumb != 'file' and config.image_identification %}
|
||||
|
@@ -1,152 +1,148 @@
|
||||
{% filter remove_whitespace %}
|
||||
{# tabs and new lines will be ignored #}
|
||||
|
||||
<div id="thread_{{ post.id }}">
|
||||
|
||||
{% if post.embed %}
|
||||
{{ post.embed }}
|
||||
{% elseif post.file == 'deleted' %}
|
||||
<img src="{{ config.image_deleted }}" alt="" />
|
||||
{% elseif post.file and post.file %}
|
||||
<p class="fileinfo">{% trans %}File:{% endtrans %} <a href="{{ config.uri_img }}{{ post.file }}">{{ post.file }}</a> <span class="unimportant">
|
||||
(
|
||||
{% if post.thumb == 'spoiler' %}
|
||||
{% trans %}Spoiler Image{% endtrans %},
|
||||
{% 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 title="{{ post.filename }}">{{ post.filename|truncate(config.max_filename_display) }}</span>
|
||||
{% else %}
|
||||
{{ post.filename }}
|
||||
{% 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 %}
|
||||
<div class="post op"><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 }}</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 }}</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.id) }}
|
||||
{% endif %}
|
||||
<a class="post_no" href="http://webchat.6irc.net/?channels=vichan-int-{{ board.uri }}-{{ post.id }}&nick=Anon....">
|
||||
#</a>
|
||||
|
||||
<a class="post_no p1" href="{{ post.link }}">No.</a>
|
||||
<a class="post_no p2"
|
||||
{% if not index %}
|
||||
onclick="citeReply({{ post.id }});"
|
||||
{% endif %}
|
||||
href="{% if index %}
|
||||
{{ post.link('q') }}
|
||||
{% else %}
|
||||
javascript:void(0);
|
||||
{% endif %}">
|
||||
{{ post.id }}
|
||||
</a>
|
||||
{% if post.sticky %}
|
||||
<img class="icon" title="Sticky" src="{{ config.image_sticky }}" alt="Sticky" />
|
||||
{% endif %}
|
||||
{% if post.locked %}
|
||||
<img class="icon" title="Locked" src="{{ config.image_locked }}" alt="Locked" />
|
||||
{% endif %}
|
||||
{% if post.bumplocked and (config.mod.view_bumplock < 0 or (post.mod and post.mod|hasPermission(config.mod.view_bumplock, board.uri))) %}
|
||||
<img class="icon" title="Bumplocked" src="{{ config.image_bumplocked }}" alt="Bumplocked" />
|
||||
{% endif %}
|
||||
{% if index %}
|
||||
<a href="{{ post.root }}{{ board.dir }}{{ config.dir.res }}{{ config.file_page|sprintf(post.id) }}">[{% trans %}Reply{% endtrans %}]</a>
|
||||
{% endif %}
|
||||
{{ post.postControls }}
|
||||
</p>
|
||||
<div class="body">
|
||||
{% endfilter %}{% if index %}{{ post.body|truncate_body(post.link) }}{% else %}{{ post.body }}{% endif %}{% filter remove_whitespace %}
|
||||
</div>
|
||||
{% if post.omitted or post.omitted_images %}
|
||||
<span class="omitted">
|
||||
{% if post.omitted %}
|
||||
{% trans %}
|
||||
1 post
|
||||
{% plural post.omitted %}
|
||||
{{ count }} posts
|
||||
{% endtrans %}
|
||||
{% if post.omitted_images %}
|
||||
{% trans %}and{% endtrans %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if post.omitted_images %}
|
||||
{% trans %}
|
||||
1 image reply
|
||||
{% plural post.omitted_images %}
|
||||
{{ count }} image replies
|
||||
{% endtrans %}
|
||||
{% endif %} {% trans %}omitted. Click reply to view.{% endtrans %}
|
||||
</span>
|
||||
{% endif %}
|
||||
{% if not index %}
|
||||
{% endif %}
|
||||
</div>{% endfilter %}
|
||||
{% set hr = post.hr %}
|
||||
{% for post in post.posts %}
|
||||
{% include 'post_reply.html' %}
|
||||
{% endfor %}
|
||||
<br class="clear"/>{% if hr %}<hr/>{% endif %}
|
||||
</div>
|
||||
{% filter remove_whitespace %}
|
||||
{# tabs and new lines will be ignored #}
|
||||
|
||||
<div id="thread_{{ post.id }}" data-board="{{ board.uri }}">
|
||||
|
||||
{% if post.embed %}
|
||||
{{ post.embed }}
|
||||
{% elseif post.file == 'deleted' %}
|
||||
<img src="{{ config.image_deleted }}" alt="" />
|
||||
{% elseif post.file and post.file %}
|
||||
<p class="fileinfo">{% trans %}File:{% endtrans %} <a href="{{ config.uri_img }}{{ post.file }}">{{ post.file }}</a> <span class="unimportant">
|
||||
(
|
||||
{% if post.thumb == 'spoiler' %}
|
||||
{% trans %}Spoiler Image{% endtrans %},
|
||||
{% 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 %}
|
||||
<div class="post op"><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.id) }}
|
||||
{% endif %}
|
||||
<a class="post_no" 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>
|
||||
{% if post.sticky %}
|
||||
<img class="icon" title="Sticky" src="{{ config.image_sticky }}" alt="Sticky" />
|
||||
{% endif %}
|
||||
{% if post.locked %}
|
||||
<img class="icon" title="Locked" src="{{ config.image_locked }}" alt="Locked" />
|
||||
{% endif %}
|
||||
{% if post.bumplocked and (config.mod.view_bumplock < 0 or (post.mod and post.mod|hasPermission(config.mod.view_bumplock, board.uri))) %}
|
||||
<img class="icon" title="Bumplocked" src="{{ config.image_bumplocked }}" alt="Bumplocked" />
|
||||
{% endif %}
|
||||
{% if index %}
|
||||
<a href="{{ post.root }}{{ board.dir }}{{ config.dir.res }}{{ config.file_page|sprintf(post.id) }}">[{% trans %}Reply{% endtrans %}]</a>
|
||||
{% endif %}
|
||||
{{ post.postControls }}
|
||||
</p>
|
||||
<div class="body">
|
||||
{% endfilter %}{% if index %}{{ post.body|truncate_body(post.link) }}{% else %}{{ post.body }}{% endif %}{% filter remove_whitespace %}
|
||||
</div>
|
||||
{% if post.omitted or post.omitted_images %}
|
||||
<span class="omitted">
|
||||
{% if post.omitted %}
|
||||
{% trans %}
|
||||
1 post
|
||||
{% plural post.omitted %}
|
||||
{{ count }} posts
|
||||
{% endtrans %}
|
||||
{% if post.omitted_images %}
|
||||
{% trans %}and{% endtrans %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if post.omitted_images %}
|
||||
{% trans %}
|
||||
1 image reply
|
||||
{% plural post.omitted_images %}
|
||||
{{ count }} image replies
|
||||
{% endtrans %}
|
||||
{% endif %} {% trans %}omitted. Click reply to view.{% endtrans %}
|
||||
</span>
|
||||
{% endif %}
|
||||
{% if not index %}
|
||||
{% endif %}
|
||||
</div>{% endfilter %}
|
||||
{% set hr = post.hr %}
|
||||
{% for post in post.posts %}
|
||||
{% include 'post_reply.html' %}
|
||||
{% endfor %}
|
||||
<br class="clear"/>{% if hr %}<hr/>{% endif %}
|
||||
</div>
|
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
require 'info.php';
|
||||
|
||||
function basic_build($action, $settings) {
|
||||
function basic_build($action, $settings, $board) {
|
||||
// Possible values for $action:
|
||||
// - all (rebuild everything, initialization)
|
||||
// - news (news has been updated)
|
||||
|
38
templates/themes/catalog/catalog.css
Normal file
38
templates/themes/catalog/catalog.css
Normal file
@@ -0,0 +1,38 @@
|
||||
img {
|
||||
float:none!important;
|
||||
margin: auto;
|
||||
margin-bottom: 12px;
|
||||
max-height: 150px;
|
||||
max-width: 200px;
|
||||
box-shadow: 0 0 4px rgba(0, 0, 0, 0.55);
|
||||
border: 2px solid rgba(153, 153, 153, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
img:hover {
|
||||
border: 2px solid rgba(153, 153, 153, 0.27);
|
||||
}
|
||||
*/
|
||||
|
||||
div.thread {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin-bottom:25px;
|
||||
margin-left: 20px;
|
||||
margin-right: 15px;
|
||||
text-align:center;
|
||||
font-weight:normal;
|
||||
width:205px;
|
||||
overflow:hidden;
|
||||
position: relative;
|
||||
font-size:11px;
|
||||
padding: 15px;
|
||||
background: rgba(182, 182, 182, 0.12);
|
||||
border: 2px solid rgba(111, 111, 111, 0.34);
|
||||
max-height:300px;
|
||||
}
|
||||
|
||||
div.thread:hover {
|
||||
background: #D6DAF0;
|
||||
border-color: #B7C5D9;
|
||||
}
|
36
templates/themes/catalog/catalog.html
Normal file
36
templates/themes/catalog/catalog.html
Normal file
@@ -0,0 +1,36 @@
|
||||
{% filter remove_whitespace %}
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
||||
<title>{{ settings.title }}</title>
|
||||
<link rel="stylesheet" media="screen" href="{{ config.url_stylesheet }}"/>
|
||||
<link rel="stylesheet" media="screen" href="{{ config.root }}{{ settings.css }}"/>
|
||||
{% if config.url_favicon %}<link rel="shortcut icon" href="{{ config.url_favicon }}" />{% endif %}
|
||||
</head>
|
||||
<body>
|
||||
{{ boardlist.top }}
|
||||
<header>
|
||||
<h1>{{ settings.title }} (<a href="{{link}}">/{{ board }}/</a>)</h1>
|
||||
<div class="subtitle">{{ settings.subtitle }}</div>
|
||||
</header>
|
||||
|
||||
<ul>
|
||||
{% for post in recent_posts %}
|
||||
<div class="thread">
|
||||
<a href="{{post.link}}">
|
||||
<img src="{{post.file}}" class="{{post.board}}" title="{{post.bump|date('%b %d %H:%M')}}">
|
||||
</a>
|
||||
<span class="replies">
|
||||
<strong>{% trans %}1 reply{% plural post.reply_count %}{{ count }} replies{% endtrans %}</strong><br/>
|
||||
{{ post.body }}
|
||||
</span>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<hr/>
|
||||
<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>
|
||||
</body>
|
||||
</html>
|
||||
{% endfilter %}
|
42
templates/themes/catalog/info.php
Normal file
42
templates/themes/catalog/info.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
$theme = array();
|
||||
|
||||
// Theme name
|
||||
$theme['name'] = 'Catalog';
|
||||
// Description (you can use Tinyboard markup here)
|
||||
$theme['description'] = 'Show a post catalog.';
|
||||
$theme['version'] = 'v0.1';
|
||||
|
||||
// Theme configuration
|
||||
$theme['config'] = Array();
|
||||
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Title',
|
||||
'name' => 'title',
|
||||
'type' => 'text',
|
||||
'default' => 'Catalog'
|
||||
);
|
||||
|
||||
$__boards = listBoards();
|
||||
$__default_boards = Array();
|
||||
foreach ($__boards as $__board)
|
||||
$__default_boards[] = $__board['uri'];
|
||||
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Included boards',
|
||||
'name' => 'boards',
|
||||
'type' => 'text',
|
||||
'comment' => '(space seperated)',
|
||||
'default' => implode(' ', $__default_boards)
|
||||
);
|
||||
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'CSS file',
|
||||
'name' => 'css',
|
||||
'type' => 'text',
|
||||
'default' => 'catalog.css',
|
||||
'comment' => '(eg. "catalog.css")'
|
||||
);
|
||||
|
||||
// Unique function name for building everything
|
||||
$theme['build_function'] = 'catalog_build';
|
60
templates/themes/catalog/theme.php
Normal file
60
templates/themes/catalog/theme.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
require 'info.php';
|
||||
|
||||
function catalog_build($action, $settings, $board) {
|
||||
global $config;
|
||||
|
||||
// Possible values for $action:
|
||||
// - all (rebuild everything, initialization)
|
||||
// - news (news has been updated)
|
||||
// - boards (board list changed)
|
||||
// - post (a reply has been made)
|
||||
// - post-thread (a thread has been made)
|
||||
|
||||
$boards = explode(' ', $settings['boards']);
|
||||
|
||||
if ($action == 'all') {
|
||||
copy('templates/themes/catalog/catalog.css', $config['dir']['home'] . $settings['css']);
|
||||
|
||||
foreach ($boards as $board) {
|
||||
$b = new Catalog();
|
||||
$b->build($settings, $board);
|
||||
}
|
||||
} elseif ($action == 'post-thread' && in_array($board, $boards)) {
|
||||
$b = new Catalog();
|
||||
$b->build($settings, $board);
|
||||
}
|
||||
}
|
||||
|
||||
// Wrap functions in a class so they don't interfere with normal Tinyboard operations
|
||||
class Catalog {
|
||||
public function build($settings, $board_name) {
|
||||
global $config, $board;
|
||||
|
||||
openBoard($board_name);
|
||||
|
||||
$recent_images = array();
|
||||
$recent_posts = array();
|
||||
$stats = array();
|
||||
|
||||
$query = query(sprintf("SELECT *, `id` AS `thread_id`, (SELECT COUNT(*) FROM `posts_%s` WHERE `thread` = `thread_id`) AS `reply_count`, '%s' AS `board` FROM `posts_%s` WHERE `thread` IS NULL ORDER BY `bump` DESC", $board_name, $board_name, $board_name)) or error(db_error());
|
||||
|
||||
while ($post = $query->fetch()) {
|
||||
$post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], ($post['thread'] ? $post['thread'] : $post['id']));
|
||||
$post['board_name'] = $board['name'];
|
||||
$post['file'] = $config['uri_thumb'] . $post['thumb'];
|
||||
$recent_posts[] = $post;
|
||||
}
|
||||
|
||||
file_write($config['dir']['home'] . $board_name . '/catalog.html', Element('themes/catalog/catalog.html', Array(
|
||||
'settings' => $settings,
|
||||
'config' => $config,
|
||||
'boardlist' => createBoardlist(),
|
||||
'recent_images' => $recent_images,
|
||||
'recent_posts' => $recent_posts,
|
||||
'stats' => $stats,
|
||||
'board' => $board_name,
|
||||
'link' => $config['root'] . $board['dir']
|
||||
)));
|
||||
}
|
||||
};
|
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
require 'info.php';
|
||||
|
||||
function categories_build($action, $settings) {
|
||||
function categories_build($action, $settings, $board) {
|
||||
// Possible values for $action:
|
||||
// - all (rebuild everything, initialization)
|
||||
// - news (news has been updated)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
require 'info.php';
|
||||
|
||||
function frameset_build($action, $settings) {
|
||||
function frameset_build($action, $settings, $board) {
|
||||
// Possible values for $action:
|
||||
// - all (rebuild everything, initialization)
|
||||
// - news (news has been updated)
|
||||
|
@@ -1,12 +1,13 @@
|
||||
<?php
|
||||
require 'info.php';
|
||||
|
||||
function recentposts_build($action, $settings) {
|
||||
function recentposts_build($action, $settings, $board) {
|
||||
// Possible values for $action:
|
||||
// - all (rebuild everything, initialization)
|
||||
// - news (news has been updated)
|
||||
// - boards (board list changed)
|
||||
// - post (a post has been made)
|
||||
// - post-thread (a thread has been made)
|
||||
|
||||
$b = new RecentPosts();
|
||||
$b->build($action, $settings);
|
||||
@@ -23,7 +24,7 @@
|
||||
|
||||
$this->excluded = explode(' ', $settings['exclude']);
|
||||
|
||||
if ($action == 'all' || $action == 'post')
|
||||
if ($action == 'all' || $action == 'post' || $action == 'post-thread')
|
||||
file_write($config['dir']['home'] . $settings['html'], $this->homepage($settings));
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
require 'info.php';
|
||||
|
||||
function rrdtool_build($action, $settings) {
|
||||
function rrdtool_build($action, $settings, $board) {
|
||||
// Possible values for $action:
|
||||
// - all (rebuild everything, initialization)
|
||||
// - news (news has been updated)
|
||||
|
53
templates/themes/sitemap/info.php
Normal file
53
templates/themes/sitemap/info.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
$theme = Array();
|
||||
|
||||
// Theme name
|
||||
$theme['name'] = 'Sitemap Generator';
|
||||
// Description (you can use Tinyboard markup here)
|
||||
$theme['description'] = 'Generates an XML sitemap to help search engines find all threads and pages.';
|
||||
$theme['version'] = 'v1.0';
|
||||
|
||||
// Theme configuration
|
||||
$theme['config'] = Array();
|
||||
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Sitemap Path',
|
||||
'name' => 'path',
|
||||
'type' => 'text',
|
||||
'default' => 'sitemap.xml',
|
||||
'size' => '20'
|
||||
);
|
||||
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'URL prefix',
|
||||
'name' => 'url',
|
||||
'type' => 'text',
|
||||
'comment' => '(with trailing slash)',
|
||||
'default' => 'http://' . (isset ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : "localhost") . $config['root'],
|
||||
'size' => '20'
|
||||
);
|
||||
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Thread change frequency',
|
||||
'name' => 'changefreq',
|
||||
'type' => 'text',
|
||||
'comment' => '(eg. "hourly", "daily", etc.)',
|
||||
'default' => 'hourly',
|
||||
'size' => '20'
|
||||
);
|
||||
|
||||
$__boards = listBoards();
|
||||
$__default_boards = Array();
|
||||
foreach ($__boards as $__board)
|
||||
$__default_boards[] = $__board['uri'];
|
||||
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Boards',
|
||||
'name' => 'boards',
|
||||
'type' => 'text',
|
||||
'comment' => '(boards to include; space seperated)',
|
||||
'size' => 24,
|
||||
'default' => implode(' ', $__default_boards)
|
||||
);
|
||||
|
||||
$theme['build_function'] = 'sitemap_build';
|
19
templates/themes/sitemap/sitemap.xml
Normal file
19
templates/themes/sitemap/sitemap.xml
Normal file
@@ -0,0 +1,19 @@
|
||||
{% filter remove_whitespace %}
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
{% for board in boards %}
|
||||
<url>
|
||||
<loc>{{ settings.url ~ (config.board_path | format(board)) ~ config.file_index }}</loc>
|
||||
</url>
|
||||
{% endfor %}
|
||||
{% for board, thread_list in threads %}
|
||||
{% for thread in thread_list %}
|
||||
<url>
|
||||
<loc>{{ settings.url ~ (config.board_path | format(board)) ~ config.dir.res ~ (config.file_page | format(thread.thread_id)) }}</loc>
|
||||
<lastmod>{{ thread.lastmod | date('%Y-%m-%dT%H:%M:%S') }}{{ timezone() }}</lastmod>
|
||||
<changefreq>{{ settings.changefreq }}</changefreq>
|
||||
</url>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</urlset>
|
||||
{% endfilter %}
|
32
templates/themes/sitemap/theme.php
Normal file
32
templates/themes/sitemap/theme.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
require 'info.php';
|
||||
|
||||
function sitemap_build($action, $settings, $board) {
|
||||
global $config;
|
||||
|
||||
// Possible values for $action:
|
||||
// - all (rebuild everything, initialization)
|
||||
// - news (news has been updated)
|
||||
// - boards (board list changed)
|
||||
// - post (a post has been made)
|
||||
// - thread (a thread has been made)
|
||||
|
||||
if ($action != 'post' && $action != 'post-thread')
|
||||
return;
|
||||
|
||||
$boards = explode(' ', $settings['boards']);
|
||||
|
||||
$threads = array();
|
||||
|
||||
foreach ($boards as $board) {
|
||||
$query = query(sprintf("SELECT `id` AS `thread_id`, (SELECT `time` FROM `posts_%s` WHERE `thread` = `thread_id` OR `id` = `thread_id` ORDER BY `time` DESC LIMIT 1) AS `lastmod` FROM `posts_%s` WHERE `thread` IS NULL", $board, $board)) or error(db_error());
|
||||
$threads[$board] = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||
}
|
||||
|
||||
file_write($settings['path'], Element('themes/sitemap/sitemap.xml', Array(
|
||||
'settings' => $settings,
|
||||
'config' => $config,
|
||||
'threads' => $threads,
|
||||
'boards' => $boards,
|
||||
)));
|
||||
}
|
53
templates/themes/ukko/info.php
Normal file
53
templates/themes/ukko/info.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
$theme = Array();
|
||||
|
||||
// Theme name
|
||||
$theme['name'] = 'Ukko';
|
||||
// Description (you can use Tinyboard markup here)
|
||||
$theme['description'] = 'Board with threads and messages from all boards';
|
||||
$theme['version'] = 'v0.1';
|
||||
|
||||
// Theme configuration
|
||||
$theme['config'] = Array();
|
||||
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Board name',
|
||||
'name' => 'title',
|
||||
'type' => 'text',
|
||||
'default' => 'Ukko'
|
||||
);
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Board URI',
|
||||
'name' => 'uri',
|
||||
'type' => 'text',
|
||||
'comment' => '(ukko for example)'
|
||||
);
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Subtitle',
|
||||
'name' => 'subtitle',
|
||||
'type' => 'text',
|
||||
'comment' => '(%s = thread limit. for example "%s freshly bumped threads")'
|
||||
);
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Excluded boards',
|
||||
'name' => 'exclude',
|
||||
'type' => 'text',
|
||||
'comment' => '(space seperated)'
|
||||
);
|
||||
$theme['config'][] = Array(
|
||||
'title' => 'Number of threads',
|
||||
'name' => 'thread_limit',
|
||||
'type' => 'text',
|
||||
'default' => '15',
|
||||
);
|
||||
// Unique function name for building everything
|
||||
$theme['build_function'] = 'ukko_build';
|
||||
$theme['install_callback'] = 'ukko_install';
|
||||
|
||||
if(!function_exists('ukko_install')) {
|
||||
function ukko_install($settings) {
|
||||
if (!file_exists($settings['uri']))
|
||||
@mkdir($settings['uri'], 0777) or error("Couldn't create " . $settings['uri'] . ". Check permissions.", true);
|
||||
}
|
||||
}
|
||||
|
111
templates/themes/ukko/theme.php
Normal file
111
templates/themes/ukko/theme.php
Normal file
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
require 'info.php';
|
||||
|
||||
function ukko_build($action, $settings) {
|
||||
$ukko = new ukko();
|
||||
$ukko->settings = $settings;
|
||||
$ukko->build();
|
||||
}
|
||||
|
||||
class ukko {
|
||||
public $settings;
|
||||
public function build($mod = false) {
|
||||
global $config;
|
||||
$boards = listBoards();
|
||||
|
||||
$body = '';
|
||||
$overflow = array();
|
||||
$board = array(
|
||||
'url' => $this->settings['uri'],
|
||||
'name' => $this->settings['title'],
|
||||
'title' => sprintf($this->settings['subtitle'], $this->settings['thread_limit'])
|
||||
);
|
||||
|
||||
$query = '';
|
||||
foreach($boards as &$_board) {
|
||||
if(in_array($_board['uri'], explode(' ', $this->settings['exclude'])))
|
||||
continue;
|
||||
$query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` WHERE `thread` IS NULL UNION ALL ", $_board['uri'], $_board['uri']);
|
||||
}
|
||||
$query = preg_replace('/UNION ALL $/', 'ORDER BY `bump` DESC', $query);
|
||||
$query = query($query) or error(db_error());
|
||||
|
||||
$count = 0;
|
||||
$threads = array();
|
||||
while($post = $query->fetch()) {
|
||||
|
||||
if(!isset($threads[$post['board']])) {
|
||||
$threads[$post['board']] = 1;
|
||||
} else {
|
||||
$threads[$post['board']] += 1;
|
||||
}
|
||||
|
||||
if($count < $this->settings['thread_limit']) {
|
||||
openBoard($post['board']);
|
||||
$thread = new Thread(
|
||||
$post['id'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'], $post['body'], $post['time'],
|
||||
$post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'], $post['fileheight'], $post['filesize'],
|
||||
$post['filename'], $post['ip'], $post['sticky'], $post['locked'], $post['sage'], $post['embed'], $mod ? '?/' : $config['root'], $mod
|
||||
);
|
||||
|
||||
$posts = prepare(sprintf("SELECT * FROM `posts_%s` WHERE `thread` = :id ORDER BY `id` DESC LIMIT :limit", $post['board']));
|
||||
$posts->bindValue(':id', $post['id']);
|
||||
$posts->bindValue(':limit', ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']), PDO::PARAM_INT);
|
||||
$posts->execute() or error(db_error($posts));
|
||||
|
||||
$num_images = 0;
|
||||
while ($po = $posts->fetch()) {
|
||||
if ($po['file'])
|
||||
$num_images++;
|
||||
|
||||
$thread->add(new Post(
|
||||
$po['id'], $post['id'], $po['subject'], $po['email'], $po['name'], $po['trip'], $po['capcode'], $po['body'], $po['time'],
|
||||
$po['thumb'], $po['thumbwidth'], $po['thumbheight'], $po['file'], $po['filewidth'], $po['fileheight'], $po['filesize'],
|
||||
$po['filename'], $po['ip'], $po['embed'], $mod ? '?/' : $config['root'], $mod)
|
||||
);
|
||||
|
||||
}
|
||||
if ($posts->rowCount() == ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview'])) {
|
||||
$ct = prepare(sprintf("SELECT COUNT(`id`) as `num` FROM `posts_%s` WHERE `thread` = :thread UNION ALL SELECT COUNT(`id`) FROM `posts_%s` WHERE `file` IS NOT NULL AND `thread` = :thread", $post['board'], $post['board']));
|
||||
$ct->bindValue(':thread', $post['id'], PDO::PARAM_INT);
|
||||
$ct->execute() or error(db_error($count));
|
||||
|
||||
$c = $ct->fetch();
|
||||
$thread->omitted = $c['num'] - ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']);
|
||||
|
||||
$c = $ct->fetch();
|
||||
$thread->omitted_images = $c['num'] - $num_images;
|
||||
}
|
||||
|
||||
|
||||
$thread->posts = array_reverse($thread->posts);
|
||||
$body .= '<h2><a href="' . $config['root'] . $post['board'] . '">/' . $post['board'] . '/</a></h2>';
|
||||
$body .= $thread->build(true);
|
||||
} else {
|
||||
$page = 'index';
|
||||
if(floor($threads[$post['board']] / $config['threads_per_page']) > 0) {
|
||||
$page = floor($threads[$post['board']] / $config['threads_per_page']) + 1;
|
||||
}
|
||||
$overflow[] = array('id' => $post['id'], 'board' => $post['board'], 'page' => $page . '.html');
|
||||
}
|
||||
|
||||
$count += 1;
|
||||
}
|
||||
|
||||
$body .= '<script> var overflow = ' . json_encode($overflow) . '</script>';
|
||||
$body .= '<script type="text/javascript" src="ukko.js"></script>';
|
||||
|
||||
file_write($this->settings['uri'] . '/index.html', Element('index.html', array(
|
||||
'config' => $config,
|
||||
'board' => $board,
|
||||
'no_post_form' => true,
|
||||
'body' => $body,
|
||||
'boardlist' => createBoardlist($mod)
|
||||
)));
|
||||
|
||||
file_write($this->settings['uri'] . '/ukko.js', Element('themes/ukko/ukko.js', array()));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
?>
|
BIN
templates/themes/ukko/thumb.png
Normal file
BIN
templates/themes/ukko/thumb.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
37
templates/themes/ukko/ukko.js
Normal file
37
templates/themes/ukko/ukko.js
Normal file
@@ -0,0 +1,37 @@
|
||||
var cache = new Array(),
|
||||
thread = false,
|
||||
loading = false;
|
||||
$(document).ready(function() {
|
||||
$(window).on('scroll', function() {
|
||||
if($(window).scrollTop() + $(window).height() + 100 > $(document).height() && !loading && overflow.length > 0) {
|
||||
var page = '../' + overflow[0].board + '/' + overflow[0].page;
|
||||
if($.inArray(page, cache) != -1) {
|
||||
thread = $('div#thread_' + overflow[0].id);
|
||||
if(thread.length > 0) {
|
||||
thread.prepend('<h2><a href="/' + overflow[0].board + '/">/' + overflow[0].board + '/</a></h2>');
|
||||
$('div[id*="thread_"]').last().after(thread.attr('data-board', overflow[0].board).css('display', 'block'));
|
||||
overflow.shift();
|
||||
}
|
||||
} else {
|
||||
loading = true;
|
||||
$.get(page, function(data) {
|
||||
cache.push(page);
|
||||
|
||||
$(data).find('div[id*="thread_"]').each(function() {
|
||||
$('body').prepend($(this).css('display', 'none').attr('data-board', overflow[0].board));
|
||||
});
|
||||
|
||||
thread = $('div#thread_' + overflow[0].id + '[data-board="' + overflow[0].board + '"]');
|
||||
if(thread.length > 0) {
|
||||
thread.prepend('<h2><a href="/' + overflow[0].board + '/">/' + overflow[0].board + '/</a></h2>');
|
||||
$('div[id*="thread_"]').last().after(thread.attr('data-board', overflow[0].board).css('display', 'block'));
|
||||
overflow.shift();
|
||||
}
|
||||
|
||||
loading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
@@ -2,35 +2,13 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<script src='https://int.vichan.net/opportunistic_https.js'></script>
|
||||
<link rel="stylesheet" media="screen" href="{{ config.url_stylesheet }}">
|
||||
{% if config.url_favicon %}<link rel="shortcut icon" href="{{ config.url_favicon }}">{% endif %}
|
||||
<title>{{ board.url }} - {{ board.name }}</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes">
|
||||
{% if config.meta_keywords %}<meta name="keywords" content="{{ config.meta_keywords }}">{% endif %}
|
||||
{% if config.default_stylesheet.1 != '' %}<link rel="stylesheet" type="text/css" id="stylesheet" href="{{ config.uri_stylesheets }}{{ config.default_stylesheet.1 }}">{% endif %}
|
||||
<script type="text/javascript">var configRoot="{{ config.root }}";</script>
|
||||
{% if not nojavascript %}
|
||||
<script type="text/javascript" src="{{ config.url_javascript }}"></script>
|
||||
{% if not config.additional_javascript_compile %}
|
||||
{% for javascript in config.additional_javascript %}<script type="text/javascript" src="{{ config.additional_javascript_url }}{{ javascript }}"></script>{% endfor %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if config.recaptcha %}<style type="text/css">{% raw %}
|
||||
.recaptcha_image_cell {
|
||||
background: none !important;
|
||||
}
|
||||
table.recaptchatable {
|
||||
border: none !important;
|
||||
}
|
||||
#recaptcha_logo, #recaptcha_tagline {
|
||||
display: none;
|
||||
float: right;
|
||||
}
|
||||
.recaptchatable a {
|
||||
display: block;
|
||||
}
|
||||
{% endraw %}</style>{% endif %}
|
||||
|
||||
<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 }}
|
||||
|
Reference in New Issue
Block a user