273 lines
9.9 KiB
Cheetah
273 lines
9.9 KiB
Cheetah
#! stdtmpl
|
|
#proc genMain(c: var TForumData, content: string, title = "Nimrod Forum",
|
|
# additional_headers = "", showRssLinks = false): string =
|
|
# result = ""
|
|
# var stats: TForumStats
|
|
# if c.isThreadsList: stats = c.getStats(false)
|
|
# else:
|
|
# stats = c.getStats(true)
|
|
# end if
|
|
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<title>${xmlEncode(title)}</title>
|
|
<link rel="stylesheet" href="${c.req.makeUri("css/style.css", absolute = false)}">
|
|
<link rel="shortcut icon" href="${c.req.makeUri("favicon.ico", absolute = false)}">${additional_headers}
|
|
<meta charset="UTF-8">
|
|
</head>
|
|
<body>
|
|
<!--- #head --->
|
|
#let frontQuery = c.req.makeUri("/")
|
|
<header id="head" class="forum">
|
|
<div class="wide-layout tall">
|
|
<div id="head-logo"></div>
|
|
<a id="head-logo-link" href="/"></a>
|
|
<nav id="head-links">
|
|
<a href="http://nim-lang.org/">home</a>
|
|
<a href="http://nim-lang.org/documentation.html">docs</a>
|
|
<a href="http://nim-lang.org/download.html">download</a>
|
|
<a href="${frontQuery}" class="active">forum</a>
|
|
<a href="http://nim-lang.org/community.html">community</a>
|
|
<a href="http://nim-lang.org/question.html">faq</a>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<!--- #neck --->
|
|
<section id="neck">
|
|
<div class="wide-layout tall">
|
|
<div style="right: 131px;" id="glow-arrow" class="forum"></div>
|
|
</div>
|
|
</section>
|
|
|
|
<!--- #body --->
|
|
<section id="body" class="forum">
|
|
<div id="body-border"></div>
|
|
<div id="body-border-left"></div>
|
|
<div id="body-border-right"></div>
|
|
<div id="body-border-bottom"></div>
|
|
<div id="glow-line"></div>
|
|
<div id="glow-line-bottom"></div>
|
|
<div class="talk-layout">
|
|
<article id="content">
|
|
${content}
|
|
#if c.isThreadsList:
|
|
<div id="talk-info">
|
|
<div class="info">
|
|
<div>
|
|
${c.genListOnline(stats)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
#if not c.noPagenumumNav:
|
|
<div id="talk-nav">
|
|
${genPagenumNav(c, stats)}
|
|
</div>
|
|
#end if
|
|
#elif hasReplyBtn(c):
|
|
<div id="talk-info">
|
|
<div class="info-post">
|
|
<div>
|
|
${genPagenumNav(c, stats)}
|
|
</div>
|
|
</div>
|
|
<div class="user-post">
|
|
#if c.loggedIn():
|
|
#let replyUri = c.req.makeUri(c.req.path & "?action=reply#reply")
|
|
<a href="$replyUri">
|
|
<div>
|
|
<span class="reply">Reply</span>
|
|
</div>
|
|
</a>
|
|
#end if
|
|
</div>
|
|
</div>
|
|
#end if
|
|
|
|
</article>
|
|
<div id="sidebar">
|
|
<div class="title">Search</div>
|
|
<div class="content">
|
|
#if isFTSAvailable:
|
|
<a href="/search-help" target="_blank" class="searchHelp">?</a>
|
|
<form method="post" action="/search" class="searchForm">
|
|
<input type="text" name="q" maxlength="255" value="${c.search}" title="Search this forum" />
|
|
<input type="submit" value="Search" class="button search">
|
|
</form>
|
|
#else:
|
|
<form method="get" action="http://www.google.com/search" target="_blank" class="searchForm">
|
|
<input type="text" name="q" maxlength="255" value="${c.search}" title="Search this forum" />
|
|
<input type="submit" value="Search" class="button search">
|
|
<input type="hidden" name="sitesearch" value="http://forum.nimrod-lang.org" />
|
|
</form>
|
|
#end if
|
|
</div>
|
|
#if c.loggedIn:
|
|
<div class="title">Your account</div>
|
|
<div class="content user">
|
|
#let profileUrl = c.req.makeUri("profile/", false) &
|
|
# xmlEncode(c.username)
|
|
<a href="$profileUrl" class="user">${c.username}</a>
|
|
<a href="$profileUrl" class="avatar">${genGravatar(c.email)}</a>
|
|
<a href="${frontQuery}newthread" class="button">New Thread</a>
|
|
<a href="$profileUrl" class="button">My Profile</a>
|
|
|
|
<a href="${frontQuery}logout" class="button logout">Logout</a>
|
|
|
|
</div>
|
|
#else:
|
|
<div class="title">Login</div>
|
|
<div class="content">
|
|
<form name="login" action="${frontQuery}dologin" method="POST">
|
|
<span>Username: </span><input type="text" name="name" />
|
|
<span>Password: </span><input type="password" name="password" />
|
|
<input type="submit" style="display: none;"
|
|
id="hdnLogin" value="Login" />
|
|
</form>
|
|
#if c.errorMsg != "" and c.req.pathInfo.normalizeUri == "/dologin":
|
|
<span class="error">$c.errorMsg</span>
|
|
#end if
|
|
<a href="${frontQuery}register" class="button"
|
|
style="float: left;">Register</a>
|
|
<a href="#" onclick="document.forms['login'].submit()"
|
|
class="button">Login</a>
|
|
</div>
|
|
#end if
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!--- #foot --->
|
|
<footer id="foot" class="forum">
|
|
<div class="talk-layout tall">
|
|
<div id="foot-links">
|
|
<div>
|
|
<h4>Documentation</h4>
|
|
<a href="http://nim-lang.org/documentation.html">Stable Documentation</a>
|
|
<a href="https://github.com/Araq/Nimrod/issues">Github Issues & Requests</a>
|
|
</div>
|
|
<div>
|
|
<h4>Community</h4>
|
|
<a href="http://forum.nim-lang.org">User Forum</a>
|
|
<a href="http://webchat.freenode.net/?channels=nim">Online IRC</a>
|
|
<a href="http://irclogs.nim-lang.org/">IRC Logs</a>
|
|
</div>
|
|
</div>
|
|
<div id="foot-legal">
|
|
<h4>Written in Nim - Powered by <a href="https://github.com/dom96/jester">Jester</a></h4>
|
|
Web Design by <a href="http://reign-studios.net/philipwitte/">Philip Witte</a> & <a href="http://picheta.me">Dominik Picheta</a><br>
|
|
Copyright © 2014 - <a href="http://nim-lang.org/blog/">Andreas Rumpf</a> & <a href="https://github.com/Araq/Nimrod/graphs/contributors">Contributors</a>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
<script src="${frontQuery}js/arrow.js"></script>
|
|
<script src="${frontQuery}js/forum.js"></script>
|
|
</body>
|
|
</html>
|
|
#end proc
|
|
#
|
|
#proc genRSSHeaders(c: var TForumData): string =
|
|
# result = ""
|
|
<link href="${c.req.makeUri("/threadActivity.xml")}" title="Thread activity"
|
|
type="application/atom+xml" rel="alternate">
|
|
<link href="${c.req.makeUri("/postActivity.xml")}" title="Post activity"
|
|
type="application/atom+xml" rel="alternate">
|
|
#end proc
|
|
#
|
|
#proc genThreadsRSS(c: var TForumData): string =
|
|
# result = ""
|
|
# const query = sql"""SELECT A.id, A.name,
|
|
# strftime('%Y-%m-%dT%H:%M:%SZ', (A.modified)),
|
|
# COUNT(B.id), C.name, B.content, B.id
|
|
# FROM thread AS A, post AS B, person AS C
|
|
# WHERE A.id = b.thread AND B.author = C.id
|
|
# GROUP BY B.thread
|
|
# ORDER BY modified DESC LIMIT ?"""
|
|
# const threadId = 0
|
|
# const name = 1
|
|
# const threadDate = 2
|
|
# const postCount = 3
|
|
# const postAuthor = 4
|
|
# const postContent = 5
|
|
# const postId = 6
|
|
# let frontQuery = c.req.makeUri("/")
|
|
# let recent = getValue(db, sql"""SELECT
|
|
# strftime('%Y-%m-%dT%H:%M:%SZ', (modified)) FROM thread
|
|
# ORDER BY modified DESC LIMIT 1""")
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
<feed xmlns="http://www.w3.org/2005/Atom">
|
|
<title>Nimrod forum thread activity</title>
|
|
<link href="${c.req.makeUri("/threadActivity.xml")}" rel="self" />
|
|
<link href="${frontQuery}" />
|
|
<id>${frontQuery}</id>
|
|
<updated>${recent}</updated>
|
|
# for row in rows(db, query, 10):
|
|
<entry>
|
|
<title>${xmlEncode(%name)}</title>
|
|
<id>urn:entry:${%threadid}</id>
|
|
# let url = c.genThreadUrl(threadid = %threadid,
|
|
# pageNum = $(ceil(parseInt(%postCount) / PostsPerPage).int)) &
|
|
# "#" & %postId
|
|
<link rel="alternate" type="text/html"
|
|
href="${c.req.makeUri(url)}"/>
|
|
<published>${%threadDate}</published>
|
|
<updated>${%threadDate}</updated>
|
|
<author><name>${xmlEncode(%postAuthor)}</name></author>
|
|
<content type="html"
|
|
>Posts ${%postCount}, ${xmlEncode(%postAuthor)} said:
|
|
<p>
|
|
${xmlEncode(rstToHtml(%postContent))}</content>
|
|
</entry>
|
|
# end for
|
|
</feed>
|
|
#end proc
|
|
#
|
|
#proc genPostsRSS(c: var TForumData): string =
|
|
# result = ""
|
|
# const query = sql"""SELECT A.id, B.name, A.content, A.thread,
|
|
# A.header, strftime('%Y-%m-%dT%H:%M:%SZ', A.creation),
|
|
# A.creation, COUNT(C.id)
|
|
# FROM post AS A, person AS B, post AS C
|
|
# WHERE A.author = B.id AND A.thread = C.thread AND C.id <= A.id
|
|
# GROUP BY A.id
|
|
# ORDER BY A.creation DESC LIMIT ?"""
|
|
# const postId = 0
|
|
# const postAuthor = 1
|
|
# const postContent = 2
|
|
# const postThread = 3
|
|
# const postHeader = 4
|
|
# const postRssDate = 5
|
|
# const postHumanDate = 6
|
|
# const postPosition = 7
|
|
# let frontQuery = c.req.makeUri("/")
|
|
# let recent = getValue(db, sql"""SELECT
|
|
# strftime('%Y-%m-%dT%H:%M:%SZ', creation) FROM post
|
|
# ORDER BY creation DESC LIMIT 1""")
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
<feed xmlns="http://www.w3.org/2005/Atom">
|
|
<title>Nimrod forum post activity</title>
|
|
<link href="${c.req.makeUri("/postActivity.xml")}" rel="self" />
|
|
<link href="${frontQuery}" />
|
|
<id>${frontQuery}</id>
|
|
<updated>${recent}</updated>
|
|
# for row in rows(db, query, 10):
|
|
<entry>
|
|
<title>${xmlEncode(%postHeader)}</title>
|
|
<id>urn:entry:${%postId}</id>
|
|
# let url = c.genThreadUrl(threadid = %postThread,
|
|
# pageNum = $(ceil(parseInt(%postPosition) / PostsPerPage).int)) &
|
|
# "#" & %postId
|
|
<link rel="alternate" type="text/html"
|
|
href="${c.req.makeUri(url)}"/>
|
|
<published>${%postRssDate}</published>
|
|
<updated>${%postRssDate}</updated>
|
|
<author><name>${xmlEncode(%postAuthor)}</name></author>
|
|
<content type="html"
|
|
>On ${xmlEncode(%postHumanDate)}, ${xmlEncode(%postAuthor)} said:
|
|
<p>
|
|
${xmlEncode(rstToHtml(%postContent))}</content>
|
|
</entry>
|
|
# end for
|
|
</feed>
|
|
#end proc
|