mirror of
https://github.com/Eggbertx/gochan.git
synced 2025-08-20 09:26:23 -07:00
display recent posts on front page, fix posts on thread page
This commit is contained in:
parent
b56683abe5
commit
edf9485be8
12 changed files with 186 additions and 123 deletions
3
build.sh
3
build.sh
|
@ -1,2 +1,3 @@
|
|||
#!/bin/bash
|
||||
go build -v -o gochan ./src
|
||||
export GOPATH=$PWD/lib
|
||||
go build -v -o gochan ./src
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
* {
|
||||
-ms-word-break: break-all;
|
||||
word-break: break-all;
|
||||
|
||||
word-break: break-word;
|
||||
|
||||
-webkit-hyphens: auto;
|
||||
-moz-hyphens: auto;
|
||||
hyphens: auto;
|
||||
}
|
||||
|
||||
#footer {
|
||||
clear:both;
|
||||
display: block;
|
||||
|
|
|
@ -1,88 +1,86 @@
|
|||
#current-tab,#topbar li:hover {
|
||||
background-color:#404040;
|
||||
}
|
||||
/* imported by individual sass pre-compiled css files */
|
||||
* {
|
||||
outline: none; }
|
||||
|
||||
#footer {
|
||||
font-size:12px;
|
||||
}
|
||||
|
||||
#site-title {
|
||||
color:#e1b400;
|
||||
}
|
||||
font-size: 12px; }
|
||||
|
||||
#topbar {
|
||||
background-color:#202020;
|
||||
box-shadow:0px 2px 2px 3px #101010;
|
||||
height:26px;
|
||||
}
|
||||
background-color: #202020;
|
||||
box-shadow: 2px 2px 2px 3px #101010;
|
||||
height: 26px; }
|
||||
|
||||
#topbar li:hover {
|
||||
background-color: #404040; }
|
||||
|
||||
#footer {
|
||||
font-size: 12px; }
|
||||
|
||||
#site-title {
|
||||
color: #e1b400; }
|
||||
|
||||
#topbar {
|
||||
background-color: #202020;
|
||||
box-shadow: 2px 2px 2px 3px #101010;
|
||||
height: 26px; }
|
||||
|
||||
.topbar-item:hover {
|
||||
background-color: #404040;
|
||||
}
|
||||
background-color: #404040; }
|
||||
|
||||
.dropdown-button:hover{
|
||||
background-color: #404040;
|
||||
}
|
||||
.dropdown-button:hover {
|
||||
background-color: #404040; }
|
||||
|
||||
.dropdown-menu {
|
||||
background-color:#202020;
|
||||
box-shadow:0 6px 2px 2px #101010;
|
||||
}
|
||||
|
||||
.menu {
|
||||
margin-top:1em;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
.section-body {
|
||||
background-color:#606060;
|
||||
|
||||
}
|
||||
|
||||
.section-title-block {
|
||||
box-shadow: 2px 2px 3px 4px #101010;
|
||||
background-color:#202020;
|
||||
border-radius:8px;
|
||||
}
|
||||
|
||||
.tab {
|
||||
background-color:#202020;
|
||||
border:1px solid #424242;
|
||||
text-align:center;
|
||||
}
|
||||
background-color: #202020;
|
||||
box-shadow: 2px 2px 2px 3px #101010; }
|
||||
|
||||
a {
|
||||
background:inherit;
|
||||
color:#f90;
|
||||
font-family:sans-serif;
|
||||
text-decoration:none;
|
||||
}
|
||||
background: inherit;
|
||||
color: #f90;
|
||||
font-family: sans-serif;
|
||||
text-decoration: none; }
|
||||
|
||||
a.permalink {
|
||||
background:inherit;
|
||||
color:#f90;
|
||||
}
|
||||
background: inherit;
|
||||
color: #f90; }
|
||||
|
||||
a.permalink:hover {
|
||||
background:inherit;
|
||||
color:#ffd43f;
|
||||
}
|
||||
background: inherit;
|
||||
color: #ffd43f; }
|
||||
|
||||
a:hover {
|
||||
background:inherit;
|
||||
color:#ffd43f;
|
||||
font-family:sans-serif;
|
||||
}
|
||||
background: inherit;
|
||||
color: #ffd43f;
|
||||
font-family: sans-serif; }
|
||||
|
||||
body {
|
||||
background:#EEF2FF;
|
||||
background-attachment:fixed;
|
||||
background-image:url(images/pipes_bg.png);
|
||||
color:#d8d0b9;
|
||||
font-family:sans-serif;
|
||||
font-size:12pt;
|
||||
}
|
||||
background-image: url(images/pipes_bg.png);
|
||||
color: #d8d0b9;
|
||||
font-family: sans-serif;
|
||||
font-size: 12pt; }
|
||||
|
||||
ul.staffmenu li:hover {
|
||||
background:#404040;
|
||||
}
|
||||
background: #404040; }
|
||||
|
||||
#site-title {
|
||||
color: #e1b400; }
|
||||
|
||||
.section-body {
|
||||
background-color: #606060; }
|
||||
|
||||
.section-title-block {
|
||||
background-color: #202020;
|
||||
border-radius: 8px 8px 0px 0px; }
|
||||
|
||||
.tab {
|
||||
background-color: #404040;
|
||||
border: 1px solid #202020;
|
||||
text-align: center; }
|
||||
|
||||
#current-tab {
|
||||
background-color: #202020; }
|
||||
|
||||
div#recent-posts-header {
|
||||
box-shadow: 0px 2px 2px 3px #101010;
|
||||
border-radius: 8px 8px 8px 8px;
|
||||
margin-bottom: 8px; }
|
||||
|
|
|
@ -8,6 +8,6 @@
|
|||
<!--<img src="/error.png" border="0" alt=""> -->
|
||||
<p>The requested file could not be found on this server. Are you just typing random stuff in the address bar? If you followed a link from this site here, then post <a href="/site">here</a></p>
|
||||
<audio src="http://dl.dropbox.com/u/10266670/forever.wav" autoplay="autoplay"></audio>
|
||||
<hr><address>http://lunachan.net powered by Gochan v0.4</address>
|
||||
<hr><address>http://lunachan.net powered by Gochan v0.7</address>
|
||||
</body>
|
||||
</html>
|
|
@ -7,6 +7,6 @@
|
|||
<h1>500: Internal Server error</h1>
|
||||
<marquee><img src="/error/derpy server.gif" border="0" alt=""></marquee>
|
||||
<p>Someone let Derpy into the server room again...sorry about that. Please try reloading the page. If that doesn't fix the problem, you can email me <a href="mailto:admin@lunachan.net">here</a>, noting the time and the page you tried to access.
|
||||
<hr><address>http://lunachan.net powered by Gochan v0.4</address>
|
||||
<hr><address>http://lunachan.net powered by Gochan v0.7</address>
|
||||
</body>
|
||||
</html>
|
|
@ -6,6 +6,6 @@
|
|||
<body>
|
||||
<h1>500: Internal Server error</h1>
|
||||
<p>The server encountered an error while trying to serve the page. We apologize for the inconvenience.</p>
|
||||
<hr><address>http://lunachan.net powered by Gochan v0.4</address>
|
||||
<hr><address>http://lunachan.net powered by Gochan v0.7</address>
|
||||
</body>
|
||||
</html>
|
|
@ -810,6 +810,7 @@ var manage_functions = map[string]ManageFunction{
|
|||
var section_arr []interface{}
|
||||
var board_arr []interface{}
|
||||
var front_arr []interface{}
|
||||
var recent_posts_arr []interface{}
|
||||
|
||||
os.Remove(path.Join(config.DocumentRoot,"index.html"))
|
||||
front_file,err := os.OpenFile(path.Join(config.DocumentRoot,"index.html"),os.O_CREATE|os.O_RDWR,0777)
|
||||
|
@ -875,15 +876,48 @@ var manage_functions = map[string]ManageFunction{
|
|||
front_arr = append(front_arr,frontpage)
|
||||
}
|
||||
|
||||
// get recent posts
|
||||
rows,err = db.Query("SELECT `" + config.DBprefix + "posts`.`id`, " +
|
||||
"`" + config.DBprefix + "posts`.`parentid`, " +
|
||||
"`" + config.DBprefix +"boards`.`dir` AS boardname, " +
|
||||
"`" + config.DBprefix + "posts`.`boardid` AS boardid, " +
|
||||
"`name`, " +
|
||||
"`tripcode`, " +
|
||||
"`message`," +
|
||||
"`filename`, " +
|
||||
"`thumb_w`, " +
|
||||
"`thumb_h` " +
|
||||
" FROM `" + config.DBprefix + "posts`, " +
|
||||
"`" + config.DBprefix + "boards` " +
|
||||
"WHERE `" + config.DBprefix + "posts`.`deleted_timestamp` = \"" + nil_timestamp + "\"" +
|
||||
"ORDER BY `timestamp` DESC " +
|
||||
"LIMIT " + strconv.Itoa(config.MaxRecentPosts))
|
||||
if err != nil {
|
||||
error_log.Print(err.Error())
|
||||
return err.Error()
|
||||
}
|
||||
for rows.Next() {
|
||||
recent_posts := new(RecentPost)
|
||||
err = rows.Scan(&recent_posts.PostID, &recent_posts.ParentID, &recent_posts.BoardName, &recent_posts.BoardID, &recent_posts.Name, &recent_posts.Tripcode, &recent_posts.Message, &recent_posts.Filename, &recent_posts.ThumbW, &recent_posts.ThumbH)
|
||||
if err != nil {
|
||||
error_log.Print(err.Error())
|
||||
return err.Error()
|
||||
}
|
||||
recent_posts_arr = append(recent_posts_arr, recent_posts)
|
||||
}
|
||||
|
||||
page_data := &Wrapper{IName:"fronts", Data: front_arr}
|
||||
board_data := &Wrapper{IName:"boards", Data: board_arr}
|
||||
section_data := &Wrapper{IName:"sections", Data: section_arr}
|
||||
recent_posts_data := &Wrapper{IName:"recent posts", Data: recent_posts_arr}
|
||||
|
||||
|
||||
var interfaces []interface{}
|
||||
interfaces = append(interfaces, config)
|
||||
interfaces = append(interfaces, page_data)
|
||||
interfaces = append(interfaces, board_data)
|
||||
interfaces = append(interfaces, section_data)
|
||||
interfaces = append(interfaces, recent_posts_data)
|
||||
|
||||
wrapped := &Wrapper{IName: "frontpage",Data: interfaces}
|
||||
err = front_page_tmpl.Execute(front_file,wrapped)
|
||||
|
@ -968,7 +1002,22 @@ var manage_functions = map[string]ManageFunction{
|
|||
limit = "50"
|
||||
}
|
||||
html = "<h1>Recent posts</h1>\nLimit by: <select id=\"limit\"><option>25</option><option>50</option><option>100</option><option>200</option></select>\n<br />\n<table width=\"100%%d\" border=\"1\">\n<colgroup><col width=\"25%%\" /><col width=\"50%%\" /><col width=\"17%%\" /></colgroup><tr><th></th><th>Message</th><th>Time</th></tr>"
|
||||
rows,err := db.Query("SELECT HIGH_PRIORITY `" + config.DBprefix + "boards`.`dir` AS `boardname`, `" + config.DBprefix + "posts`.`boardid` AS boardid, `" + config.DBprefix + "posts`.`id` AS id, `" + config.DBprefix + "posts`.`parentid` AS parentid, `" + config.DBprefix + "posts`.`message` AS message, `" + config.DBprefix + "posts`.`ip` AS ip, `" + config.DBprefix + "posts`.`timestamp` AS timestamp FROM `" + config.DBprefix + "posts`, `" + config.DBprefix + "boards` WHERE `reviewed` = 0 AND `" + config.DBprefix + "posts`.`deleted_timestamp` = \""+nil_timestamp+"\" AND `boardid` = `"+config.DBprefix+"boards`.`id` ORDER BY `timestamp` DESC LIMIT "+limit+";")
|
||||
rows,err := db.Query("SELECT HIGH_PRIORITY `" + config.DBprefix + "boards`.`dir` AS `boardname`, " +
|
||||
"`" + config.DBprefix + "posts`.`boardid` AS boardid, " +
|
||||
"`" + config.DBprefix + "posts`.`id` AS id, " +
|
||||
"`" + config.DBprefix + "posts`. " +
|
||||
"`parentid` AS parentid, " +
|
||||
"`" + config.DBprefix + "posts`. " +
|
||||
"`message` AS message, " +
|
||||
"`" + config.DBprefix + "posts`. " +
|
||||
"`ip` AS ip, " +
|
||||
"`" + config.DBprefix + "posts`. " +
|
||||
"`timestamp` AS timestamp " +
|
||||
"FROM `" + config.DBprefix + "posts`, `" + config.DBprefix + "boards` " +
|
||||
"WHERE `reviewed` = 0 " +
|
||||
"AND `" + config.DBprefix + "posts`.`deleted_timestamp` = \""+nil_timestamp+"\" " +
|
||||
"AND `boardid` = `"+config.DBprefix+"boards`.`id` " +
|
||||
"ORDER BY `timestamp` DESC LIMIT "+limit+";")
|
||||
if err != nil {
|
||||
html += "<tr><td>"+err.Error()+"</td></tr></table>"
|
||||
return
|
||||
|
|
|
@ -174,6 +174,7 @@ func validReferrer(request http.Request) (valid bool) {
|
|||
}
|
||||
|
||||
func utilHandler(writer http.ResponseWriter, request *http.Request, data interface{}) {
|
||||
writer.Header().Add("Content-Type", "text/css")
|
||||
action := request.FormValue("action")
|
||||
board := request.FormValue("board")
|
||||
var err error
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
"text/template"
|
||||
"time"
|
||||
|
@ -40,11 +41,8 @@ var funcMap = template.FuncMap{
|
|||
}()
|
||||
return slice
|
||||
},
|
||||
"gt": func(a int, b int) bool {
|
||||
return a > b
|
||||
},
|
||||
"lt": func(a int, b int) bool {
|
||||
return a < b
|
||||
"stringAppend": func(a, b string) string {
|
||||
return a + b
|
||||
},
|
||||
"stringEq": func(a, b string) bool {
|
||||
return a == b
|
||||
|
@ -52,9 +50,19 @@ var funcMap = template.FuncMap{
|
|||
"stringNeq": func(a, b string) bool {
|
||||
return a != b
|
||||
},
|
||||
"truncateMessage": func(a string, b int) string {
|
||||
if len(a) < b {
|
||||
return a
|
||||
} else {
|
||||
return a[:b] + "..."
|
||||
}
|
||||
},
|
||||
"intEq": func(a, b int) bool {
|
||||
return a == b
|
||||
},
|
||||
"intToString": func(a int) string {
|
||||
return strconv.Itoa(a)
|
||||
},
|
||||
"isStyleDefault_img": func(style string) bool {
|
||||
return style == config.DefaultStyle_img
|
||||
},
|
||||
|
@ -83,11 +91,17 @@ var funcMap = template.FuncMap{
|
|||
return
|
||||
},
|
||||
"getThumbnailFilename": func(name string) string {
|
||||
filetype := name[len(name)-4:]
|
||||
if filetype == ".gif" || filetype == ".GIF" {
|
||||
return name[0:len(name)-3]+"jpg"
|
||||
if name == "" {
|
||||
return ""
|
||||
}
|
||||
return name
|
||||
fmt.Println(name[len(name) - 3:])
|
||||
if name[len(name) - 3:] == "gif" || name[len(name) - 3:] == "gif" {
|
||||
name = name[:len(name) - 3] + "jpg"
|
||||
}
|
||||
ext_begin := strings.LastIndex(name, ".")
|
||||
new_name := name[:ext_begin] + "t." + getFiletype(name)
|
||||
fmt.Println(new_name)
|
||||
return new_name
|
||||
},
|
||||
"formatFilesize": func(size_int int) string {
|
||||
size := float32(size_int)
|
||||
|
@ -110,11 +124,6 @@ var funcMap = template.FuncMap{
|
|||
index := strings.LastIndex(img, ".")
|
||||
return img[0:index]+"t."+filetype
|
||||
},
|
||||
"printValue": func(i interface{}) int {
|
||||
fmt.Println("interface: ", i.(string))
|
||||
fmt.Println("value: ", i)
|
||||
return 0
|
||||
},
|
||||
}
|
||||
|
||||
var (
|
||||
|
@ -186,7 +195,7 @@ func initTemplates() {
|
|||
|
||||
img_boardpage_tmpl_bytes,_ := ioutil.ReadFile(path.Join(config.TemplateDir,"img_boardpage.html"))
|
||||
if tmpl_err != nil {
|
||||
fmt.Println("Failed loading template \"" + config.TemplateDir+"/img_boardpage.html\": " + tmpl_err.Error())
|
||||
fmt.Println("Failed loading template \"" + config.TemplateDir + "/img_boardpage.html\": " + tmpl_err.Error())
|
||||
os.Exit(2)
|
||||
}
|
||||
img_boardpage_tmpl_str = "{{$config := getInterface .Data 0}}" +
|
||||
|
@ -241,6 +250,7 @@ func initTemplates() {
|
|||
"{{$page_arr := getInterface .Data 1}}" +
|
||||
"{{$board_arr := getInterface .Data 2}}" +
|
||||
"{{$section_arr := getInterface .Data 3}}" +
|
||||
"{{$recent_posts_arr := getInterface .Data 4}}" +
|
||||
string(front_page_tmpl_bytes)
|
||||
front_page_tmpl,tmpl_err = template.New("front_page_tmpl").Funcs(funcMap).Parse(front_page_tmpl_str)
|
||||
if tmpl_err != nil {
|
||||
|
|
|
@ -26,7 +26,12 @@ type RecentPost struct {
|
|||
BoardID int
|
||||
PostID int
|
||||
ParentID int
|
||||
Name string
|
||||
Tripcode string
|
||||
Message string
|
||||
Filename string
|
||||
ThumbW int
|
||||
ThumbH int
|
||||
IP string
|
||||
Timestamp time.Time
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<div id="main">
|
||||
<div id="tab-bar">
|
||||
<div id="current-tab" class="tab">
|
||||
<a href="#">Home</a>
|
||||
<a href="#">News</a>
|
||||
</div>
|
||||
<div class="tab">
|
||||
<a href="#boards">Boards</a>
|
||||
|
@ -105,38 +105,24 @@
|
|||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
<div id="recent-posts">
|
||||
<div class="section-title-box"><b>Recent Posts</b></div>
|
||||
<div class="section-block">
|
||||
<div class="section-title-block">
|
||||
<span class="section-title"><a href="/test/">/test/</a></span> - <b>Poster Mc</b>!Tripcode
|
||||
</div>
|
||||
<div class="section-body">
|
||||
<img src="135693079632s.png" alt="test img"/>
|
||||
TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT TOOT...<br /><i>(Post truncated, click <a href="/test/">here</a> to continue reading)</i>
|
||||
</div>
|
||||
</div>
|
||||
{{if gt $config.MaxRecentPosts 0}}
|
||||
<div id="recent-posts">
|
||||
<div id="recent-posts-header" class="section-title-block"><b>Recent Posts</b></div>
|
||||
{{range $i, $post := $recent_posts_arr.Data}}
|
||||
<div class="section-block">
|
||||
<div class="section-title-block">
|
||||
<span class="section-title"><a href="{{$post.BoardName}}/res/{{if intEq $post.ParentID 0}}{{intToString $post.PostID}}.html{{else}}{{intToString $post.ParentID}}.html#{{intToString $post.PostID}}{{end}}">/{{$post.BoardName}}/</a></span> - {{$appended := stringAppend $post.Name $post.Tripcode}}{{if stringEq $appended ""}}<b>Anonymous</b>{{else}}<b>{{$post.Name}}</b>{{if stringNeq $post.Tripcode ""}}!{{$post.Tripcode}}{{end}}{{end}}
|
||||
</div>
|
||||
<div class="section-body">
|
||||
{{if stringNeq $post.Filename ""}}<img src="{{$post.BoardName}}/thumb/{{getThumbnailFilename $post.Filename}}" alt="post thumbnail"/>{{end}}
|
||||
{{truncateMessage $post.Message 225}}
|
||||
|
||||
|
||||
<div class="section-block">
|
||||
<div class="section-title-block">
|
||||
<span class="section-title"><a href="/test/">/test/</a></span> - <b>Anonymous</b>
|
||||
</div>
|
||||
<div class="section-body">
|
||||
OP is a pony.
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<div class="section-block">
|
||||
<div class="section-title-block">
|
||||
<span class="section-title"><a href="/test/">/test/</a></span> - <b>Poster Mc</b>!Tripcode
|
||||
</div>
|
||||
<div class="section-body">
|
||||
<img src="135683008384s.png" alt="test img"/>
|
||||
<a href="#">>>22222</a><br />
|
||||
HERP DERP FROSTED BUTTS
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
<div id="footer">
|
||||
<a href="{{$config.SiteWebfolder}}">Home</a> | <a href="{{$config.SiteWebfolder}}#boards">Boards</a> | <a href="{{$config.SiteWebfolder}}#rules">Rules</a> | <a href="{{$config.SiteWebfolder}}#faq">FAQ</a><br />
|
||||
|
|
|
@ -73,13 +73,15 @@
|
|||
</div>
|
||||
</div>
|
||||
{{range $reply_num,$reply := $post_arr}}{{if gt $reply_num 0}}
|
||||
<div class="reply" id="{{$reply.ID}}">
|
||||
<input type="checkbox" id="check{{$reply.ID}}" name="check{{$reply.ID}}" /> <label class="post-info" for="check{{$reply.ID}}"><span class="postername">{{if stringNeq $reply.Email ""}}<a href="mailto:{{$reply.Email}}">{{end}}{{if stringNeq $reply.Name ""}}{{$reply.Name}}{{else}}{{if stringEq $reply.Tripcode ""}}{{$board.Anonymous}}{{end}}{{end}}{{if stringNeq $reply.Email ""}}</a>{{end}}</span>{{if stringNeq $reply.Tripcode ""}}<span class="tripcode">!{{$reply.Tripcode}}</span>{{end}} {{formatTimestamp $reply.Timestamp}} </label><a href="/{{$board.Dir}}/res/{{$op.ID}}.html#{{$reply.ID}}">No.</a> <a href="/{{$board.Dir}}/res/{{$op.ID}}.html#{{$reply.ID}}i">{{$reply.ID}}</a> <span class="post-links"><span class="thread-ddown">[<a href="javascript:void(0)">▼</a>]</span></span><br />
|
||||
{{if stringNeq $reply.Filename ""}}<span class="file-info">File: <a href="../src/{{$reply.Filename}}" target="_blank">{{$reply.Filename}}</a> - ({{formatFilesize $reply.Filesize}} , {{$reply.ImageW}}x{{$reply.ImageH}}, {{$reply.FilenameOriginal}} )</span><br />
|
||||
<a href="{{$config.SiteWebfolder}}{{$board.Dir}}/src/{{$reply.Filename}}"><img src="{{$config.SiteWebfolder}}{{$board.Dir}}/thumb/{{imageToThumbnailPath $reply.Filename}}" width="{{$reply.ThumbW}}" height="{{$reply.ThumbH}}" class="thumbnail" alt="{{imageToThumbnailPath $reply.Filename}}" /></a>{{end}}
|
||||
<div class="reply-container" id="{{$reply.ID}}">
|
||||
<div class="reply" id="{{$reply.ID}}">
|
||||
<input type="checkbox" id="check{{$reply.ID}}" name="check{{$reply.ID}}" /> <label class="post-info" for="check{{$reply.ID}}"><span class="postername">{{if stringNeq $reply.Email ""}}<a href="mailto:{{$reply.Email}}">{{end}}{{if stringNeq $reply.Name ""}}{{$reply.Name}}{{else}}{{if stringEq $reply.Tripcode ""}}{{$board.Anonymous}}{{end}}{{end}}{{if stringNeq $reply.Email ""}}</a>{{end}}</span>{{if stringNeq $reply.Tripcode ""}}<span class="tripcode">!{{$reply.Tripcode}}</span>{{end}} {{formatTimestamp $reply.Timestamp}} </label><a href="/{{$board.Dir}}/res/{{$op.ID}}.html#{{$reply.ID}}">No.</a> <a href="/{{$board.Dir}}/res/{{$op.ID}}.html#{{$reply.ID}}i">{{$reply.ID}}</a> <span class="post-links"><span class="thread-ddown">[<a href="javascript:void(0)">▼</a>]</span></span><br />
|
||||
{{if stringNeq $reply.Filename ""}}<span class="file-info">File: <a href="../src/{{$reply.Filename}}" target="_blank">{{$reply.Filename}}</a> - ({{formatFilesize $reply.Filesize}} , {{$reply.ImageW}}x{{$reply.ImageH}}, {{$reply.FilenameOriginal}} )</span><br />
|
||||
<a href="{{$config.SiteWebfolder}}{{$board.Dir}}/src/{{$reply.Filename}}"><img src="{{$config.SiteWebfolder}}{{$board.Dir}}/thumb/{{imageToThumbnailPath $reply.Filename}}" width="{{$reply.ThumbW}}" height="{{$reply.ThumbH}}" class="thumbnail" alt="{{imageToThumbnailPath $reply.Filename}}" /></a>{{end}}
|
||||
|
||||
<div class="post-text">
|
||||
{{$reply.Message}}
|
||||
<div class="post-text">
|
||||
{{$reply.Message}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue