diff --git a/inc/8chan-mod-pages.php b/inc/8chan-mod-pages.php
index a8e44311..f080c70f 100644
--- a/inc/8chan-mod-pages.php
+++ b/inc/8chan-mod-pages.php
@@ -384,13 +384,18 @@ FLAGS;
$possible_languages = array_diff(scandir('inc/locale/'), array('..', '.', '.tx', 'README.md'));
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+ $board_type = $_POST['board_type'];
+ $imgboard = $board_type == 'imgboard';
+ $txtboard = $board_type == 'txtboard';
+ $fileboard = $board_type == 'fileboard';
+
$title = $_POST['title'];
$subtitle = $_POST['subtitle'];
$country_flags = isset($_POST['country_flags']) ? 'true' : 'false';
$field_disable_name = isset($_POST['field_disable_name']) ? 'true' : 'false';
$enable_embedding = isset($_POST['enable_embedding']) ? 'true' : 'false';
- $force_image_op = isset($_POST['force_image_op']) ? 'true' : 'false';
- $disable_images = isset($_POST['disable_images']) ? 'true' : 'false';
+ $force_image_op = $imgboard && isset($_POST['force_image_op']) ? 'true' : 'false';
+ $disable_images = $txtboard ? 'true' : 'false';
$poster_ids = isset($_POST['poster_ids']) ? 'true' : 'false';
$show_sages = isset($_POST['show_sages']) ? 'true' : 'false';
$auto_unicode = isset($_POST['auto_unicode']) ? 'true' : 'false';
@@ -400,8 +405,8 @@ FLAGS;
$image_reject_repost_in_thread = isset($_POST['image_reject_repost_in_thread']) ? 'true' : 'false';
$early_404 = isset($_POST['early_404']) ? 'true' : 'false';
$allow_delete = isset($_POST['allow_delete']) ? 'true' : 'false';
- $allow_flash = isset($_POST['allow_flash']) ? '$config[\'allowed_ext_files\'][] = \'swf\';' : '';
- $allow_pdf = isset($_POST['allow_pdf']) ? '$config[\'allowed_ext_files\'][] = \'pdf\';' : '';
+ $allow_flash = $imgboard && isset($_POST['allow_flash']) ? '$config[\'allowed_ext_files\'][] = \'swf\';' : '';
+ $allow_pdf = $imgboard && isset($_POST['allow_pdf']) ? '$config[\'allowed_ext_files\'][] = \'pdf\';' : '';
$code_tags = isset($_POST['code_tags']) ? '$config[\'additional_javascript\'][] = \'js/code_tags/run_prettify.js\';$config[\'markup\'][] = array("/\[code\](.+?)\[\/code\]/ms", "\$1
");' : '';
$katex = isset($_POST['katex']) ? '$config[\'katex\'] = true;$config[\'additional_javascript\'][] = \'js/katex/katex.min.js\'; $config[\'markup\'][] = array("/\[tex\](.+?)\[\/tex\]/ms", "\$1 "); $config[\'additional_javascript\'][] = \'js/katex-enable.js\';' : '';
$user_flags = isset($_POST['user_flags']) ? "if (file_exists('$b/flags.php')) { include 'flags.php'; }\n" : '';
@@ -410,7 +415,7 @@ FLAGS;
$force_flag = isset($_POST['force_flag']) ? 'true' : 'false';
$tor_posting = isset($_POST['tor_posting']) ? 'true' : 'false';
$new_thread_capt = isset($_POST['new_thread_capt']) ? 'true' : 'false';
- $oekaki = isset($_POST['oekaki']) ? 'true' : 'false';
+ $oekaki = ($imgboard || $fileboard) && isset($_POST['oekaki']) ? 'true' : 'false';
if ($_POST['locale'] !== 'en' && in_array($_POST['locale'], $possible_languages)) {
$locale = "\$config['locale'] = '{$_POST['locale']}.UTF-8';";
@@ -426,6 +431,52 @@ FLAGS;
$multiimage = '';
}
+ $file_board = '';
+ if ($fileboard) {
+ $force_image_op = true;
+
+ $file_board = "\$config['threads_per_page'] = 30;
+ \$config['file_board'] = true;
+ \$config['threads_preview'] = 0;
+ \$config['threads_preview_sticky'] = 0;
+ \$config['allowed_ext_files'] = array();\n";
+
+
+ if (isset ($_POST['allowed_type'])) {
+ foreach ($_POST['allowed_type'] as $val) {
+ if (in_array ($val, $config['fileboard_allowed_types'])) {
+ $file_board .= "\$config['allowed_ext_files'][] = '$val';\n";
+ }
+ }
+ }
+
+ if (isset ($_POST['allowed_ext_op'])) {
+ $file_board .= "\$config['allowed_ext_op'] = \$config['allowed_ext_files'];\n";
+
+ if (isset ($_POST['allowed_ext_op_video'])) {
+ $file_board .= "\$config['allowed_ext_op'][] = 'webm';
+ \$config['allowed_ext_op'][] = 'mp4';\n";
+ }
+ }
+
+ if (isset ($_POST['tag_id'])) {
+ $file_board .= "\$config['allowed_tags'] = array();\n";
+ foreach ($_POST['tag_id'] as $id => $v) {
+ $file_board .= "\$config['allowed_tags'][";
+ $file_board .= 'base64_decode("';
+ $file_board .= base64_encode($_POST['tag_id'][$id]);
+ $file_board .= '")';
+ $file_board .= "] = ";
+ $file_board .= 'base64_decode("';
+ $file_board .= base64_encode($_POST['tag_desc'][$id]);
+ $file_board .= '")';
+ $file_board .= ";\n";
+ }
+ }
+ }
+
+ $anal_filenames = ($imgboard || $fileboard) && isset($_POST['anal_filenames']) ? "\$config['filename_func'] = 'filename_func';\n" : '';
+
$anonymous = base64_encode($_POST['anonymous']);
$blotter = base64_encode(purify_html(html_entity_decode($_POST['blotter'])));
$add_to_config = @file_get_contents($b.'/extra_config.php');
@@ -461,7 +512,7 @@ FLAGS;
if (isset($_POST['max_pages'])) {
$mp = (int)$_POST['max_pages'];
- if ($mp > 25 || $mp < 2) {
+ if ($mp > 25 || $mp < 1) {
$max_pages = 15;
} else {
$max_pages = $mp;
@@ -538,10 +589,13 @@ FLAGS;
\$config['max_newlines'] = $max_newlines;
\$config['oekaki'] = $oekaki;
$code_tags $katex $replace $multiimage $allow_flash $allow_pdf $user_flags
+$locale
+$anal_filenames
+$file_board
+
if (\$config['disable_images'])
\$config['max_pages'] = 10000;
-$locale
$add_to_config
EOT;
diff --git a/inc/config.php b/inc/config.php
index e1ad3eec..5a046d91 100644
--- a/inc/config.php
+++ b/inc/config.php
@@ -279,7 +279,8 @@
'file_url',
'json_response',
'user_flag',
- 'no_country'
+ 'no_country',
+ 'tag'
);
@@ -793,6 +794,9 @@
// Details: https://github.com/savetheinternet/Tinyboard/issues/20
$config['ie_mime_type_detection'] = '/<(?:body|head|html|img|plaintext|pre|script|table|title|a href|channel|scriptlet)/i';
+ // Config panel, fileboard: allowed upload extensions
+ $config['fileboard_allowed_types'] = array('zip', '7z', 'tar', 'gz', 'bz2', 'xz', 'swf', 'txt', 'pdf', 'torrent');
+
// Allowed image file extensions.
$config['allowed_ext'][] = 'jpg';
$config['allowed_ext'][] = 'jpeg';
@@ -800,6 +804,11 @@
$config['allowed_ext'][] = 'png';
// $config['allowed_ext'][] = 'svg';
+ // Allowed extensions for OP. Inherits from the above setting if set to false. Otherwise, it overrides both allowed_ext and
+ // allowed_ext_files (filetypes for downloadable files should be set in allowed_ext_files as well). This setting is useful
+ // for creating fileboards.
+ $config['allowed_ext_op'] = false;
+
// Allowed additional file extensions (not images; downloadable files).
// $config['allowed_ext_files'][] = 'txt';
// $config['allowed_ext_files'][] = 'zip';
@@ -1604,6 +1613,13 @@
// Allow OP to remove arbitrary posts in his thread
$config['user_moderation'] = false;
+ // File board. Like 4chan /f/
+ $config['file_board'] = false;
+
+ // Thread tags. Set to false to disable
+ // Example: array('A' => 'Chinese cartoons', 'M' => 'Music', 'P' => 'Pornography');
+ $config['allowed_tags'] = false;
+
/*
* ====================
* Public post search
diff --git a/inc/display.php b/inc/display.php
index 0f8e3e68..7dd0ffc2 100644
--- a/inc/display.php
+++ b/inc/display.php
@@ -511,7 +511,9 @@ class Thread extends Post {
event('show-thread', $this);
- $built = Element('post_thread.html', array(
+ $file = ($index && $config['file_board']) ? 'post_thread_fileboard.html' : 'post_thread.html';
+
+ $built = Element($file, array(
'config' => $config,
'board' => $board,
'post' => &$this,
diff --git a/inc/functions.php b/inc/functions.php
index 38fe902d..adf6cdb0 100755
--- a/inc/functions.php
+++ b/inc/functions.php
@@ -1568,6 +1568,10 @@ function index($page, $mod=false) {
$body .= $thread->build(true);
}
+ if ($config['file_board']) {
+ $body = Element('fileboard.html', array('body' => $body, 'mod' => $mod));
+ }
+
return array(
'board' => $board,
'body' => $body,
diff --git a/inc/instance-functions.php b/inc/instance-functions.php
index 71e933d1..aa4bf010 100644
--- a/inc/instance-functions.php
+++ b/inc/instance-functions.php
@@ -22,3 +22,9 @@ function max_posts_per_hour($post) {
function page_404() {
include('404.php');
}
+
+function filename_func($a) {
+ $f = basename($a['filename'], '.'.$a['extension']);
+ $f = str_replace(array("\0", "\n", "<", ">", "/", "&"), array("?", "?", "«", "»", "⁄", "and"), $f);
+ return $f;
+}
diff --git a/post.php b/post.php
index ce6a5f47..d2f86d11 100644
--- a/post.php
+++ b/post.php
@@ -373,7 +373,12 @@ elseif (isset($_POST['post'])) {
$url_without_params = $post['file_url'];
$post['extension'] = strtolower(mb_substr($url_without_params, mb_strrpos($url_without_params, '.') + 1));
- if (!in_array($post['extension'], $config['allowed_ext']) && !in_array($post['extension'], $config['allowed_ext_files']))
+
+ if ($post['op'] && $config['allowed_ext_op']) {
+ if (!in_array($post['extension'], $config['allowed_ext_op']))
+ error($config['error']['unknownext']);
+ }
+ else if (!in_array($post['extension'], $config['allowed_ext']) && !in_array($post['extension'], $config['allowed_ext_files']))
error($config['error']['unknownext']);
$post['file_tmp'] = tempnam($config['tmp'], 'url');
@@ -544,6 +549,12 @@ elseif (isset($_POST['post'])) {
$file['file_id'] .= "-$i";
$file['file'] = $config['dir']['img_root'] . $board['dir'] . $config['dir']['img'] . $file['file_id'] . '.' . $file['extension'];
+
+ while (file_exists ($file['file'])) {
+ $file['file_id'] .= rand(0,9);
+ $file['file'] = $config['dir']['img_root'] . $board['dir'] . $config['dir']['img'] . $file['file_id'] . '.' . $file['extension'];
+ }
+
$file['thumb'] = $config['dir']['img_root'] . $board['dir'] . $config['dir']['thumb'] . $file['file_id'] . '.' . ($config['thumb_ext'] ? $config['thumb_ext'] : $file['extension']);
$post['files'][] = $file;
$i++;
@@ -640,7 +651,11 @@ elseif (isset($_POST['post'])) {
error(_('You must choose a flag to post on this board!'));
}
}
-
+
+ if ($config['allowed_tags'] && $post['op'] && isset($_POST['tag']) && isset($config['allowed_tags'][$_POST['tag']])) {
+ $post['body'] .= "\n" . $_POST['tag'] . " ";
+ }
+
if (mysql_version() >= 50503) {
$post['body_nomarkup'] = $post['body']; // Assume we're using the utf8mb4 charset
}
@@ -667,7 +682,11 @@ elseif (isset($_POST['post'])) {
$allhashes = '';
foreach ($post['files'] as $key => &$file) {
- if (!in_array($file['extension'], $config['allowed_ext']) && !in_array($file['extension'], $config['allowed_ext_files']))
+ if ($post['op'] && $config['allowed_ext_op']) {
+ if (!in_array($file['extension'], $config['allowed_ext_op']))
+ error($config['error']['unknownext']);
+ }
+ elseif (!in_array($file['extension'], $config['allowed_ext']) && !in_array($file['extension'], $config['allowed_ext_files']))
error($config['error']['unknownext']);
$file['is_an_image'] = !in_array($file['extension'], $config['allowed_ext_files']);
diff --git a/stylesheets/burichan.css b/stylesheets/burichan.css
index f1bbd8e6..6b1de235 100644
--- a/stylesheets/burichan.css
+++ b/stylesheets/burichan.css
@@ -36,7 +36,7 @@ div.banner {
font-weight: normal;
}
-p.intro span.name {
+.intro span.name {
font-family: serif;
font-size: 12px;
}
diff --git a/stylesheets/caffe.css b/stylesheets/caffe.css
index aee4d5ab..7ba7bd1c 100644
--- a/stylesheets/caffe.css
+++ b/stylesheets/caffe.css
@@ -353,7 +353,7 @@ width: 100%;
#attention_bar:hover {
background-color: rgba(88, 53, 41, 0.3);
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #8e6152;
}
a.post_no:hover {
diff --git a/stylesheets/confraria.css b/stylesheets/confraria.css
index 8769c6bb..3b60aaa6 100644
--- a/stylesheets/confraria.css
+++ b/stylesheets/confraria.css
@@ -55,11 +55,11 @@ form table tr th {
padding: 0px 5px;
}
-p.intro span.name {
+.intro span.name {
color: #C5C8C6;
}
-p.intro span.subject {
+.intro span.subject {
color: #CC1105;
font-weight: bold;
}
@@ -90,11 +90,11 @@ div.post.reply.highlighted {
background: #4A4C4F;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: rgb(129, 162, 190);
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: rgb(95, 137, 172);
}
diff --git a/stylesheets/dark.css b/stylesheets/dark.css
index 7a0ce6da..209cd86c 100644
--- a/stylesheets/dark.css
+++ b/stylesheets/dark.css
@@ -23,7 +23,7 @@ div.title, h1 {
div.title p {
font-size: 10px;
}
-a:link, a:visited, p.intro a.email span.name {
+a:link, a:visited, .intro a.email span.name {
color: #CCCCCC;
text-decoration: none;
font-family: sans-serif;
@@ -61,21 +61,21 @@ div.post.reply div.body a:link, div.post.reply div.body a:visited {
div.post.reply div.body a:link:hover, div.post.reply div.body a:visited:hover {
color: #32DD72;
}
-p.intro span.subject {
+.intro span.subject {
font-size: 12px;
font-family: sans-serif;
color: #446655;
font-weight: 800;
}
-p.intro span.name {
+.intro span.name {
color: #32DD72;
font-weight: 800;
}
-p.intro a.capcode, p.intro a.nametag {
+.intro a.capcode, p.intro a.nametag {
color: magenta;
margin-left: 0;
}
-p.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name {
+.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name {
color: #32ddaf;
}
input[type="text"], textarea, select {
diff --git a/stylesheets/dark_roach.css b/stylesheets/dark_roach.css
index 7d123c6d..89e050d4 100644
--- a/stylesheets/dark_roach.css
+++ b/stylesheets/dark_roach.css
@@ -20,7 +20,7 @@ a, a:visited {
text-decoration: none;
color: #9999CC;
}
-a:hover, p.intro a.post_no:hover {
+a:hover, .intro a.post_no:hover {
color: #996699
}
a.post_no {
@@ -28,19 +28,19 @@ a.post_no {
margin: 0;
padding: 0;
}
-p.intro a.post_no {
+.intro a.post_no {
color: inherit;
}
-p.intro a.post_no, p.intro a.email {
+.intro a.post_no, p.intro a.email {
margin: 0;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #666699;
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: #663366;
}
-p.intro label {
+.intro label {
display: inline;
}
h2 {
@@ -163,7 +163,7 @@ div.post.op {
div.post.op hr {
border-color: #000000;
}
-p.intro {
+.intro {
margin: 0.5em 0;
padding: 0;
padding-bottom: 0.2em;
@@ -172,19 +172,19 @@ input.delete {
float: left;
margin: 1px 6px 0 0;
}
-p.intro span.subject {
+.intro span.subject {
color: #336699;
font-weight: bold;
}
-p.intro span.name {
+.intro span.name {
color: #336600;
font-weight: bold;
}
-p.intro span.capcode, p.intro a.capcode, p.intro a.nametag {
+.intro span.capcode, p.intro a.capcode, p.intro a.nametag {
color: #CC0000;
margin-left: 0;
}
-p.intro a {
+.intro a {
margin-left: 8px;
}
div.delete {
@@ -456,7 +456,7 @@ table.mod.config-editor input[type="text"] {
background-color: #333333;
opacity: 0.8;
}
-p.intro.thread-hidden {
+.intro.thread-hidden {
margin: 0px;
padding: 0px;
}
diff --git a/stylesheets/favela.css b/stylesheets/favela.css
index 6c9f6d58..52d24c76 100644
--- a/stylesheets/favela.css
+++ b/stylesheets/favela.css
@@ -46,7 +46,7 @@ form table tr th {
color: #FFF;
}
-p.intro span.name {
+.intro span.name {
font-family: serif;
}
@@ -81,7 +81,7 @@ div[id^="thread_"].highlighted {
background: #B5FFDD;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #345456;
}
diff --git a/stylesheets/ferus.css b/stylesheets/ferus.css
index f84d86ca..2517d3b0 100644
--- a/stylesheets/ferus.css
+++ b/stylesheets/ferus.css
@@ -16,7 +16,7 @@ div.title, h1 {
div.title p {
font-size: 13px;
}
-a:link, a:visited, p.intro a.email span.name {
+a:link, a:visited, .intro a.email span.name {
color: #16C816;
text-decoration: underline;
font-family: monospace;
@@ -51,21 +51,21 @@ div.post.reply div.body a:link, div.post.reply div.body a:visited {
div.post.reply div.body a:link:hover, div.post.reply div.body a:visited:hover {
color: #00FF00;
}
-p.intro span.subject {
+.intro span.subject {
font-size: 12px;
font-family: monospace;
color: #446655;
font-weight: 800;
}
-p.intro span.name {
+.intro span.name {
color: #008200;
font-weight: 900;
}
-p.intro a.capcode, p.intro a.nametag {
+.intro a.capcode, p.intro a.nametag {
color: magenta;
margin-left: 0;
}
-p.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name {
+.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name {
color: #00CC64;
font-family: monospace;
}
diff --git a/stylesheets/futaba+vichan.css b/stylesheets/futaba+vichan.css
index 5f7d742b..b0b67684 100644
--- a/stylesheets/futaba+vichan.css
+++ b/stylesheets/futaba+vichan.css
@@ -15,7 +15,7 @@ div.title p {
div.pages {
font-size: 13px !important;
}
-a:link, a:visited, p.intro a.email span.name {
+a:link, a:visited, .intro a.email span.name {
color: #0000ff;
font-size: inherit;
text-decoration: inherit;
@@ -41,7 +41,7 @@ div.post.reply.highlighted {
div.post.reply div.body a {
color: navy;
}
-p.intro span.subject {
+.intro span.subject {
color: #d00;
}
form table tr th {
diff --git a/stylesheets/futaba-light.css b/stylesheets/futaba-light.css
index fc67709f..19166adf 100644
--- a/stylesheets/futaba-light.css
+++ b/stylesheets/futaba-light.css
@@ -15,7 +15,7 @@ div.title p {
div.pages {
font-size: 13px !important;
}
-a:link, a:visited, p.intro a.email span.name {
+a:link, a:visited, .intro a.email span.name {
color: #A32615;
font-size: inherit;
text-decoration: inherit;
@@ -42,7 +42,7 @@ div.post.reply.highlighted {
div.post.reply div.body a {
color: rgb(190, 79, 43);
}
-p.intro span.subject {
+.intro span.subject {
color: #AA4848;
}
form table tr th {
diff --git a/stylesheets/futaba.css b/stylesheets/futaba.css
index 02c38351..2b4fc1d2 100644
--- a/stylesheets/futaba.css
+++ b/stylesheets/futaba.css
@@ -10,7 +10,7 @@ div.title h1 {
div.title p {
font-size: 10px;
}
-a:link, a:visited, p.intro a.email span.name {
+a:link, a:visited, .intro a.email span.name {
color: #0000ff;
}
a:link:hover {
@@ -30,7 +30,7 @@ div.post.reply.highlighted {
div.post.reply div.body a {
color: navy;
}
-p.intro span.subject {
+.intro span.subject {
color: #d00;
}
form table tr th {
diff --git a/stylesheets/gentoochan.css b/stylesheets/gentoochan.css
index b5075136..ae7ef2f3 100644
--- a/stylesheets/gentoochan.css
+++ b/stylesheets/gentoochan.css
@@ -2,7 +2,7 @@ body {
background: #0E0E0E url(data:image/gif;base64,R0lGODlhGAAMAKEEAOXl5ebm5vDw8PHx8SH+EUNyZWF0ZWQgd2l0aCBHSU1QACwAAAAAGAAMAAACRpQiY6cLa146MyY1EJQKjG81lNGRUPOIkgMJHtquBgIO7xwvpbrpduUSuXq8ntEC0bBEylYitdDAdM1ViaobkgKgZwyDLAAAOw==) repeat 0 0!important;
color: #000;
}
-a:link, a:visited, p.intro a.email span.name {
+a:link, a:visited, .intro a.email span.name {
-webkit-transition: all ease-in 0.3s;
-moz-transition: all ease-in 0.3s;
color: rgba(0, 0, 0, 0.6);
@@ -33,7 +33,7 @@ div.post.reply.highlighted {
div.post.reply p.body a {
color: navy;
}
-p.intro span.subject {
+.intro span.subject {
color: #000;
}
form table tr th {
diff --git a/stylesheets/jungle.css b/stylesheets/jungle.css
index 1765b3a9..86cb13b8 100644
--- a/stylesheets/jungle.css
+++ b/stylesheets/jungle.css
@@ -66,7 +66,7 @@ box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.35);
div.post.reply div.body a {
color: #00E;
}
-p.intro span.subject {
+.intro span.subject {
color: #d00;
}
form table tr th {
@@ -118,7 +118,7 @@ table.modlog tr th {
background: #EA8;
}
-p.intro span.name {
+.intro span.name {
color: maroon;
font-weight: 600;
}
diff --git a/stylesheets/luna.css b/stylesheets/luna.css
index 7439f5ca..e2fd6528 100644
--- a/stylesheets/luna.css
+++ b/stylesheets/luna.css
@@ -22,7 +22,7 @@ a, a:selected {
text-decoration: bold;
color: #ffffff;
}
-a:hover, p.intro a.post_no:hover {
+a:hover, .intro a.post_no:hover {
color: #ffffff;
}
a.post_no {
@@ -30,19 +30,19 @@ a.post_no {
margin: 0;
padding: 0;
}
-p.intro a.post_no {
+.intro a.post_no {
color: inherit;
}
-p.intro a.post_no, p.intro a.email {
+.intro a.post_no, p.intro a.email {
margin: 0;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #0091ff;
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: #ffffff;
}
-p.intro label {
+.intro label {
display: inline;
}
h2 {
@@ -165,7 +165,7 @@ div.post.op {
div.post.op hr {
border-color: #040934;
}
-p.intro {
+.intro {
margin: 0.5em 0;
padding: 0;
padding-bottom: 0.2em;
@@ -174,19 +174,19 @@ input.delete {
float: left;
margin: 1px 6px 0 0;
}
-p.intro span.subject {
+.intro span.subject {
color: #CCCCEE;
font-weight: bold;
}
-p.intro span.name {
+.intro span.name {
color: #BBBBDD;
font-weight: bold;
}
-p.intro span.capcode, p.intro a.capcode, p.intro a.nametag {
+.intro span.capcode, p.intro a.capcode, p.intro a.nametag {
color: #CCCCEE;
margin-left: 0;
}
-p.intro a {
+.intro a {
margin-left: 8px;
}
div.delete {
diff --git a/stylesheets/miku.css b/stylesheets/miku.css
index 84e67933..7a8fb87e 100644
--- a/stylesheets/miku.css
+++ b/stylesheets/miku.css
@@ -19,11 +19,11 @@ a.post_no {
color: #000033;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #0093AB;
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: #DD0000;
}
@@ -43,12 +43,12 @@ div.post.op hr {
border-color: #B7C9D5;
}
-p.intro span.subject {
+.intro span.subject {
color: #117743;
font-weight: 800;
}
-p.intro span.name {
+.intro span.name {
color: #117743;
font-weight: 800;
}
diff --git a/stylesheets/nigrachan.css b/stylesheets/nigrachan.css
index 6d0a94fa..28ab3eb3 100644
--- a/stylesheets/nigrachan.css
+++ b/stylesheets/nigrachan.css
@@ -52,7 +52,7 @@ input[type="text"], input[type="password"], textarea, input[type="submit"], inpu
border: 1px solid #202020;
}
-p.intro span.name {
+.intro span.name {
font-size: 11pt;
color: #505050;
font-weight: bold;
@@ -88,16 +88,16 @@ div.post.reply.highlighted {
background: #111111;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #FFFFFF;
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: #A0A0A0;
text-decoration: underline;
}
-p.intro span.subject {
+.intro span.subject {
color: #606060;
}
diff --git a/stylesheets/notsuba.css b/stylesheets/notsuba.css
index ef9e1057..8ecb6b21 100644
--- a/stylesheets/notsuba.css
+++ b/stylesheets/notsuba.css
@@ -20,11 +20,11 @@ a.post_no {
color: #000033;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #608673;
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: #DD0000;
}
@@ -44,12 +44,12 @@ div.post.op hr {
border-color: #608673;
}
-p.intro span.subject {
+.intro span.subject {
color: #8a2e2e;
font-weight: 800;
}
-p.intro span.name {
+.intro span.name {
color: #117743;
font-weight: 800;
}
diff --git a/stylesheets/novo_jungle.css b/stylesheets/novo_jungle.css
index 70501d0a..8c313723 100644
--- a/stylesheets/novo_jungle.css
+++ b/stylesheets/novo_jungle.css
@@ -65,7 +65,7 @@ form[name="postcontrols"] {
margin: 20px auto;
}
-p.intro span.name {
+.intro span.name {
color: #800000;
font-weight: 800;
}
@@ -104,11 +104,11 @@ div.post.reply.highlighted {
background-image: url('img/jungle_td_dark.png');;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #0000EE;
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: #00990B;
}
diff --git a/stylesheets/piwnichan.css b/stylesheets/piwnichan.css
index 2c1ea49a..7780226e 100644
--- a/stylesheets/piwnichan.css
+++ b/stylesheets/piwnichan.css
@@ -41,7 +41,7 @@ a.email span.name {
color: #5A8C99 !important;
}
-p.intro span.capcode, p.intro a.capcode, p.intro a.nametag {
+.intro span.capcode, p.intro a.capcode, p.intro a.nametag {
color: #6E0877;
}
@@ -157,7 +157,7 @@ div.banner, .replymode, .catalogmode {
font-weight:800;
}
-p.intro span.subject {
+.intro span.subject {
color: #4D2C80;
font-weight: bold;
}
diff --git a/stylesheets/ricechan.css b/stylesheets/ricechan.css
index 79b6d145..f01fc9bf 100644
--- a/stylesheets/ricechan.css
+++ b/stylesheets/ricechan.css
@@ -190,7 +190,7 @@ blockquote {
.de-refmap {
color: #4C505E !important;
}
-p.intro a.email span.name {
+.intro a.email span.name {
text-decoration: underline;
}
.quote {
diff --git a/stylesheets/style.css b/stylesheets/style.css
index 0cf9b2a3..954f2f4a 100644
--- a/stylesheets/style.css
+++ b/stylesheets/style.css
@@ -118,7 +118,7 @@ a,a:visited {
color: #34345C;
}
-a:hover,p.intro a.post_no:hover {
+a:hover,.intro a.post_no:hover {
color: #ff0000;
}
@@ -128,27 +128,27 @@ a.post_no {
padding: 0;
}
-p.intro a.post_no {
+.intro a.post_no {
color: inherit;
}
-p.intro a.post_no,p.intro a.email,p.intro a.post_anchor {
+.intro a.post_no,p.intro a.email,p.intro a.post_anchor {
margin: 0;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #34345C;
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: #ff0000;
}
-p.intro label {
+.intro label {
display: inline;
}
-p.intro time,p.intro a.ip-link,p.intro a.capcode {
+.intro time,p.intro a.ip-link,p.intro a.capcode {
direction: ltr;
unicode-bidi: embed;
}
@@ -331,7 +331,7 @@ div.post.op hr {
border-color: #D9BFB7;
}
-p.intro {
+.intro {
margin: 0.5em 0;
padding: 0;
padding-bottom: 0.2em;
@@ -342,22 +342,22 @@ input.delete {
margin: 1px 6px 0 0;
}
-p.intro span.subject {
+.intro span.subject {
color: #0F0C5D;
font-weight: bold;
}
-p.intro span.name {
+.intro span.name {
color: #117743;
font-weight: bold;
}
-p.intro span.capcode,p.intro a.capcode,p.intro a.nametag {
+.intro span.capcode,p.intro a.capcode,p.intro a.nametag {
color: #F00000;
margin-left: 0;
}
-p.intro a {
+.intro a {
margin-left: 5px;
}
@@ -698,7 +698,7 @@ div.blotter {
background-color: rgba(100%,100%,100%,0.2);
}
-p.intro.thread-hidden {
+.intro.thread-hidden {
margin: 0;
padding: 0;
}
@@ -1032,7 +1032,7 @@ span.pln {
}
@media screen and (min-width: 768px) {
- p.intro {
+ .intro {
clear: none;
}
@@ -1649,3 +1649,12 @@ td.board-tags a.tag-link {
#post-moderation-fields {
display: none;
}
+
+/* Fileboard */
+table.fileboard th, table.fileboard td {
+ padding: 2px;
+ text-align: center;
+}
+table.fileboard .intro a {
+ margin-left: 0px;
+}
diff --git a/stylesheets/szalet.css b/stylesheets/szalet.css
index e4deb8ee..77a216a6 100644
--- a/stylesheets/szalet.css
+++ b/stylesheets/szalet.css
@@ -20,7 +20,7 @@ background-repeat: repeat;
background-color: #200000;
}
-p.intro span.capcode, p.intro a.capcode, p.intro a.nametag {
+.intro span.capcode, p.intro a.capcode, p.intro a.nametag {
color: #26899C;
}
@@ -154,7 +154,7 @@ div.banner, .replymode, .catalogmode {
font-weight:800;
}
-p.intro span.subject {
+.intro span.subject {
color: #771018;
font-weight: bold;
}
diff --git a/stylesheets/terminal2.css b/stylesheets/terminal2.css
index f7463553..a951bc16 100644
--- a/stylesheets/terminal2.css
+++ b/stylesheets/terminal2.css
@@ -16,7 +16,7 @@ div.title, h1 {
div.title p {
font-size: 10px;
}
-a:link, a:visited, p.intro a.email span.name {
+a:link, a:visited, .intro a.email span.name {
color: #00FF00;
text-decoration: underline;
font-family: sans-serif;
@@ -50,21 +50,21 @@ div.post.reply div.body a:link, div.post.reply div.body a:visited {
div.post.reply div.body a:link:hover, div.post.reply div.body a:visited:hover {
color: #00FF00;
}
-p.intro span.subject {
+.intro span.subject {
font-size: 12px;
font-family: sans-serif;
color: #446655;
font-weight: 800;
}
-p.intro span.name {
+.intro span.name {
color: #00FF00;
font-weight: 800;
}
-p.intro a.capcode, p.intro a.nametag {
+.intro a.capcode, p.intro a.nametag {
color: #00FF00;
margin-left: 0;
}
-p.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name {
+.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name {
color: #00FF00;
}
input[type="text"], textarea, select {
diff --git a/stylesheets/testorange.css b/stylesheets/testorange.css
index cd2161b6..44ebd697 100644
--- a/stylesheets/testorange.css
+++ b/stylesheets/testorange.css
@@ -202,7 +202,7 @@ div.boardlist.bottom {
background-color: rgba(0%, 0%, 0%, 0.45);
}
-p.intro span.subject {
+.intro span.subject {
color:#ee8100;
}
diff --git a/stylesheets/v8ch.css b/stylesheets/v8ch.css
index 86492ea6..ba52a5bf 100644
--- a/stylesheets/v8ch.css
+++ b/stylesheets/v8ch.css
@@ -146,7 +146,7 @@ form table tr th{
background: #fec !important;
}
-p.intro.thread-hidden{
+.intro.thread-hidden{
padding-bottom: 1em !important;
}
diff --git a/stylesheets/wasabi.css b/stylesheets/wasabi.css
index f898d731..87a81bdd 100644
--- a/stylesheets/wasabi.css
+++ b/stylesheets/wasabi.css
@@ -27,16 +27,16 @@ a.post_no {
margin: 0;
padding: 0;
}
-p.intro a.post_no, p.intro a.email {
+.intro a.post_no, p.intro a.email {
margin: 0;
}
-p.intro a.email span.name {
+.intro a.email span.name {
color: #34345C;
}
-p.intro a.email:hover span.name {
+.intro a.email:hover span.name {
color: #ff0000;
}
-p.intro label {
+.intro label {
display: inline;
}
h2 {
@@ -155,7 +155,7 @@ div.post.op {
div.post.op hr {
border-color: #D9BFB7;
}
-p.intro {
+.intro {
margin: 0.5em 0;
padding: 0;
padding-bottom: 0.2em;
@@ -164,19 +164,19 @@ input.delete {
float: left;
margin: 1px 6px 0 0;
}
-p.intro span.subject {
+.intro span.subject {
color: #0F0C5D;
font-weight: bold;
}
-p.intro span.name {
+.intro span.name {
color: #117743;
font-weight: bold;
}
-p.intro a.capcode, p.intro a.nametag {
+.intro a.capcode, p.intro a.nametag {
color: #F00000;
margin-left: 0;
}
-p.intro a {
+.intro a {
margin-left: 8px;
}
div.delete {
diff --git a/stylesheets/yotsuba.css b/stylesheets/yotsuba.css
index f5b0540b..3fea60cb 100644
--- a/stylesheets/yotsuba.css
+++ b/stylesheets/yotsuba.css
@@ -2,7 +2,7 @@ body {
background: #ffe url('img/fade-yotsuba.png') repeat-x 50% 0%;
color: #800000;
}
-a:link, a:visited, p.intro a.email span.name {
+a:link, a:visited, .intro a.email span.name {
color: #800;
}
a:link:hover {
@@ -22,7 +22,7 @@ div.post.reply.highlighted {
div.post.reply div.body a {
color: navy;
}
-p.intro span.subject {
+.intro span.subject {
color: #d00;
}
form table tr th {
@@ -101,4 +101,4 @@ table.board-list-table .board-tags .board-cell:hover {
}
table.board-list-table tr:nth-of-type( even ) .board-tags .board-cell {
background: #ede2d4;
-}
\ No newline at end of file
+}
diff --git a/templates/fileboard.html b/templates/fileboard.html
new file mode 100644
index 00000000..a970cecb
--- /dev/null
+++ b/templates/fileboard.html
@@ -0,0 +1,15 @@
+
+
+
+ {% trans %}No.{% endtrans %}
+ {% trans %}Name{% endtrans %}
+ {% trans %}File{% endtrans %}
+ {% trans %}Tag{% endtrans %}
+ {% trans %}Subject{% endtrans %}
+ {% trans %}Size{% endtrans %}
+ {% trans %}Date{% endtrans %}
+ {% trans %}Replies{% endtrans %}
+
+
+ {{ body }}
+
diff --git a/templates/mod/settings.html b/templates/mod/settings.html
index 04f6a7cd..931651dd 100644
--- a/templates/mod/settings.html
+++ b/templates/mod/settings.html
@@ -24,14 +24,18 @@
+ {% trans %}Board type{% endtrans %}
+ Image board
+ Text board
+ File board
+
{% trans %}Country flags{% endtrans %}
{% trans %}/pol/-style user flags{% endtrans %}Enabling this disables country flags Make sure to actually upload some first!
{% trans %}Forced anonymous{% endtrans %}
{% trans %}YouTube/Voocaroo embedding{% endtrans %}
- {% trans %}Require image for OP{% endtrans %}
+ {% trans %}Require image for OP{% endtrans %}
{% trans %}Require subject for OP{% endtrans %}
{% trans %}Require user/country flag for all posts{% endtrans %}
- {% trans %}Disable images{% endtrans %}
{% trans %}Poster ID's{% endtrans %}
{% trans %}Display SAGE! after saged posts{% endtrans %}
{% trans %}Automatically convert ... to …{% endtrans %}
@@ -39,10 +43,10 @@
{% trans %}No index{% endtrans %}{% trans %}Hide from boards index and do not index in search engines{% endtrans %}
{% trans %}Archive my board on 8archive.moe{% endtrans %}{% trans %}This archives your board on 8archive.moe if you opt in{% endtrans %}
{% trans %}[code] tags{% endtrans %}
- {% trans %}Oekaki{% endtrans %}
+ {% trans %}Oekaki{% endtrans %}
{% trans %}Format math between $${% endtrans %}
- {% trans %}Allow SWF uploading{% endtrans %}
- {% trans %}Allow PDF uploading{% endtrans %}
+ {% trans %}Allow SWF uploading{% endtrans %}
+ {% trans %}Allow PDF uploading{% endtrans %}
{% trans %}Enable dice rolling{% endtrans %}
{% trans %}Don't allow users to repost images (whole board){% endtrans %}
{% trans %}Don't allow users to repost images (same thread){% endtrans %}
@@ -53,7 +57,7 @@
{% trans %}Public bans{% endtrans %}{% trans %}Displays your bans for the public{% endtrans %}
{% trans %}Public action log{% endtrans %}{% trans %}Displays all actions to the public{% endtrans %} None Full log of all actions Full log of all actions, no usernames
{% trans %}Max number of newlines per post{% endtrans %} unlimited {% for i in range(20, 300) %}{{ i }} {% endfor %}
- {% trans %}Page count{% endtrans %} {% for i in range(2, 25) %}{{ i }} {% endfor %}
+ {% trans %}Page count{% endtrans %} {% for i in range(1, 25) %}{{ i }} {% endfor %}
{% trans %}Bump limit{% endtrans %} {% for i in range(250, 750, 25) %}{{ i }} {% endfor %}
{% trans %}Language{% endtrans %}{% trans %}Read this page for more information about contributing translations:Translation tutorial or use Transifex {% endtrans %}
@@ -64,6 +68,15 @@
{% endfor %}
+ {% trans %}Allowed file types{% endtrans %}
+ {% for type in config.fileboard_allowed_types %}
+ {{ type }}
+ {% endfor %}
+
+ {% trans %}Disable OP image upload{% endtrans %}
+ ( also allow video upload)
+ {% trans %}Keep original filename{% endtrans %}
+
{% trans %}Max images per post{% endtrans %} {% for i in 1..5 %}{{ i }} {% endfor %}
@@ -99,9 +112,25 @@
{% endif %}
-
+
+
+
+
+
-
+
diff --git a/templates/post_form.html b/templates/post_form.html
index 52bf59d9..028de0f3 100644
--- a/templates/post_form.html
+++ b/templates/post_form.html
@@ -84,6 +84,18 @@
{% endif %}
+ {% if config.allowed_tags and not id %}
+
+ {% trans %}Tag{% endtrans %}
+
+
+ {% for id, tag in config.allowed_tags %}
+ {{ tag|e }}
+ {% endfor %}
+
+
+
+ {% endif %}
{% if not config.disable_images %}
@@ -230,7 +242,12 @@
{% if not config.disable_images %}
- {% trans %}Allowed file types:{% endtrans %} {{ config.allowed_ext|join(', ') }}{% if config.allowed_ext_files %}, {{ config.allowed_ext_files|join(', ') }}{% endif %}
+ {% trans %}Allowed file types:{% endtrans %}
+ {% if config.allowed_ext_op and not id %}
+ {{ config.allowed_ext_op|join(', ') }}
+ {% else %}
+ {{ config.allowed_ext|join(', ') }}{% if config.allowed_ext_files %}, {{ config.allowed_ext_files|join(', ') }}{% endif %}
+ {% endif %}
{% trans %}Max filesize is{% endtrans %} {{ config.max_filesize|filesize }}.
{% trans %}Max image dimensions are{% endtrans %} {{ config.max_height }} x {{ config.max_width }}.
{% set max_images = config.max_images %} {# workaround for "The text to be translated with "trans" can only contain references to simple variables" #}
diff --git a/templates/post_thread_fileboard.html b/templates/post_thread_fileboard.html
new file mode 100644
index 00000000..3f17907d
--- /dev/null
+++ b/templates/post_thread_fileboard.html
@@ -0,0 +1,41 @@
+{% filter remove_whitespace %}
+{# tabs and new lines will be ignored #}
+
+{# we are intentionally breaking the thread_ID convention: the jses need to handle this case differently #}
+
+
+
+{{ post.id }}
+{% include 'post/name.html' %}
+ {% include 'post/flag.html' %}
+ [{{ post.files[0].filename|e|bidi_cleanup }} ]
+ {% if post.modifiers['tag'] %}[{{ post.modifiers['tag']|e }}]{% endif %}
+ {% include 'post/subject.html' %}
+ {% if post.sticky %}
+ {% if config.font_awesome %}
+
+ {% else %}
+
+ {% endif %}
+ {% endif %}
+ {% if post.locked %}
+ {% if config.font_awesome %}
+
+ {% else %}
+
+ {% endif %}
+ {% endif %}
+ {% if post.bumplocked and (config.mod.view_bumplock < 0 or (post.mod and post.mod|hasPermission(config.mod.view_bumplock, board.uri))) %}
+ {% if config.font_awesome %}
+
+ {% else %}
+
+ {% endif %}
+ {% endif %}
+ {{ post.files[0].size|filesize }}
+ {% include 'post/time.html' %}
+ {{ post.omitted }}
+ {% include 'post/post_controls.html' %}
+ [{% trans %}Reply{% endtrans %}]
+
+{% endfilter %}