Archived
1
0

Merge branch 'neochan'

This commit is contained in:
Jeff Becker 2016-10-18 07:04:21 -04:00
commit 2e2968e188
No known key found for this signature in database
GPG Key ID: AB950234D6EA286B
42 changed files with 1893 additions and 43 deletions

View File

@ -1,4 +1,10 @@
#!/usr/bin/env bash #!/usr/bin/env bash
neochan="yes"
if [ "$1" == "--disable-neochan" ] ; then
neochan="no"
fi
root=$(readlink -e "$(dirname "$0")") root=$(readlink -e "$(dirname "$0")")
set -e set -e
if [ "x" == "x$root" ] ; then if [ "x" == "x$root" ] ; then
@ -16,47 +22,48 @@ if [ ! -f "$GOPATH/bin/minify" ]; then
go get -v github.com/tdewolff/minify/cmd/minify go get -v github.com/tdewolff/minify/cmd/minify
fi fi
outfile=$PWD/contrib/static/nntpchan.js outfile="$PWD/contrib/static/nntpchan.js"
neochan_js_outfile="$PWD/contrib/static/neochan.js"
lint() { neochan_css_outfile="$PWD/contrib/static/neochan.css"
if [ "$(which jslint)" == "" ] ; then
# no jslint
true
else
echo "jslint: $1"
jslint --browser "$1"
fi
}
mini() { mini() {
echo "minify $1" echo "minify $1"
echo "" >> $2 echo "" >> $2
echo "/* begin $1 */" >> $2 echo "/* begin $1 */" >> $2
"$GOPATH/bin/minify" --mime=text/javascript >> $2 < $1 "$GOPATH/bin/minify" --mime=text/javascript >> $2 < $1
echo "" >> $2
echo "/* end $1 */" >> $2 echo "/* end $1 */" >> $2
} }
# do linting too css() {
if [ "x$1" == "xlint" ] ; then echo "minify $1"
echo "linting..." echo "" >> $2
for f in ./contrib/js/*.js ; do echo "/* begin $1 */" >> $2
lint "$f" lessc $1 >> $2
done echo "" >> $2
fi echo "/* end $1 */" >> $2
}
rm -f "$outfile" initfile() {
echo '/*' >> $outfile rm -f "$1"
echo ' * For source code and license information please check https://github.com/majestrate/nntpchan' >> $outfile
brandingfile=./contrib/branding.txt echo '/*' >> "$1"
if [ -e "$brandingfile" ] ; then echo ' * For source code and license information please check https://github.com/majestrate/nntpchan' >> "$1"
echo ' *' >> $outfile brandingfile=./contrib/branding.txt
while read line; do if [ -e "$brandingfile" ] ; then
echo -n ' * ' >> $outfile; echo ' *' >> "$1"
echo $line >> $outfile; while read line; do
done < $brandingfile; echo -n ' * ' >> "$1";
fi echo $line >> "$1";
echo ' */' >> $outfile done < $brandingfile;
fi
echo ' */' >> "$1"
}
echo
echo "building nntpchan.js ..."
echo
initfile "$outfile"
if [ -e ./contrib/js/contrib/*.js ] ; then if [ -e ./contrib/js/contrib/*.js ] ; then
for f in ./contrib/js/contrib/*.js ; do for f in ./contrib/js/contrib/*.js ; do
@ -76,4 +83,37 @@ for f in ./contrib/js/vendor/*.js ; do
mini "$f" "$outfile" mini "$f" "$outfile"
done done
if [ "$neochan" == "yes" ] ; then
set +e
for exe in lessc coffee ; do
which $exe &> /dev/null
if [ "$?" != "0" ] ; then
echo "$exe not installed";
exit 1
fi
done
echo
echo "building neochan.js ..."
echo
initfile "$neochan_js_outfile"
for f in ./contrib/js/neochan/*.coffee ; do
echo "compile $f"
coffee -cs < "$f" > "$f.js"
done
for f in ./contrib/js/neochan/*.js ; do
mini "$f" "$neochan_js_outfile"
done
echo
echo "building neochan.css ..."
echo
initfile "$neochan_css_outfile"
for f in ./contrib/js/neochan/*.less ; do
css "$f" "$neochan_css_outfile"
done
fi
echo
echo "ok" echo "ok"

View File

@ -6,9 +6,9 @@ if [ "" == "$root" ] ; then
fi fi
cd "$root" cd "$root"
tags="" tags="-tags disable_redis"
help_text="usage: $0 [--disable-redis]" help_text="usage: $0 [--disable-neochan]"
# check for help flags first # check for help flags first
for arg in "$@" ; do for arg in "$@" ; do
@ -25,9 +25,13 @@ ipfs="no"
rebuildjs="yes" rebuildjs="yes"
_next="" _next=""
unstable="no" unstable="no"
neochan="yes"
# check for build flags # check for build flags
for arg in "$@" ; do for arg in "$@" ; do
case $arg in case $arg in
"--disable-neochan")
neochan="no"
;;
"--unstable") "--unstable")
unstable="yes" unstable="yes"
;; ;;
@ -37,12 +41,6 @@ for arg in "$@" ; do
"--ipfs") "--ipfs")
ipfs="yes" ipfs="yes"
;; ;;
"--cuckoo")
cuckoo="yes"
;;
"--disable-redis")
tags="$tags -tags disable_redis"
;;
"--revision") "--revision")
_next="rev" _next="rev"
;; ;;
@ -64,8 +62,13 @@ fi
cd "$root" cd "$root"
if [ "$rebuildjs" == "yes" ] ; then if [ "$rebuildjs" == "yes" ] ; then
echo "rebuilding generated js..." echo "rebuilding generated js..."
./build-js.sh if [ "$neochan" == "no" ] ; then
./build-js.sh --disable-neochan
else
./build-js.sh
fi
fi fi
unset GOPATH unset GOPATH
export GOPATH=$PWD/go export GOPATH=$PWD/go
mkdir -p "$GOPATH" mkdir -p "$GOPATH"

1
contrib/js/neochan/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.coffee.js

View File

@ -0,0 +1 @@

View File

View File

@ -0,0 +1,3 @@
# neochan javascript directory
sass files for neochan templates

3
contrib/static/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
nntpchan.js
neochan.js
neochan.css

View File

@ -1,7 +1,9 @@
<!DOCTYPE html5>
<html> <html>
<head> <head>
<link rel="stylesheet" href="site.css" /> <link rel="stylesheet" href="site.css" />
<title> NNTPChan Frequently Asked Questions </title> <title> NNTPChan Frequently Asked Questions </title>
<meta charset="utf-8">
</head> </head>
<body> <body>
<h2>NNTPChan faq </h2> <h2>NNTPChan faq </h2>
@ -47,10 +49,6 @@
<div><a href="https://github.com/majestrate/nntpchan/issues">github</a></div> <div><a href="https://github.com/majestrate/nntpchan/issues">github</a></div>
</p> </p>
<hr /> <hr />
<p>
<div>Please send any gripes/questions/inqueries/suggestions/complaints to ampernand [|at\] gmail {dot} com with subject starting with "nntpchan question" </div>
</p>
<hr />
</div> </div>
</body> </body>
</html> </html>

View File

@ -0,0 +1,35 @@
{{!
404.mustache -- 404 page
template parameters:
- prefix (the site prefix)
}}
<!DOCTYPE html>
<html>
<head>
<title> 404 </title>
<meta charset="utf-8"></meta>
<link rel="stylesheet" href="{{prefix}}static/neochan-site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
</head>
<body>
<center>
<div class="not_found fade-in">
<img src="{{prefix}}static/404.png"></img>
<div class="not_found_message">
{{#i18n.Translations}}{{resource_not_found}}{{/i18n.Translations}}
</div>
</div>
</center>
<script type="text/javascript">
neochan_init(function() {
ready();
});
</script>
<hr />
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>

View File

@ -0,0 +1,71 @@
{{!
board.mustache, displays the contents of page N of the board
template parameters:
- board ( the model of the current page )
- page ( the page number of the current page )
board has the properties:
- Prefix ( absolute path like //site.tld/ or /path/ )
- Board ( the name of the board )
- Navbar ( a function that renders the navbar, should not be escaped )
- Threads ( a list of Thread Models with the last few replies )
}}
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{board.Board}}</title>
</head>
<body>
<!-- begin navbar -->
{{{board.Navbar}}}
<!-- end navbar -->
<center>
<div id="nntpchan_banner">
</div>
</center>
<div class="board_header">{{board.Board}}</div>
<div class="board_header_catalog"><a href="{{board.Prefix}}catalog-{{board.Name}}.html"> {{#i18n.Translations}}{{catalog_label}}{{/i18n.Translations}} </a></div>
<!-- postform -->
<div id="postform_container">
{{{form}}}
</div>
<hr />
<div id="threads_container">
{{#board.Threads}}
<div class="thread" id="thread_{{OP.PostHash}}">
<div class="thread_header">
</div>
{{{OP.Truncate.RenderPost}}}
{{#Truncate.Replies}}
{{{Truncate.RenderPost}}}
{{/Truncate.Replies}}
<hr />
</div>
{{/board.Threads}}
</div>
<div class="pagelist">{{# board.PageList }}[<a href="{{LinkURL}}"> {{Text}} </a>] {{/ board.PageList }}
<span class="navbar-sep">
|
</span>
<a href="{{board.Prefix}}catalog-{{board.Name}}.html"> {{#i18n.Translations}}{{catalog_label}}{{/i18n.Translations}} </a>
</div>
<script type="text/javascript">
var prefix = "{{board.Prefix}}";
var e = document.getElementById("nntpchan_banner");
nntpchan_inject_banners(e, prefix);
init(prefix);
ready();
</script>
<hr/>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>

View File

@ -0,0 +1,51 @@
{{!
boardlist.mustache -- full list of every board
template parameters:
- graph ( a list of 4 string tuples: (board, posts_per_hour, posts_per_day, total_posts) )
- frontend ( the name of the frontend )
- prefix ( the site's prefix )
}}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css"></link>
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css"></link>
<title> {{frontend}} {{#i18n.Translations}}{{board_list_title}}{{/i18n.Translations}} </title>
</head>
<body>
<center>
<div class="index-outer">
<div class="index-inner">
<table id="board_graph">
<thead>
<tr>
<th> {{#i18n.Translations}}{{board_label}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{pph_label}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{ppd_label}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{total}}{{/i18n.Translations}} </th>
</tr>
</thead>
<tbody>
{{# graph}}
<tr>
<td>
<a href="{{prefix}}{{Board}}-0.html">{{Board}}</a>
</td>
<td>
{{Hour}}
</td>
<td>
{{Day}}
</td>
<td>
{{All}}
</td>
</tr>
{{/ graph}}
</tbody>
</table>
</div>
</div>
</center>
</body>
</html>

View File

@ -0,0 +1,47 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<link id="current_theme" rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{catalog_title}}{{/i18n.Translations}} {{board.Name}}</title>
</head>
<body>
<!-- begin navbar -->
{{{board.Navbar}}}
<!-- end navbar -->
<center>
<div id="nntpchan_banner">
</div>
</center>
<div class="board_header">{{#i18n.Translations}}{{catalog_title}}{{/i18n.Translations}} {{board.Name}}</div>
<!-- postform -->
<hr />
<div id="catalog_container">
{{#board.Threads}}
<div class="catalog_thread">
<a class="linkThumb" href="{{OP.PostURL}}"><img src="{{OP.RepresentativeThumb}}"></a>
<div class="catalog_header">{{#i18n.Translations}}{{replies_short_label}}{{/i18n.Translations}}: {{ReplyCount}} / {{#i18n.Translations}}{{pictures_short_label}}{{/i18n.Translations}}: {{Page}}</div>
<div class="catalog_subject">{{OP.Subject}}</div>
<div class="catalog_body">
{{{OP.RenderBody}}}
</div>
</div>
{{/board.Threads}}
</div>
<script type="text/javascript">
var e = document.getElementById("nntpchan_banner");
nntpchan_inject_banners(e, "{{board.Prefix}}");
</script>
<hr/>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>

View File

@ -0,0 +1,87 @@
{{!
frontpage.mustache -- template for index.html
template parameters:
- boardgraph ( markup of boardPageRows instance, see srnd/model.go )
- postgraph ( markup of postsGraph instance , see srnd/model.go )
- overview ( markup of overviewModel instance , see srnd/model.go )
- totalposts ( the number of total posts we have ever seen )
- frontend ( the name of the frontend )
- prefix ( the site's prefix )
}}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/neochan-site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<meta charset="utf-8"></meta>
<script src="{{prefix}}static/nntpchan.js" type="text/javascript"></script>
<title> {{frontend}} </title>
</head>
<body>
{{{navbar}}}
<div id="wrapper" class="fade-in">
<div class="index-outer">
<div id="nntpchan-banner">
</div>
<div class="index-inner">
<p>
Please read the <a href="{{prefix}}static/faq.html">FAQ</a> before posting
</p>
</div>
<div class="index-inner">
<table class="posts-table">
<tbody>
<tr>
<td class="posts-td">
{{{postsgraph}}}
</td>
<td class="board-td">
{{! todo: move boardgraph into its own file like postsgraph }}
<table id="board-graph">
<thead>
<tr>
<th> {{#i18n.Translations}}{{board_label}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{posts_hour}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{posts_today}}{{/i18n.Translations}} </th>
<th> {{#i18n.Translations}}{{total}}{{/i18n.Translations}} </th>
</tr>
</thead>
<tbody>
{{# boardgraph}}
<tr>
<td>
<a id="board-{{Board}}" href="{{prefix}}{{Board}}-0.html">{{Board}}</a>
</td>
<td>
{{Hour}}
</td>
<td>
{{Day}}
</td>
<td>
{{All}}
</td>
</tr>
{{/ boardgraph}}
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
{{{overview}}}
</div>
</div>
</div>
<script type="text/javascript">
neochan_init(function() {
ready();
});
</script>
<hr/>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>

View File

@ -0,0 +1,37 @@
{{!
graph_history.mustache
template parameters:
- history ( a list of PostEntry instances, see srnd/model.go )
}}
<!doctype html>
<html>
<head>
<meta charset="utf-8"></meta>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<title>{{#i18n.Translations}}{{post_history_title}}{{/i18n.Translations}}</title>
</head>
<body>
<td>
<table id="history_graph">
<thead>
<tr>
<th>{{#i18n.Translations}}{{month}}{{/i18n.Translations}}</th>
<th>{{#i18n.Translations}}{{posts}}{{/i18n.Translations}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#history.Scale}}
<tr>
<td>{{Date}}</td>
<td class="history_num">{{Num}}</td>
<td>{{OvercockGraph}}</td>
</tr>
{{/history.Scale}}
</tbody>
</table>
</td>
</body>
</html>

View File

@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{api_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{api_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{api_username}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="user" value="{{dialog.User}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{api_password_name}}{{/i18n.Translations}}
</th>
<td>
<input type="password" name="pass" value="">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{api_secret_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="secret" value="{{dialog.Secret}}">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{binary_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{binary_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{convert_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="convert" value="{{dialog.Convert}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{ffmpeg_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="ffmpeg" value="{{dialog.FFmpeg}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{sox_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="sox" value="{{dialog.Sox}}">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{cache_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{cache_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
</th>
<td>
<input type="radio" name="cache" value="file" checked> {{#i18n.Translations}}{{file_cache_name}}{{/i18n.Translations}}
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="radio" name="cache" value="null"> {{#i18n.Translations}}{{null_cache_name}}{{/i18n.Translations}}
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="radio" name="cache" value="redis"> {{#i18n.Translations}}{{redis_cache_name}}{{/i18n.Translations}}
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,56 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{crypto_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{crypto_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{host_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="host" value="{{dialog.Host}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{key_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="key" value="{{dialog.Key}}">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,56 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{db_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{db_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
</th>
<td>
<input type="radio" name="db" value="postgres"> {{#i18n.Translations}}{{postgres_name}}{{/i18n.Translations}}
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="radio" name="db" value="redis" checked> {{#i18n.Translations}}{{redis_name}}{{/i18n.Translations}}
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,72 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{frontend_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{frontend_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{frontend_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="name" value="{{dialog.Name}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{locale_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="locale" value="{{dialog.Locale}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{allow_files_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="allow_files" value="1" checked>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{enable_json_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="json" value="1">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,56 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{key_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{key_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{pubkey_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="public" value="{{dialog.Public}}" size="65" readonly>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{secretkey_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="secret" value="{{dialog.Secret}}" size="65" readonly>
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,80 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{nntp_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{nntp_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{nntp_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="nntp_name" value="{{dialog.Name}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{allow_attachments_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="allow_attachments" value="1" checked>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{allow_anon_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="allow_anon" value="1" checked>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{allow_anon_attachments_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="allow_anon_attachments" value="1">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{require_tls_prompt}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="require_tls" value="1" checked>
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,72 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{postgres_db_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{postgres_db_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{host_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="host" value="{{dialog.Host}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{port_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="port" value="{{dialog.Port}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{username_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="user" value="{{dialog.Username}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{password_name}}{{/i18n.Translations}}
</th>
<td>
<input type="password" name="password" value="">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{host_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="host" value="{{dialog.Host}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{port_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="port" value="{{dialog.Port}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{password_name}}{{/i18n.Translations}}
</th>
<td>
<input type="password" name="password" value="">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,64 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{board.Prefix}}static/site.css" />
<link rel="stylesheet" href="{{board.Prefix}}static/user.css" />
<script type="text/javascript" src="{{board.Prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div class="installer_header">{{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}</div>
{{#dialog.HasError}}
<p class="installer_error">{{dialog.Error}}</p>
{{/dialog.HasError}}
<form action="" method="post" autocomplete="off">
<div id="install-outer">
<div id="installer-inner">
<table class="installer-tab">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{host_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="host" value="{{dialog.Host}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{port_name}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="port" value="{{dialog.Port}}">
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{password_name}}{{/i18n.Translations}}
</th>
<td>
<input type="password" name="password" value="">
</td>
</tr>
</tbody>
</table>
</div>
{{#dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{next_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
{{^dialog.HasNext}}
<input type="submit" value="{{#i18n.Translations}}{{finish_prompt}}{{/i18n.Translations}}" class="button" />
{{/dialog.HasNext}}
</div>
</form>
{{#dialog.HasPrevious}}
<div class="back_button">
<form action="" method="post">
<input type="hidden" name="back" value="true" />
<input type="submit" value="{{#i18n.Translations}}{{previous_prompt}}{{/i18n.Translations}}" class="button" />
</form>
</div>
{{/dialog.HasPrevious}}
</body>
</html>

View File

@ -0,0 +1,32 @@
{{!
keygen.mustache -- page containing a newly generated tripcode
template parameters:
- prefix ( the site prefix )
- public ( the public key in hex )
- secret ( the secret key in hex )
- tripcode ( html version of the public key )
}}
<!doctype html>
<html>
<head>
<meta charset="utf-8"></meta>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
<title>{{#i18n.Translations}}{{new_tripcode_title}}{{/i18n.Translations}}</title>
</head>
<body>
<div id="wrapper" class="fade-in">
<pre>{{#i18n.Translations}}{{new_tripcode_label}}{{/i18n.Translations}}:
<div id="secret_key">{{#i18n.Translations}}{{secret_key}}{{/i18n.Translations}}: {{secret}}</div>
<div id="public_key">{{#i18n.Translations}}{{public_key}}{{/i18n.Translations}}: {{public}}</div>
<div>{{#i18n.Translations}}{{tripcode}}{{/i18n.Translations}}: <span class="tripcode" id="capcode_key">{{{tripcode}}}</span></div>
</pre>
</div>
<script type="text/javascript">
neochan_init(function() {
ready();
});
</script>
</body>
</html>

View File

@ -0,0 +1,32 @@
{{!
live.mustache -- live ui
template parameters:
- prefix ( site prefix )
}}
<!doctype html>
<html>
<head>
<title> {{#i18n.Translations}}{{overboard_title}}{{/i18n.Translations}} </title>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale = 1.0,maximum-scale = 1.0" />
<link rel="stylesheet" href="{{prefix}}static/livechan.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<style type="text/css" id="convo_filter">
</style>
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
</head>
<body>
<noscript>you need js for livechan mode</noscript>
<script type="text/javascript" >
var e = document.createElement("div");
e.setAttribute("id", "chat");
e.setAttribute("style", "position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;");
document.body.appendChild(e);
var board = "";
if (location.hash != "" ) {
board = location.hash.substr(1);
}
new Chat(e, board, { prefix : "{{prefix}}" });
</script>
</body>
</html>

View File

@ -0,0 +1,49 @@
{{!
modfeed.mustache -- admin nntp feed page
template parameters:
- prefix ( the site's prefix )
}}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<!-- yes it uses js -->
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
<script type="text/javascript" src="{{prefix}}static/mod.js"></script>
<script type="text/javascript" src="{{prefix}}static/feed.js"></script>
<title> {{#i18n.Translations}}{{modpage_title}}{{/i18n.Translations}} </title>
</head>
<body onload="main()">
<div id="nntpchan_mod_result"></div>
<div class="nntpchan_feed_pane">
<pre> Add Feed </pre>
<label for="add_feed_host">Host</label>
<input id="add_feed_host" />
<label for="add_feed_host">Port</label>
<input id="add_feed_port" />
<label for="add_feed_name">Name</label>
<input id="add_feed_name" />
<button onclick="nntp_feed_add()">Add</button>
</div>
<div class="nntpchan_feed_pane">
<pre> Remove Feed </pre>
<label for="del_feed_name">Name</label>
<input id="del_feed_name" />
<button onclick="nntp_feed_del()">Remove</button>
</div>
<div class="nntpchan_feed_pane">
<pre> Sync Feeds </pre>
<button onclick="nntpchan_admin('feed.sync')">Sync All</button>
</div>
<div id="nntpchan_feed_result"></div>
<div id="nntpchan_feeds"></div>
<script>
nntp_feed_update();
</script>
<noscript>
<b>{{#i18n.Translations}}{{nojs_info}}{{/i18n.Translations}}</b>
</noscript>
</body>
</html>

View File

@ -0,0 +1,16 @@
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<title>{{#i18n.Translations}}{{login}}{{/i18n.Translations}}</title>
</head>
<body>
<form action="login" method="POST" name="modlogin">
<label for="mod_key">{{#i18n.Translations}}{{secret_key}}{{/i18n.Translations}}</label>
<input type="password" id="mod_key" name="privkey" />
<input type="submit" value="{{#i18n.Translations}}{{login}}{{/i18n.Translations}}" />
{{{csrfField}}}
</form>
</body>
</html>

View File

@ -0,0 +1,20 @@
{{!
modlogin_result.mustache -- shows the result of a login attempt
template parameters:
- prefix ( the site prefix )
- mod_prefix ( the prefix to the mod panel, could be something like https://mod.site.tld/ or /mod/ )
- message ( the message returned from the login attempt )
- fail ( present if the login failed ) // not yet added
}}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<meta http-equiv="refresh" content="1; {{mod_prefix}}"></meta>
<title>{{#i18n.Translations}}{{login}}{{/i18n.Translations}}</title>
</head>
<body>
<p>{{message}}</p>
</body>
</html>

View File

@ -0,0 +1,109 @@
{{!
modpage.mustache -- the moderator panel when logged in
template parameters:
- prefix ( the site's prefix )
}}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<!-- yes it uses js -->
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
<script type="text/javascript" src="{{prefix}}static/mod.js"></script>
<title> {{#i18n.Translations}}{{modpage_title}}{{/i18n.Translations}} </title>
</head>
<body onload="main()">
<div>
<div> {{#i18n.Translations}}{{post_actions_label}}{{/i18n.Translations}} </div>
<hr />
<div>
<label for="nntpchan_mod_target">{{#i18n.Translations}}{{target_label}}{{/i18n.Translations}}</label>
<input id="nntpchan_mod_target" type="text" />
</div>
<div>
<button onclick="nntpchan_ban()">{{#i18n.Translations}}{{ban_url_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_delete()">{{#i18n.Translations}}{{delete_url_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_unban()">{{#i18n.Translations}}{{unban_ip_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<div> {{#i18n.Translations}}{{key_actions_label}}{{/i18n.Translations}} </div>
<div>
<label for="nntpchan_board_target">{{#i18n.Translations}}{{pubkey_label}}{{/i18n.Translations}}:</label>
<input type="text" id="nntpchan_key_target" />
</div>
<div>
<button onclick="nntpchan_key_add()">{{#i18n.Translations}}{{add_key_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_key_del()">{{#i18n.Translations}}{{remove_key_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<div> {{#i18n.Translations}}{{nntp_login_label}}{{/i18n.Translations}} </div>
<div>
<label for="nntpchan_nntp_username">{{#i18n.Translations}}{{username}}{{/i18n.Translations}}:</label>
<input id="nntpchan_nntp_username" />
</div>
<div>
<label for="nntpchan_nntp_passwd">{{#i18n.Translations}}{{password}}{{/i18n.Translations}}:</label>
<input type="password" id="nntpchan_nntp_passwd" />
</div>
<div>
<button onclick="nntpchan_admin_nntp('nntp.login.add')">{{#i18n.Translations}}{{add_user_prompt}}{{/i18n.Translations}}</button>
</div>
<div>
<button onclick="nntpchan_admin_nntp('nntp.login.del')">{{#i18n.Translations}}{{remove_user_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<div> {{#i18n.Translations}}{{board_actions_label}}{{/i18n.Translations}} </div>
<div>
<label for="nntpchan_board_target">{{#i18n.Translations}}{{board_name_title}}{{/i18n.Translations}}:</label>
<input id="nntpchan_board_target" />
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.add')">{{#i18n.Translations}}{{add_board_prompt}}{{/i18n.Translations}}</button>
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.regen')">{{#i18n.Translations}}{{regenerate_prompt}}{{/i18n.Translations}}</button>
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.ban')">{{#i18n.Translations}}{{ban_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_admin_board('frontend.unban')">{{#i18n.Translations}}{{unban_prompt}}{{/i18n.Translations}}</button>
</div>
<div>
<button onclick="nntpchan_admin_board('frontend.nuke')">{{#i18n.Translations}}{{nuke_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<div>
{{#i18n.Translations}}{{light_actions_label}}{{/i18n.Translations}}
</div>
<div>
<button onclick="nntpchan_admin('template.reload')">{{#i18n.Translations}}{{reload_templates_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<hr />
<div>
<label>{{#i18n.Translations}}{{heavy_actions_label}}{{/i18n.Translations}}</label>
<div>
<button onclick="nntpchan_admin('frontend.regen')">{{#i18n.Translations}}{{regenerate_markup_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_admin('thumbnail.regen')">{{#i18n.Translations}}{{regenerate_thumbs_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_admin('feed.sync')">{{#i18n.Translations}}{{feed_sync_prompt}}{{/i18n.Translations}}</button>
<button onclick="nntpchan_admin('store.expire')">{{#i18n.Translations}}{{expire_old_prompt}}{{/i18n.Translations}}</button>
</div>
</div>
<div>
<a href="{{prefix}}mod/feeds">nntp feed management</a>
</div>
<div id="nntpchan_mod_result"></div>
<noscript>
<b>{{#i18n.Translations}}{{nojs_info}}{{/i18n.Translations}}</b>
</noscript>
</body>
</html>

View File

@ -0,0 +1,48 @@
{{!
navbar.mustache -- element on the top of each nod-mod page
TODO: make this not suck, have a board list, have board page list
template parameters:
- name ( the name of whatever resource we are on, board/thread )
- frontend ( the name of the frontend we are on )
- links ( a list of Link Models to display )
- prefix ( site prefix )
}}
<div class="navbar">
<span class="navbar-name">
<span class="board_title">{{name}}</span>
{{#i18n.Translations}}{{navbar_on}}{{/i18n.Translations}}
<span class="frontend_title">{{frontend}}</span>
</span>
<span class="navbar-sep">
|
</span>
<span class="navbar-links">
<span class="navbar-links-title">
Pages:
</span>
{{# links }}
<span class="navbar-link"><a href="{{LinkURL}}">{{Text}}</a></span>
{{/ links }}
</span>
<span class="navbar-sep">
|
</span>
<span class="navbar-links">
<span class="navbar-link"><a href="{{prefix}}">{{#i18n.Translations}}{{front_page_title}}{{/i18n.Translations}}</a></span>
</span>
<span class="navbar-sep">
|
</span>
<span class="navbar-links">
<span class="navbar-link"><a href="{{prefix}}ukko.html">{{#i18n.Translations}}{{overboard_title}}{{/i18n.Translations}}</a></span>
</span>
<span class="navbar-sep">
|
</span>
<span class="navbar-right navbar-links">
<span class="navbar-link" onclick="neochan_navbar_options_clicked(this)">[options]</span>
</span>
</div>
<hr />

View File

@ -0,0 +1,56 @@
<html>
<head>
<title>{{#i18n.Translations}}{{new_board_title}}{{/i18n.Translations}}</title>
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<script type="text/javascript" src="{{prefix}}static/newboard.js">
</script>
</head>
<body>
<p>{{#i18n.Translations}}{{first_post_label}}{{/i18n.Translations}}</p>
<hr />
<form action="{{prefix}}post/" enctype="multipart/form-data" name="post" method="post" id="postform" >
<div id="postform-outer">
<div id="postform-inner">
<table class="postform">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{board_name_title}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="name" value="" id="boardname" />
<button onclick="createBoard()">Create Board</button>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{comment}}{{/i18n.Translations}}
</th>
<td>
<textarea id="postform_message" name="message" cols=40 rows=5></textarea>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{captcha}}{{/i18n.Translations}}
</th>
<td>
<img id="captcha_img" src="{{prefix}}captcha/img" alt="captcha" />
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{solution}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="captcha" />
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</body>
</html>

View File

@ -0,0 +1,25 @@
{{! overview.mustache
paramters:
- overview (list of PostModels in order of last posted)
}}
<table id="overview_graph">
<thead>
<tr>
<th>{{#i18n.Translations}}{{newsgroup}}{{/i18n.Translations}}</th>
<th>{{#i18n.Translations}}{{posted}}{{/i18n.Translations}}</th>
<th>{{#i18n.Translations}}{{subject}}{{/i18n.Translations}}</th>
</tr>
</thead>
<tbody>
{{#overview}}
<tr>
<td><a href="{{Prefix}}{{Board}}-0.html">{{Board}}</td>
<td>{{Date}}</td>
<td><a href="{{PostURL}}">{{Truncate.Subject}}</a></td>
</tr>
{{/overview}}
</tbody>
</table>

View File

@ -0,0 +1,66 @@
<div id="{{post.PostHash}}" class="{{post.CSSClass}}"
data-frontend="{{post.Frontend}}"
data-newsgroup="{{post.Board}}"
data-msgid="{{post.MessageID}}"
data-msgidhash="{{post.PostHash}}"
data-rootmsgid="{{post.Reference}}"
data-rootmsgidhash="{{post.ReferenceHash}}"
{{#post.Sage}}
data-sage="1"
{{/post.Sage}}
{{#post.IsI2P}}
data-origin="i2p"
{{/post.IsI2P}}
{{#post.IsTor}}
data-origin="tor"
{{/post.IsTor}}
{{#post.IsClearnet}}
data-origin="clearnet"
{{/post.IsClearnet}}
data-posturl="{{post.PostURL}}">
<legend class="postheader">
<span class="origin">
{{#post.IsI2P}}
<img src="{{post.Prefix}}static/i2p.png" title="{{#i18n.Translations}}{{from_i2p}}{{/i18n.Translations}}" />
{{/post.IsI2P}}
{{#post.IsTor}}
<img src="{{post.Prefix}}static/tor.png" title="{{#i18n.Translations}}{{from_tor}}{{/i18n.Translations}}" />
{{/post.IsTor}}
{{#post.IsClearnet}}
<img src="{{post.Prefix}}static/clearnet.png" title="{{#i18n.Translations}}{{from_clearnet}}{{/i18n.Translations}}" />
{{/post.IsClearnet}}
</span>
<div class="postreply">
<a class="postno" onclick="nntpchan_reply(this, '{{post.ShortHash}}');" root="{{post.Reference}}" boardname="{{post.Board}}">&gt;&gt;{{post.ShortHash}}</a>
<a href="{{post.PostURL}}">[{{#i18n.Translations}}{{reply_label}}{{/i18n.Translations}}]</a>
</div>
<div>
Subject: <span class="subject">{{post.Subject}}</span>
</div>
<div>
Name: <span class="name">{{post.Name}}</span><span clas="tripcode">{{{post.Pubkey}}}</span>
</div>
<div>
MessageID: <span class="msgid">{{post.MessageID}}</span>
</div>
<div>
Date: <time datetime="{{post.DateRFC}}">{{post.Date}}</time>
</div>
</legend>
<hr>
<div class="attachments">
{{#post.Attachments}}
<figure data-sha512="{{Hash}}">
<figcaption>
<a class="download_link" href="{{Source}}" download="{{Filename}}">{{#i18n.Translations}}{{download_prompt}}{{/i18n.Translations}}</a>
<a class="file" href="{{Source}}" title="{{Filename}}" target="_blank"><img src="{{Thumbnail}}" alt="{{Filename}}" class="thumbnail"/></a>
<a class="fname_link" title="{{Filename}}" href="{{Source}}">{{Filename}}</a>
</figcaption>
</figure>
{{/post.Attachments}}
</div>
<div class="post_body">
<pre>{{{post.RenderBody}}}</pre>
</div>
<hr>
</div>

View File

@ -0,0 +1,11 @@
<!doctype html>
<html>
<meta charset="utf-8" />
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
<meta http-equiv="refresh" content="5; {{redirect_url}}" />
<body>
<pre>{{#i18n.Translations}}{{post_failed_label}}{{/i18n.Translations}}: {{reason}}</pre>
</body>
</html>

View File

@ -0,0 +1,49 @@
<!doctype html>
<html>
<head>
<title> try again </title>
<meta charset="utf-8" />
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link rel="stylesheet" href="{{prefix}}static/user.css" />
</head>
<body>
<form enctype="multipart/form-data" name="post" method="post">
{{#attachment}}
<input type="hidden" name="attachment_data" value="{{attachment}}" />
<input type="hidden" name="attachment_filename" value="{{attachment_filename}}" />
<input type="hidden" name="attachment_mime" value="{{attachment_type}}" />
{{/attachment}}
<input type="hidden" name="reference" value="{{reference}}" />
<input type="hidden" name="name" value="{{name}}" />
<input type="hidden" name="subject" value="{{subject}}" />
<input type="hidden" name="captcha_id" value="{{captcha_id}}" />
<input type="hidden" name="message" value="{{message}}" />
<div id="postform-outer">
<div id="postform-inner">
<div>{{fail_message}}</div>
<table class="postform">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{captcha}}{{/i18n.Translations}}
</th>
<td>
<img id="captcha_img" src="{{prefix}}captcha/{{captcha_id}}.png" alt="captcha" />
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{solution}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="captcha" />
<input type="submit" value="Post" class="button" />
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</body>
</html>

View File

@ -0,0 +1,17 @@
{{!
post_success.mustache -- shown when we do a successful post
template parameters:
- redirect_url ( the url of the next page we should redirect to )
- message_id ( the value of the Message-ID header in the post we made, the truncated sha1 of this is the >>posthash )
}}
<!doctype html>
<html>
<meta charset="utf-8" />
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
<meta http-equiv="refresh" content="4; {{redirect_url}}" />
<body>
<pre>{{#i18n.Translations}}{{posted_as_label}}{{/i18n.Translations}} {{message_id}}</pre>
</body>
</html>

View File

@ -0,0 +1,93 @@
{{!
postform.mustache -- the form for posting
template parameters:
- post_url ( the url of the post form )
- reference ( the post we are replying to, or empty string if it's an op )
- button ( the text for the reply button )
- files ( bool, do we allow attachments ? )
- csrf ( csrf token )
}}
<form action="{{post_url}}" enctype="multipart/form-data" name="post" method="post">
{{{csrf}}}
<input type="hidden" name="reference" value="{{reference}}" id="postform_reference"/>
<div id="postform-outer">
<div id="postform-inner">
<table class="postform">
<tbody>
<tr>
<th>
{{#i18n.Translations}}{{name}}{{/i18n.Translations}}
</th>
<td>
<span>
<input type="text" name="name" value="" id="postform_name" />
<span id="postform_msg"></span>
</span>
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{subject}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="subject" value="" id="postform_subject" />
<input type="submit" value="{{button}}" class="button" id="postform_submit" />
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{comment}}{{/i18n.Translations}}
</th>
<td>
<textarea id="postform_message" name="message" cols=40 rows=5></textarea>
</td>
</tr>
{{#files}}
<tr>
<th>
{{#i18n.Translations}}{{file}}{{/i18n.Translations}}
</th>
<td>
<input class="postform_attachment" id="postform_attachments" type="file" name="attachment_uploaded" multiple />
</td>
</tr>
{{/files}}
<tr>
<th>
{{#i18n.Translations}}{{dubs}}{{/i18n.Translations}}
</th>
<td>
<input type="checkbox" name="dubs" />
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{captcha}}{{/i18n.Translations}}
</th>
<td>
<img id="captcha_img" src="{{prefix}}captcha/img" alt="captcha" />
</td>
</tr>
<tr>
<th>
{{#i18n.Translations}}{{solution}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="captcha" autocomplete="off" id="captcha_solution" />
</td>
</tr>
<!-- <tr>
<th>
{{#i18n.Translations}}{{cuckoo_pow}}{{/i18n.Translations}}
</th>
<td>
<input type="text" name="pow" autocomplete="off" id="miner_result" /><input id="start_miner" class="button" type="button" value="{{#i18n.Translations}}{{start_mining}}{{/i18n.Translations}}"/>
</td>
</tr> -->
</tbody>
</table>
</div>
</div>
</form>

View File

@ -0,0 +1,25 @@
{{!
posts graph.mustache -- post frequence graph
parameters:
* graph - a postsGraph instance (see srnd/model.go)
}}
<table id="posts_graph">
<thead>
<tr>
<th>{{#i18n.Translations}}{{day}}{{/i18n.Translations}}</th>
<th>{{#i18n.Translations}}{{posts}}{{/i18n.Translations}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#graph.Scale}}
<tr>
<td>{{Day}}</td>
<td>{{Num}}</td>
<td>{{OvercockGraph}}</td>
</tr>
{{/graph.Scale}}
</tbody>
</table>

View File

@ -0,0 +1,60 @@
{{!
thread.mustache -- renders to a thread-*.html page, shows the entire thread
template parameters:
- board ( the Board Model of the board this thread was posted in )
- thread ( the Thread Model of the current thread being rendered )
Thread Model attributes:
- OP , the Post Model of the original poster
- Replies , a list of all the replies or empty if none
- Board , the name of the Board this thread is on
- BoardURL , the url that points to the board index page
}}
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<link rel="stylesheet" href="{{thread.Prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{thread.Prefix}}static/user.css" />
<script src="{{thread.Prefix}}static/nntpchan.js" type="text/javascript"></script>
<title> {{thread.OP.Subject}} </title>
</head>
<body>
<!-- begin navbar -->
{{{thread.Navbar}}}
<!-- end navbar -->
<center>
<div id="nntpchan_banner">
</div>
</center>
<div class="board_header">{{thread.Board}}</div>
<!-- postform -->
<div id="postform_container">
{{{form}}}
</div>
<hr />
<div class="thread" id="thread_{{thread.OP.PostHash}}">
<div class="thread_header">
</div>
{{{thread.OP.RenderPost}}}
{{# thread.Replies}}
{{{RenderPost}}}
{{/ thread.Replies}}
</div>
<hr/>
<div class="navLinks">[<a href="{{thread.BoardURL}}" accesskey="a">{{#i18n.Translations}}{{return}}{{/i18n.Translations}}</a>] [<a href="{{thread.Prefix}}catalog-{{thread.Board}}.html" accesskey="r">{{#i18n.Translations}}{{catalog_label}}{{/i18n.Translations}}</a>] [<a href="#thread_{{thread.OP.PostHash}}">{{#i18n.Translations}}{{to_top_label}}{{/i18n.Translations}}</a>] [<a href="#navlinks" accesskey="r" onclick="location.reload();">{{#i18n.Translations}}{{update}}{{/i18n.Translations}}</a>]</div>
<script type="text/javascript">
var prefix = "{{thread.Prefix}}";
var e = document.getElementById("nntpchan_banner");
nntpchan_inject_banners(e, prefix);
init(prefix);
ready();
</script>
<hr/>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>

View File

@ -0,0 +1,53 @@
{{!
ukko.mustache -- overboard, contains the last threads posted regardless of newsgroup
template parameters:
- prefix ( site prefix )
- threads ( a list of Thread Models that represent the latest threads )
}}
<!doctype html>
<html>
<head>
<title> {{#i18n.Translations}}{{overboard_title}}{{/i18n.Translations}} </title>
<meta charset="utf-8" />
<link rel="stylesheet" href="{{prefix}}static/site.css" />
<link id="current_theme" rel="stylesheet" href="{{prefix}}static/user.css" />
<script type="text/javascript" src="{{prefix}}static/nntpchan.js"></script>
</head>
<body>
<center>
<div id="nntpchan_banner">
</div>
</center>
<!-- begin navbar -->
{{{navbar}}}
<!-- end navbar -->
<div class="board_header"> {{#i18n.Translations}}{{overboard_title}}{{/i18n.Translations}} </div>
<div id="ukko_threads">
<pre><a href="{{prefix}}livechan/">livechan</a></pre>
{{#threads}}
<div class="thread" id="thread_{{OP.PostHash}}">
<div class="ukko_thread_header">
<p>{{#i18n.Translations}}{{posted_on_label}}{{/i18n.Translations}} <a href="{{{BoardURL}}}"><span class="ukko_boardname">{{OP.Board}}</span></a></p>
</div>
{{{OP.Truncate.RenderPost}}}
{{#Truncate.Replies}}
{{{Truncate.RenderPost}}}
{{/Truncate.Replies}}
</div>
<hr />
{{/threads}}
</div>
<script type="text/javascript" >
var prefix = "{{prefix}}";
var e = document.getElementById("nntpchan_banner");
nntpchan_inject_banners(e, prefix);
init(prefix);
ready();
</script>
<hr/>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</html>