Refactored pages
Added a dependency on "spp", simple preprocessor to do some preprocessing around the templates. This will hopefully allow the changes to be made in one place and propagate to all the right pages.
This commit is contained in:
parent
663da16a75
commit
44ad323f31
85
Makefile
85
Makefile
|
@ -1,3 +1,12 @@
|
||||||
|
# Binaries
|
||||||
|
ECHO=echo
|
||||||
|
KODEV=kodev
|
||||||
|
MKDIR=mkdir -p
|
||||||
|
COPY=cp
|
||||||
|
RM=rm -f
|
||||||
|
SPP=spp
|
||||||
|
|
||||||
|
|
||||||
# Config
|
# Config
|
||||||
chroot_dir=kore_chroot/
|
chroot_dir=kore_chroot/
|
||||||
mirror=http://dl-cdn.alpinelinux.org/alpine/
|
mirror=http://dl-cdn.alpinelinux.org/alpine/
|
||||||
|
@ -5,36 +14,56 @@ arch=aarch64
|
||||||
version=2.10.5-r0
|
version=2.10.5-r0
|
||||||
certbot_email=--register-unsafely-without-email
|
certbot_email=--register-unsafely-without-email
|
||||||
#certbot_email=-m you@cock.li
|
#certbot_email=-m you@cock.li
|
||||||
domain=test.monster
|
user=robin
|
||||||
|
port=8888
|
||||||
|
domain=test.monster:$(port)
|
||||||
|
|
||||||
#Probably don't change stuff past here
|
#squelch prints
|
||||||
lua_files=$(shell find src/lua -type f)
|
Q=@
|
||||||
|
#Q=
|
||||||
|
|
||||||
|
# Probably don't change stuff past here if you're just using smr
|
||||||
|
lua_in_files=$(shell find src/lua/*.in -type f)
|
||||||
|
lua_files=$(shell find src/lua/*.lua -type f) $(shell find src/lua/endpoints -type f) $(lua_in_files:%.in=%)
|
||||||
src_files=$(shell find src -type f) $(shell find conf -type f)
|
src_files=$(shell find src -type f) $(shell find conf -type f)
|
||||||
sql_files=$(shell find src/sql -type f)
|
sql_files=$(shell find src/sql -type f)
|
||||||
test_files=$(shell find spec -type f)
|
test_files=$(shell find spec -type f)
|
||||||
built_tests=$(test_files:%=$(chroot_dir)%)
|
built_tests=$(test_files:%=$(chroot_dir)%)
|
||||||
built_files=$(lua_files:src/lua/%.lua=$(chroot_dir)%.lua)
|
built_files=$(lua_files:src/lua/%.lua=$(chroot_dir)%.lua)
|
||||||
page_files=$(shell find src/pages -type f)
|
in_page_files=$(shell find src/pages/*.in -type f)
|
||||||
|
in_part_files=$(shell find src/pages/parts/*.in -type f)
|
||||||
|
page_files=$(in_page_files:%.in=%)
|
||||||
|
part_files=$(in_part_files:%.in=%) $(shell find src/pages/parts/*.etlua -type f)
|
||||||
built_pages=$(page_files:src/pages/%.etlua=$(chroot_dir)pages/%.etlua)
|
built_pages=$(page_files:src/pages/%.etlua=$(chroot_dir)pages/%.etlua)
|
||||||
built_sql=$(sql_files:src/sql/%.sql=$(chroot_dir)sql/%.sql)
|
built_sql=$(sql_files:src/sql/%.sql=$(chroot_dir)sql/%.sql)
|
||||||
built=$(built_files) $(built_sql) $(built_pages) $(built_tests)
|
built=$(built_files) $(built_sql) $(built_pages) $(built_tests)
|
||||||
|
|
||||||
all: $(chroot_dir) smr.so $(built_files) $(built_pages) $(built_sql)
|
all: $(chroot_dir) smr.so $(built_files) $(built_pages) $(built_sql)
|
||||||
echo $(built_files)
|
$(Q)$(ECHO) "[running] $@"
|
||||||
kodev run
|
$(Q)$(KODEV) run
|
||||||
|
|
||||||
|
conf/smr.conf : conf/smr.conf.in Makefile
|
||||||
|
$(Q)$(ECHO) "[preprocess] $@"
|
||||||
|
$(Q)$(SPP) -o $@ -D port=$(port) -D kore_chroot=$(chroot_dir) -D chuser=$(user) $<
|
||||||
|
|
||||||
apk-tools-static-$(version).apk:
|
apk-tools-static-$(version).apk:
|
||||||
# wget -q $(mirror)latest-stable/main/$(arch)/apk-tools-static-$(version).apk
|
# wget -q $(mirror)latest-stable/main/$(arch)/apk-tools-static-$(version).apk
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
kodev clean
|
$(Q)$(ECHO) "[clean] $@"
|
||||||
|
$(Q)$(KODEV) clean
|
||||||
|
$(Q)$(RM) $(page_files)
|
||||||
|
$(Q)$(RM) conf/smr.conf
|
||||||
|
$(Q)$(RM) src/pages/parts/story_breif.etlua
|
||||||
|
$(Q)$(RM) src/lua/config.lua
|
||||||
|
|
||||||
|
|
||||||
$(chroot_dir): apk-tools-static-$(version).apk
|
$(chroot_dir): apk-tools-static-$(version).apk
|
||||||
mkdir -p $(chroot_dir)
|
$(Q)$(MKDIR) $(chroot_dir)
|
||||||
mkdir -p $(chroot_dir)/pages
|
$(Q)$(MKDIR) $(chroot_dir)/pages
|
||||||
mkdir -p $(chroot_dir)/sql
|
$(Q)$(MKDIR) $(chroot_dir)/sql
|
||||||
mkdir -p $(chroot_dir)/data
|
$(Q)$(MKDIR) $(chroot_dir)/data
|
||||||
mkdir -p $(chroot_dir)/endpoints
|
$(Q)$(MKDIR) $(chroot_dir)/endpoints
|
||||||
#cd $(chroot_dir) && tar -xvzf ../apk-tools-static-*.apk
|
#cd $(chroot_dir) && tar -xvzf ../apk-tools-static-*.apk
|
||||||
#cd $(chroot_dir) && sudo ./sbin/apk.static -X $(mirror)latest-stable/main -U --allow-untrusted --root $(chroot_dir) --no-cache --initdb add alpine-base
|
#cd $(chroot_dir) && sudo ./sbin/apk.static -X $(mirror)latest-stable/main -U --allow-untrusted --root $(chroot_dir) --no-cache --initdb add alpine-base
|
||||||
#ln -s /dev/urandom $(chroot_dir)/dev/random #Prevent an attacker with access to the chroot from exhausting our entropy pool and causing a dos
|
#ln -s /dev/urandom $(chroot_dir)/dev/random #Prevent an attacker with access to the chroot from exhausting our entropy pool and causing a dos
|
||||||
|
@ -64,20 +93,36 @@ $(chroot_dir): apk-tools-static-$(version).apk
|
||||||
code : $(built_files)
|
code : $(built_files)
|
||||||
|
|
||||||
$(built_files): $(chroot_dir)%.lua : src/lua/%.lua
|
$(built_files): $(chroot_dir)%.lua : src/lua/%.lua
|
||||||
echo built files: $(built_files)
|
$(Q)$(ECHO) "[copy] $@"
|
||||||
cp $^ $@
|
$(Q)$(COPY) $^ $@
|
||||||
|
|
||||||
$(built_pages): $(chroot_dir)pages/%.etlua : src/pages/%.etlua
|
$(built_pages): $(chroot_dir)pages/%.etlua : src/pages/%.etlua
|
||||||
cp $^ $@
|
$(Q)$(ECHO) "[copy] $@"
|
||||||
|
$(Q)$(COPY) $^ $@
|
||||||
|
|
||||||
|
src/lua/config.lua : src/lua/config.lua.in Makefile
|
||||||
|
$(Q)$(ECHO) "[preprocess] $@"
|
||||||
|
$(Q)$(SPP) -o $@ -D domain=$(domain) $<
|
||||||
|
|
||||||
|
$(page_files) : % : %.in $(part_files)
|
||||||
|
$(Q)$(ECHO) "[preprocess] $@"
|
||||||
|
$(Q)$(SPP) -o $@ $<
|
||||||
|
|
||||||
|
src/pages/parts/story_breif.etlua : src/pages/parts/story_breif.etlua.in
|
||||||
|
$(Q)$(ECHO) "[preprocess] $@"
|
||||||
|
$(Q)$(SPP) -o $@ $<
|
||||||
|
|
||||||
$(built_sql): $(chroot_dir)sql/%.sql : src/sql/%.sql
|
$(built_sql): $(chroot_dir)sql/%.sql : src/sql/%.sql
|
||||||
cp $^ $@
|
$(Q)$(ECHO) "[copy] $@"
|
||||||
|
$(Q)$(COPY) $^ $@
|
||||||
|
|
||||||
$(built_tests) : $(chroot_dir)% : %
|
$(built_tests) : $(chroot_dir)% : %
|
||||||
cp $^ $@
|
$(Q)$(ECHO) "[copy] $@"
|
||||||
|
$(Q)$(COPY) $^ $@
|
||||||
|
|
||||||
smr.so : $(src_files)
|
smr.so : $(src_files) conf/smr.conf conf/build.conf
|
||||||
kodev build
|
$(Q)$(ECHO) "[build] $@"
|
||||||
|
$(Q)$(KODEV) build
|
||||||
|
|
||||||
test : $(built)
|
test : $(built)
|
||||||
cd kore_chroot && busted
|
$(Q)$(CD) kore_chroot && busted
|
||||||
|
|
|
@ -1,14 +1,18 @@
|
||||||
# smr configuration
|
# smr configuration
|
||||||
|
|
||||||
server tls {
|
server tls {
|
||||||
bind 0.0.0.0 8888
|
bind 0.0.0.0 <{get port}>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
seccomp_tracing yes
|
seccomp_tracing yes
|
||||||
load ./smr.so
|
load ./smr.so
|
||||||
root kore_chroot
|
root <{get kore_chroot}>
|
||||||
runas robin
|
|
||||||
keymgr_runas robin
|
runas <{get chuser }>
|
||||||
|
|
||||||
|
keymgr_runas <{get chuser }>
|
||||||
|
|
||||||
keymgr_root .
|
keymgr_root .
|
||||||
workers 1
|
workers 1
|
||||||
|
|
|
@ -3,6 +3,6 @@ Holds configuration.
|
||||||
A one-stop-shop for runtime configuration
|
A one-stop-shop for runtime configuration
|
||||||
]]
|
]]
|
||||||
return {
|
return {
|
||||||
domain = "test.monster:8888",
|
domain = "<{get domain}>",
|
||||||
production = false,
|
production = false,
|
||||||
}
|
}
|
|
@ -25,7 +25,7 @@ local function get_site_home(req)
|
||||||
log(LOG_DEBUG,"Cache miss, rendering site index")
|
log(LOG_DEBUG,"Cache miss, rendering site index")
|
||||||
stmnt_index:bind_names{}
|
stmnt_index:bind_names{}
|
||||||
local latest = {}
|
local latest = {}
|
||||||
for idr, title, iar, dater, author in util.sql_rows(stmnt_index) do
|
for idr, title, iar, dater, author, hits in util.sql_rows(stmnt_index) do
|
||||||
print("got:",tagsr,idr,title,iar,dater,author)
|
print("got:",tagsr,idr,title,iar,dater,author)
|
||||||
table.insert(latest,{
|
table.insert(latest,{
|
||||||
url = util.encode_id(idr),
|
url = util.encode_id(idr),
|
||||||
|
@ -34,6 +34,7 @@ local function get_site_home(req)
|
||||||
posted = os.date("%B %d %Y",tonumber(dater)),
|
posted = os.date("%B %d %Y",tonumber(dater)),
|
||||||
author = author,
|
author = author,
|
||||||
tags = libtags.get(idr),
|
tags = libtags.get(idr),
|
||||||
|
hits = hits,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
return pages.index{
|
return pages.index{
|
||||||
|
@ -59,12 +60,14 @@ local function get_author_home(req)
|
||||||
stmnt_author_bio:reset()
|
stmnt_author_bio:reset()
|
||||||
stmnt_author:bind_names{author=subdomain}
|
stmnt_author:bind_names{author=subdomain}
|
||||||
local stories = {}
|
local stories = {}
|
||||||
for id, title, time in util.sql_rows(stmnt_author) do
|
for id, title, time, hits in util.sql_rows(stmnt_author) do
|
||||||
table.insert(stories,{
|
table.insert(stories,{
|
||||||
url = util.encode_id(id),
|
url = util.encode_id(id),
|
||||||
title = title,
|
title = title,
|
||||||
|
author=subdomain,
|
||||||
posted = os.date("%B %d %Y",tonumber(time)),
|
posted = os.date("%B %d %Y",tonumber(time)),
|
||||||
tags = libtags.get(id),
|
tags = libtags.get(id),
|
||||||
|
hits = hits,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
return pages.author_index{
|
return pages.author_index{
|
||||||
|
|
|
@ -9,28 +9,31 @@ local function paste_get(req)
|
||||||
local text
|
local text
|
||||||
local author,_ = session.get(req)
|
local author,_ = session.get(req)
|
||||||
if host == config.domain and author then
|
if host == config.domain and author then
|
||||||
|
print("host:",host,"config.domain:",config.domain,"author:",author)
|
||||||
http_response_header(req,"Location",string.format("https://%s.%s/_paste",author,config.domain))
|
http_response_header(req,"Location",string.format("https://%s.%s/_paste",author,config.domain))
|
||||||
http_response(req,303,"")
|
http_response(req,303,"")
|
||||||
return
|
return
|
||||||
elseif host == config.domain and author == nil then
|
elseif host == config.domain and author == nil then
|
||||||
text = cache.render(string.format("%s/_paste",host),function()
|
text = cache.render(string.format("%s/_paste",host),function()
|
||||||
log(LOG_DEBUG, "Cache missing, rendering post page")
|
log(LOG_DEBUG, "Cache missing, rendering post page")
|
||||||
return pages.paste{
|
return assert(pages.paste{
|
||||||
domain = config.domain,
|
domain = config.domain,
|
||||||
err = "",
|
err = "",
|
||||||
}
|
})
|
||||||
end)
|
end)
|
||||||
http_response(req,200,text)
|
http_response(req,200,text)
|
||||||
elseif host ~= config.domain and author then
|
elseif host ~= config.domain and author then
|
||||||
text = pages.author_paste{
|
text = assert(pages.author_paste{
|
||||||
domain = config.domain,
|
domain = config.domain,
|
||||||
user = author,
|
user = author,
|
||||||
err = "",
|
err = "",
|
||||||
text="",
|
text="",
|
||||||
}
|
})
|
||||||
elseif host ~= config.domain and author == nil then
|
elseif host ~= config.domain and author == nil then
|
||||||
|
print("host:",host,"config.domain:",config.domain,"author:",author)
|
||||||
http_response_header(req,"Location",string.format("https://%s/_paste",config.domain))
|
http_response_header(req,"Location",string.format("https://%s/_paste",config.domain))
|
||||||
http_response(req,303,"")
|
http_response(req,303,"")
|
||||||
|
return
|
||||||
else
|
else
|
||||||
error(string.format(
|
error(string.format(
|
||||||
"Unable to find a good case for paste:%s,%s,%s",
|
"Unable to find a good case for paste:%s,%s,%s",
|
||||||
|
|
|
@ -19,7 +19,16 @@ local function search_get(req)
|
||||||
local host = http_request_get_host(req)
|
local host = http_request_get_host(req)
|
||||||
local path = http_request_get_path(req)
|
local path = http_request_get_path(req)
|
||||||
http_request_populate_qs(req)
|
http_request_populate_qs(req)
|
||||||
local searchq = assert(http_argument_get_string(req,"q"))
|
local searchq, err = http_argument_get_string(req,"q")
|
||||||
|
if not searchq then
|
||||||
|
local ret = pages.search{
|
||||||
|
domain = config.domain,
|
||||||
|
results = {},
|
||||||
|
q = "",
|
||||||
|
}
|
||||||
|
http_response(req,200,ret)
|
||||||
|
return
|
||||||
|
end
|
||||||
log(LOG_DEBUG,string.format("search: %q",searchq))
|
log(LOG_DEBUG,string.format("search: %q",searchq))
|
||||||
local sqltxt, data = search_parser(searchq)
|
local sqltxt, data = search_parser(searchq)
|
||||||
local stmnt = assert(db.conn:prepare(sqltxt), db.conn:errmsg())
|
local stmnt = assert(db.conn:prepare(sqltxt), db.conn:errmsg())
|
||||||
|
@ -39,12 +48,13 @@ local function search_get(req)
|
||||||
local results = {}
|
local results = {}
|
||||||
for row in stmnt:rows() do
|
for row in stmnt:rows() do
|
||||||
table.insert(results,{
|
table.insert(results,{
|
||||||
id = util.encode_id(row[1]),
|
url = util.encode_id(row[1]),
|
||||||
title = row[2],
|
title = row[2],
|
||||||
isanon = row[3] == 1,
|
isanon = row[3] == 1,
|
||||||
author = row[4],
|
author = row[4],
|
||||||
time = os.date("%B %d %Y",tonumber(row[5])),
|
posted = os.date("%B %d %Y",tonumber(row[5])),
|
||||||
tags = libtags.get(row[1])
|
tags = libtags.get(row[1]),
|
||||||
|
hits = row[6]
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
local ret = pages.search{
|
local ret = pages.search{
|
||||||
|
|
|
@ -19,10 +19,28 @@ local pagenames = {
|
||||||
"search",
|
"search",
|
||||||
}
|
}
|
||||||
local pages = {}
|
local pages = {}
|
||||||
for k,v in pairs(pagenames) do
|
local function load1(page)
|
||||||
local f = assert(io.open("pages/" .. v .. ".etlua","r"))
|
local path = string.format("pages/%s.etlua",page)
|
||||||
pages[v] = assert(et.compile(f:read("*a")))
|
local parser = et.Parser()
|
||||||
|
local f = assert(io.open(path,"r"))
|
||||||
|
local fdata = assert(f:read("*a"))
|
||||||
|
local code = assert(parser:parse(fdata))
|
||||||
|
local func = assert(parser:load(parser:chunks_to_lua(),path))
|
||||||
f:close()
|
f:close()
|
||||||
|
return function(...)
|
||||||
|
buf = assert(parser:run(func,...))
|
||||||
|
return table.concat(buf)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function load2(page)
|
||||||
|
local path = string.format("pages/%s.etlua",page)
|
||||||
|
local f = assert(io.open(path,"r"))
|
||||||
|
local ret = assert(et.compile(f:read("*a")))
|
||||||
|
f:close()
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
for k,v in pairs(pagenames) do
|
||||||
|
pages[v] = load1(v)
|
||||||
end
|
end
|
||||||
|
|
||||||
return pages
|
return pages
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
<% assert(author,"No author specified") %>
|
|
||||||
<% assert(bio,"No bio included") %>
|
|
||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="container">
|
|
||||||
<h1 class="title">
|
|
||||||
<a href="https://<%= author %>.<%= domain %>"><%= author %></a>.<a href="https://<%= domain %>"><%= domain %></a>
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<form action="https://<%= author %>.<%= domain %>/" method="post" class="container">
|
|
||||||
<textarea name="" cols=80 rows=24 class="column">
|
|
||||||
<%= bio %>
|
|
||||||
</textarea><br/>
|
|
||||||
<input type="submit">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="content">
|
|
||||||
<% if #stories == 0 then %>
|
|
||||||
This author has not made any pastes yet.
|
|
||||||
<% else %>
|
|
||||||
<table>
|
|
||||||
<% for k,v in pairs(stories) do %>
|
|
||||||
<tr><td><%= v[1] %></td><td><%= v[2] %></td></tr>
|
|
||||||
<% end %>
|
|
||||||
</table>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
<% assert(author,"No author specified") %>
|
||||||
|
<% assert(bio,"No bio included") %>
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
<a href="https://<%= author %>.<%= domain %>"><%= author %></a>.<a href="https://<%= domain %>"><%= domain %></a>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<form action="https://<%= author %>.<%= domain %>/" method="post" class="container">
|
||||||
|
<textarea name="" cols=80 rows=24 class="column">
|
||||||
|
<%= bio %>
|
||||||
|
</textarea><br/>
|
||||||
|
<input type="submit">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<% if #stories == 0 then %>
|
||||||
|
This author has not made any pastes yet.
|
||||||
|
<% else %>
|
||||||
|
<table>
|
||||||
|
<% for k,story in pairs(stories) do %>
|
||||||
|
<{system cat src/pages/parts/story_breif.etlua}>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
|
@ -1,49 +0,0 @@
|
||||||
<% assert(author,"No author specified") %> <% assert(bio,"No bio included") %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="container">
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
<a href="https://<%= author %>.<%= domain %>"><%= author %></a>.<a href="https://<%= domain %>"><%= domain %></a>
|
|
||||||
</h1>
|
|
||||||
<div class="container">
|
|
||||||
<a href="/_paste" class="button">New paste</a>
|
|
||||||
</div>
|
|
||||||
<div class="content">
|
|
||||||
<%= bio %>
|
|
||||||
</div>
|
|
||||||
<div class="content">
|
|
||||||
<% if #stories == 0 then %>
|
|
||||||
This author has not made any pastes yet.
|
|
||||||
<% else %>
|
|
||||||
<table>
|
|
||||||
<% for k,v in pairs(stories) do %>
|
|
||||||
<tr><td>
|
|
||||||
<a href="<%= v.url %>">
|
|
||||||
<%- v.title %>
|
|
||||||
</a>
|
|
||||||
</td><td>
|
|
||||||
By <a href="https://<%= author %>.<%= domain %>"><%= author %></a>
|
|
||||||
</td><td>
|
|
||||||
<ul class="row tag-list">
|
|
||||||
<% for i = 1,math.min(#v.tags, 5) do %>
|
|
||||||
<li><a class="tag button button-outline" href="https://<%= domain %>/_search?tag=<%= v.tags[i] %>"><%= v.tags[i] %></a></li>
|
|
||||||
<% end %>
|
|
||||||
</ul>
|
|
||||||
</td><td>
|
|
||||||
<%= v.posted %>
|
|
||||||
</td></tr>
|
|
||||||
<% end %>
|
|
||||||
</table>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
<% assert(author,"No author specified") %>
|
||||||
|
<% assert(bio,"No bio included") %>
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
<a href="https://<%= author %>.<%= domain %>"><%= author %></a>.<a href="https://<%= domain %>"><%= domain %></a>
|
||||||
|
</h1>
|
||||||
|
<div class="container">
|
||||||
|
<a href="/_paste" class="button">New paste</a>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<%= bio %>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<% if #stories == 0 then %>
|
||||||
|
This author has not made any pastes yet.
|
||||||
|
<% else %>
|
||||||
|
<table>
|
||||||
|
<% for k,story in pairs(stories) do %>
|
||||||
|
<{system cat src/pages/parts/story_breif.etlua}>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
Paste
|
|
||||||
</h1>
|
|
||||||
<% if err then %><em class="error"><%= err %></em><% end %>
|
|
||||||
<form action="https://<%= user %>.<%= domain %>/_paste" method="post" class="container">
|
|
||||||
<fieldset>
|
|
||||||
<div class="row">
|
|
||||||
<input type="text" name="title" placeholder="Title" class="column column-80"></input>
|
|
||||||
<select id="pasteas" name="pasteas" class="column column-10">
|
|
||||||
<option value="<%= user %>"><%= user %></option>
|
|
||||||
<option value="anonymous">Anonymous</option>
|
|
||||||
</select>
|
|
||||||
<select id="markup" name="markup" class="column column-10">
|
|
||||||
<option value="plain">Plain</option>
|
|
||||||
<option value="imageboard">Imageboard</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<input type="text" name="tags" placeholder="Tags (semicolon;seperated)" class="column"></input>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<textarea name="text" cols=80 rows=24 class="column"><%= text %></textarea><br/>
|
|
||||||
</div>
|
|
||||||
<input type="submit">
|
|
||||||
<input type="submit" formtarget="_blank" value="Preview" formaction="https://<%= domain %>/_preview">
|
|
||||||
</fieldset>
|
|
||||||
</form>
|
|
||||||
<footer class="footer">
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
Paste
|
||||||
|
</h1>
|
||||||
|
<% if err then %><em class="error"><%= err %></em><% end %>
|
||||||
|
<form action="https://<%= user %>.<%= domain %>/_paste" method="post" class="container">
|
||||||
|
<fieldset>
|
||||||
|
<div class="row">
|
||||||
|
<input type="text" name="title" placeholder="Title" class="column column-80"></input>
|
||||||
|
<select id="pasteas" name="pasteas" class="column column-10">
|
||||||
|
<option value="<%= user %>"><%= user %></option>
|
||||||
|
<option value="anonymous">Anonymous</option>
|
||||||
|
</select>
|
||||||
|
<select id="markup" name="markup" class="column column-10">
|
||||||
|
<option value="plain">Plain</option>
|
||||||
|
<option value="imageboard">Imageboard</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<input type="text" name="tags" placeholder="Tags (semicolon;seperated)" class="column"></input>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<textarea name="text" cols=80 rows=24 class="column"><%= text %></textarea><br/>
|
||||||
|
</div>
|
||||||
|
<input type="submit">
|
||||||
|
<input type="submit" formtarget="_blank" value="Preview" formaction="https://<%= domain %>/_preview">
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🙁</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="container">
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
🙁
|
|
||||||
</h1>
|
|
||||||
<div class="container">
|
|
||||||
<p>
|
|
||||||
You don't have permission to edit: <%= path %>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
🙁
|
||||||
|
</h1>
|
||||||
|
<div class="container">
|
||||||
|
<p>
|
||||||
|
You don't have permission to edit: <%= path %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="container">
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
Register
|
|
||||||
</h1>
|
|
||||||
Once you press submit, you will be prompted to download a file.<br/>
|
|
||||||
slash.monster uses this file in place of a password, keep it safe.<br/>
|
|
||||||
Consider keeping a copy on a USB in case your hard drive fails.<br/>
|
|
||||||
The admin cannot recover your passfile, and will not reset accounts.<br/>
|
|
||||||
<b>Names may be up to 30 characters, alphanumeric, no symbols, all lower case.</b><br/>
|
|
||||||
<% if err then %><em class="error"><%= err %></em><% end %>
|
|
||||||
<form action="/_claim" method="post">
|
|
||||||
<fieldset>
|
|
||||||
<label for="user">Name:</label>
|
|
||||||
<input type="text" name="user" id="user" placeholder="name">
|
|
||||||
<input type="submit">
|
|
||||||
</fieldset>
|
|
||||||
</form>
|
|
||||||
Once you have your file, you can <a href="/_login">log in</a>
|
|
||||||
<footer class="footer">
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
Register
|
||||||
|
</h1>
|
||||||
|
Once you press submit, you will be prompted to download a file.<br/>
|
||||||
|
slash.monster uses this file in place of a password, keep it safe.<br/>
|
||||||
|
Consider keeping a copy on a USB in case your hard drive fails.<br/>
|
||||||
|
The admin cannot recover your passfile, and will not reset accounts.<br/>
|
||||||
|
<b>Names may be up to 30 characters, alphanumeric, no symbols, all lower case.</b><br/>
|
||||||
|
<% if err then %><em class="error"><%= err %></em><% end %>
|
||||||
|
<form action="/_claim" method="post">
|
||||||
|
<fieldset>
|
||||||
|
<label for="user">Name:</label>
|
||||||
|
<input type="text" name="user" id="user" placeholder="name">
|
||||||
|
<input type="submit">
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
Once you have your file, you can <a href="/_login">log in</a>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
Paste
|
|
||||||
</h1>
|
|
||||||
<% if err then %><em class="error"><%= err %></em><% end %>
|
|
||||||
<form action="https://<%= user %>.<%= domain %>/_edit" method="post" class="container">
|
|
||||||
<fieldset>
|
|
||||||
<div class="row">
|
|
||||||
<input type="text" name="title" placeholder="Title" class="column column-80" value="<%= title %>"></input>
|
|
||||||
<input type="hidden" name="story" value="<%= story %>">
|
|
||||||
<select id="pasteas" name="pasteas" class="column column-10">
|
|
||||||
<% if isanon then %>
|
|
||||||
<option value="<%= user %>"><%= user %></option>
|
|
||||||
<option value="anonymous" selected>Anonymous</option>
|
|
||||||
<% else %>
|
|
||||||
<option value="<%= user %>" selected><%= user %></option>
|
|
||||||
<option value="anonymous">Anonymous</option>
|
|
||||||
<% end %>
|
|
||||||
</select>
|
|
||||||
<select id="markup" name="markup" class="column column-10">
|
|
||||||
<option value="plain">Plain</option>
|
|
||||||
<option value="imageboard">Imageboard</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<input type="text" name="tags" value="<%= tags %>" placeholder="Tags (semicolon;seperated)" class="column"></input>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<textarea name="text" cols=80 rows=24 class="column"><%= text %></textarea><br/>
|
|
||||||
</div>
|
|
||||||
<input type="submit">
|
|
||||||
|
|
||||||
</fieldset>
|
|
||||||
</form>
|
|
||||||
<footer class="footer">
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
Paste
|
||||||
|
</h1>
|
||||||
|
<% if err then %><em class="error"><%= err %></em><% end %>
|
||||||
|
<form action="https://<%= user %>.<%= domain %>/_edit" method="post" class="container">
|
||||||
|
<fieldset>
|
||||||
|
<div class="row">
|
||||||
|
<input type="text" name="title" placeholder="Title" class="column column-80" value="<%= title %>"></input>
|
||||||
|
<input type="hidden" name="story" value="<%= story %>">
|
||||||
|
<select id="pasteas" name="pasteas" class="column column-10">
|
||||||
|
<% if isanon then %>
|
||||||
|
<option value="<%= user %>"><%= user %></option>
|
||||||
|
<option value="anonymous" selected>Anonymous</option>
|
||||||
|
<% else %>
|
||||||
|
<option value="<%= user %>" selected><%= user %></option>
|
||||||
|
<option value="anonymous">Anonymous</option>
|
||||||
|
<% end %>
|
||||||
|
</select>
|
||||||
|
<select id="markup" name="markup" class="column column-10">
|
||||||
|
<option value="plain">Plain</option>
|
||||||
|
<option value="imageboard">Imageboard</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<input type="text" name="tags" value="<%= tags %>" placeholder="Tags (semicolon;seperated)" class="column"></input>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<textarea name="text" cols=80 rows=24 class="column"><%= text %></textarea><br/>
|
||||||
|
</div>
|
||||||
|
<input type="submit">
|
||||||
|
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
<{cat src/pages/parts/footer.etlua}>
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="container">
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title column">
|
|
||||||
<a href="https://<%= domain %>">
|
|
||||||
<%= domain %>
|
|
||||||
</a>
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<a href="/_paste" class="button column column-0">New paste</a>
|
|
||||||
<a href="/_login" class="button column column-0">Log in</a>
|
|
||||||
<a href="/_claim" class="button column column-0">Register</a>
|
|
||||||
<form action="https://<%= domain %>/_search" method="get" class="search column row">
|
|
||||||
<input class="column" type="text" name="q" placeholder="+greentext -dotr +hits>20"/>
|
|
||||||
<input class="column column-0 button button-clear" type="submit" value="🔎"/>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<p>
|
|
||||||
Welcome to slash.monster, stories of fiction and fantasy<br/>
|
|
||||||
Not safe for work<br/>
|
|
||||||
18+
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="content">
|
|
||||||
<% if #stories == 0 then %>
|
|
||||||
No stories available.
|
|
||||||
<% else %>
|
|
||||||
<table>
|
|
||||||
<% for k,v in pairs(stories) do %>
|
|
||||||
<tr><td>
|
|
||||||
<a href="<%= v.url %>">
|
|
||||||
<%- v.title %>
|
|
||||||
</a>
|
|
||||||
</td><td>
|
|
||||||
<% if v.isanon then %>
|
|
||||||
By Anonymous
|
|
||||||
<% else %>
|
|
||||||
By <a href="https://<%= v.author %>.<%= domain %>"><%= v.author %></a>
|
|
||||||
<% end %>
|
|
||||||
</td><td>
|
|
||||||
<ul class="row tag-list">
|
|
||||||
<% for i = 1,math.min(#v.tags, 5) do %>
|
|
||||||
<li><a class="tag button button-outline" href="https://<%= domain %>/_search?q=%2B<%= v.tags[i] %>"><%= v.tags[i] %></a></li>
|
|
||||||
<% end %>
|
|
||||||
<% if #v.tags > 5 then %>
|
|
||||||
<li>+<%= #v.tags - 5 %></li>
|
|
||||||
<% end %>
|
|
||||||
</ul>
|
|
||||||
</td><td>
|
|
||||||
<%= v.posted %>
|
|
||||||
</td></tr>
|
|
||||||
<% end %>
|
|
||||||
</table>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title column">
|
||||||
|
<a href="https://<%= domain %>">
|
||||||
|
<%= domain %>
|
||||||
|
</a>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<a href="/_paste" class="button column column-0">New paste</a>
|
||||||
|
<a href="/_login" class="button column column-0">Log in</a>
|
||||||
|
<a href="/_claim" class="button column column-0">Register</a>
|
||||||
|
<form action="https://<%= domain %>/_search" method="get" class="search column row">
|
||||||
|
<input class="column" type="text" name="q" placeholder="+greentext -dotr +hits>20"/>
|
||||||
|
<input class="column column-0 button button-clear" type="submit" value="🔎"/>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
Welcome to slash.monster, stories of fiction and fantasy<br/>
|
||||||
|
Not safe for work<br/>
|
||||||
|
18+
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<% if #stories == 0 then %>
|
||||||
|
No stories available.
|
||||||
|
<% else %>
|
||||||
|
<table>
|
||||||
|
<% for k,story in pairs(stories) do %>
|
||||||
|
<{system cat src/pages/parts/story_breif.etlua}>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="container">
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
Login
|
|
||||||
</h1>
|
|
||||||
<% if err then %><em class="error"><%= err %></em><% end %>
|
|
||||||
<form action="/_login" method="post" enctype="multipart/form-data">
|
|
||||||
<fieldset>
|
|
||||||
<label for="user">Name:</label>
|
|
||||||
<input type="text" name="user" id="user" placeholder="name" autocorrect="off" autocapitalize="none">
|
|
||||||
<label for="pass">Passfile:</label>
|
|
||||||
<input type="file" name="pass" id="pass">
|
|
||||||
<input type="submit" value="Log In"/>
|
|
||||||
</fieldset>
|
|
||||||
</form>
|
|
||||||
<footer class="footer">
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
Login
|
||||||
|
</h1>
|
||||||
|
<% if err then %><em class="error"><%= err %></em><% end %>
|
||||||
|
<form action="/_login" method="post" enctype="multipart/form-data">
|
||||||
|
<fieldset>
|
||||||
|
<label for="user">Name:</label>
|
||||||
|
<input type="text" name="user" id="user" placeholder="name" autocorrect="off" autocapitalize="none">
|
||||||
|
<label for="pass">Passfile:</label>
|
||||||
|
<input type="file" name="pass" id="pass">
|
||||||
|
<input type="submit" value="Log In"/>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
|
@ -0,0 +1,11 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
🙁
|
||||||
|
</h1>
|
||||||
|
<div class="container">
|
||||||
|
<p>
|
||||||
|
No author found: <%= author %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🙁</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="container">
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
🙁
|
|
||||||
</h1>
|
|
||||||
<div class="container">
|
|
||||||
<p>
|
|
||||||
No story found: <%= path %>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
🙁
|
||||||
|
</h1>
|
||||||
|
<div class="container">
|
||||||
|
<p>
|
||||||
|
No story found: <%= path %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
|
@ -0,0 +1 @@
|
||||||
|
story_breif.etlua
|
|
@ -0,0 +1,6 @@
|
||||||
|
<footer class="footer">
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
<body>
|
|
@ -1,22 +1,19 @@
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>🙁</title>
|
<% if author then %>
|
||||||
|
<meta name="author" content="<%= author %>">
|
||||||
|
<% end %>
|
||||||
|
<% if title then %>
|
||||||
|
<title><%- title %></title>
|
||||||
|
<% else %>
|
||||||
|
<title>🍑</title>
|
||||||
|
<% end %>
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
<link href="/_css/milligram.css" rel="stylesheet">
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
<link href="/_css/style.css" rel="stylesheet">
|
||||||
</head>
|
</head>
|
||||||
<body class="container">
|
<body class="container">
|
||||||
<main class="wrapper">
|
<main class="wrapper">
|
||||||
<h1 class="title">
|
|
||||||
🙁
|
|
||||||
</h1>
|
|
||||||
<div class="container">
|
|
||||||
<p>
|
|
||||||
No author found: <%= author %>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
|
||||||
|
<tr><td>
|
||||||
|
<a href="<%= story.url %>">
|
||||||
|
<%- story.title %>
|
||||||
|
</a>
|
||||||
|
</td><td>
|
||||||
|
<% if story.isanon then %>
|
||||||
|
By Anonymous
|
||||||
|
<% else %>
|
||||||
|
By <a href="https://<%= story.author %>.<%= domain %>"><%= story.author %></a>
|
||||||
|
<% end %>
|
||||||
|
</td><td>
|
||||||
|
<%= story.hits %> hits
|
||||||
|
</td><td>
|
||||||
|
<ul class="row tag-list">
|
||||||
|
<% for i = 1,math.min(#story.tags, 5) do %>
|
||||||
|
<% local tag = story.tags[i] %>
|
||||||
|
<{system cat src/pages/parts/taglist.etlua}>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</td><td>
|
||||||
|
<%= story.posted %>
|
||||||
|
</td></tr>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<li>
|
||||||
|
<a class="tag button button-outline" href="https://<%= domain %>/_search?q=%2B<%= tag %>">
|
||||||
|
<%= tag %>
|
||||||
|
</a>
|
||||||
|
</li>
|
|
@ -1,39 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
Paste
|
|
||||||
</h1>
|
|
||||||
<% if err then %><em class="error"><%= err %></em><% end %>
|
|
||||||
<form action="https://<%= domain %>/_paste" method="post" class="container"><fieldset>
|
|
||||||
<div class="row">
|
|
||||||
<input type="text" name="title" placeholder="Title" class="column column-80"></input>
|
|
||||||
<select id="markup" name="markup" class="column column-20">
|
|
||||||
<option value="plain">Plain</option>
|
|
||||||
<option value="imageboard">Imageboard</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<input type="text" name="tags" placeholder="Tags (semicolon;seperated)" class="column"></input>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<textarea name="text" cols=80 rows=24 class="column"></textarea><br/>
|
|
||||||
</div>
|
|
||||||
<input type="submit">
|
|
||||||
<input type="submit" formtarget="_blank" value="Preview" formaction="https://<%= domain %>/_preview">
|
|
||||||
</fieldset></form>
|
|
||||||
<footer class="footer">
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
Paste
|
||||||
|
</h1>
|
||||||
|
<% if err then %><em class="error"><%= err %></em><% end %>
|
||||||
|
<form action="https://<%= domain %>/_paste" method="post" class="container"><fieldset>
|
||||||
|
<div class="row">
|
||||||
|
<input type="text" name="title" placeholder="Title" class="column column-80"></input>
|
||||||
|
<select id="markup" name="markup" class="column column-20">
|
||||||
|
<option value="plain">Plain</option>
|
||||||
|
<option value="imageboard">Imageboard</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<input type="text" name="tags" placeholder="Tags (semicolon;seperated)" class="column"></input>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<textarea name="text" cols=80 rows=24 class="column"></textarea><br/>
|
||||||
|
</div>
|
||||||
|
<input type="submit">
|
||||||
|
<input type="submit" formtarget="_blank" value="Preview" formaction="https://<%= domain %>/_preview">
|
||||||
|
</fieldset></form>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
|
@ -1,84 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="author" content="<%= author %>">
|
|
||||||
<title><%- title %></title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body><main class="wrapper">
|
|
||||||
<nav>
|
|
||||||
<a href="https://<%= domain %>"><%= domain %></a>/<a href="https://<%= domain %>/<%= idp %>"><%= idp %></a>
|
|
||||||
</nav>
|
|
||||||
<% if owner then -%>
|
|
||||||
<form action="https://<%= domain %>/_edit" method="get"><fieldset>
|
|
||||||
<input type="hidden" name="story" value="<%= idp %>"/>
|
|
||||||
<input type="submit" value="edit" class="button"/>
|
|
||||||
</fieldset></form>
|
|
||||||
<% end -%>
|
|
||||||
<article>
|
|
||||||
<h2 class="title">
|
|
||||||
<%- title %>
|
|
||||||
</h2>
|
|
||||||
<h3>
|
|
||||||
<% if isanon or author == nil then -%>
|
|
||||||
By Anonymous
|
|
||||||
<% else -%>
|
|
||||||
By <a href="https://<%= author %>.<%= domain %>"><%= author %></a>
|
|
||||||
<% end -%>
|
|
||||||
</h3>
|
|
||||||
<%- text %>
|
|
||||||
</article>
|
|
||||||
<hr/>
|
|
||||||
<p><%= views %> Hits</p>
|
|
||||||
<ul class="tag-list">
|
|
||||||
<% for _,tag in pairs(tags) do -%>
|
|
||||||
<li><a class="tag button button-outline" href="https://<%= domain %>/_search?tag=<%= tag %>"><%= tag %></a></li>
|
|
||||||
<% end -%>
|
|
||||||
</ul>
|
|
||||||
<form action="https://<%= domain %>/_download" method="get">
|
|
||||||
<input type="hidden" name="story" value="<%= idp %>"/>
|
|
||||||
<input type="submit" value="Download TXT" class="button"/>
|
|
||||||
</form>
|
|
||||||
<% if not show_comments then -%>
|
|
||||||
<form action="https://<%= domain %>/<%= idp %>"><fieldset>
|
|
||||||
<input type="hidden" name="comments" value="1">
|
|
||||||
<input type="submit" value="load comments" class="button">
|
|
||||||
</fieldset></form>
|
|
||||||
<% else %>
|
|
||||||
<form action="https://<%= domain %>/<%= idp %>" method="POST">
|
|
||||||
<textarea name="text" cols=60 rows=10 class="column"></textarea>
|
|
||||||
</div><% if iam then %>
|
|
||||||
<select id="postas" name="postas">
|
|
||||||
<option value="Anonymous">Anonymous</option>
|
|
||||||
<option value="<%= iam %>"><%= iam %></option>
|
|
||||||
</select>
|
|
||||||
<input type="submit" value="post" class="button">
|
|
||||||
<% else %>
|
|
||||||
<input type="hidden" name="postas" value="Anonymous">
|
|
||||||
<input type="submit" value="post" class="button">
|
|
||||||
<% end %>
|
|
||||||
</form>
|
|
||||||
<% if comments and #comments == 0 then %>
|
|
||||||
<p><i>No comments yet</i></p>
|
|
||||||
<% else %>
|
|
||||||
<section>
|
|
||||||
<% for _,comment in pairs(comments) do %>
|
|
||||||
<article>
|
|
||||||
<% if comment.isanon then %>
|
|
||||||
<p><b>Anonymous</b></p>
|
|
||||||
<% else %>
|
|
||||||
<p><b><%= comment.author %></b></p>
|
|
||||||
<% end %>
|
|
||||||
<p><%= comment.text %></p>
|
|
||||||
</article>
|
|
||||||
<% end %>
|
|
||||||
</section>
|
|
||||||
<% end %>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
|
|
||||||
</main></body>
|
|
||||||
</html>
|
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<nav>
|
||||||
|
<a href="https://<%= domain %>"><%= domain %></a>/<a href="https://<%= domain %>/<%= idp %>"><%= idp %></a>
|
||||||
|
</nav>
|
||||||
|
<% if owner then -%>
|
||||||
|
<form action="https://<%= domain %>/_edit" method="get"><fieldset>
|
||||||
|
<input type="hidden" name="story" value="<%= idp %>"/>
|
||||||
|
<input type="submit" value="edit" class="button"/>
|
||||||
|
</fieldset></form>
|
||||||
|
<% end -%>
|
||||||
|
<article>
|
||||||
|
<h2 class="title"> <%- title %> </h2>
|
||||||
|
<h3>
|
||||||
|
<% if isanon or author == nil then -%>
|
||||||
|
By Anonymous
|
||||||
|
<% else -%>
|
||||||
|
By <a href="https://<%= author %>.<%= domain %>"><%= author %></a>
|
||||||
|
<% end -%>
|
||||||
|
</h3>
|
||||||
|
<%- text %>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<hr/>
|
||||||
|
|
||||||
|
<p><%= views %> Hits</p>
|
||||||
|
|
||||||
|
<ul class="tag-list">
|
||||||
|
<% for _,tag in pairs(tags) do -%>
|
||||||
|
<{system cat src/pages/parts/taglist.etlua}>
|
||||||
|
<% end -%>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<form action="https://<%= domain %>/_download" method="get">
|
||||||
|
<input type="hidden" name="story" value="<%= idp %>"/>
|
||||||
|
<input type="submit" value="Download TXT" class="button"/>
|
||||||
|
</form>
|
||||||
|
<% if not show_comments then -%>
|
||||||
|
<form action="https://<%= domain %>/<%= idp %>"><fieldset>
|
||||||
|
<input type="hidden" name="comments" value="1">
|
||||||
|
<input type="submit" value="load comments" class="button">
|
||||||
|
</fieldset></form>
|
||||||
|
<% else %>
|
||||||
|
<form action="https://<%= domain %>/<%= idp %>" method="POST">
|
||||||
|
<textarea name="text" cols=60 rows=10 class="column"></textarea>
|
||||||
|
</div><% if iam then %>
|
||||||
|
<select id="postas" name="postas">
|
||||||
|
<option value="Anonymous">Anonymous</option>
|
||||||
|
<option value="<%= iam %>"><%= iam %></option>
|
||||||
|
</select>
|
||||||
|
<input type="submit" value="post" class="button">
|
||||||
|
<% else %>
|
||||||
|
<input type="hidden" name="postas" value="Anonymous">
|
||||||
|
<input type="submit" value="post" class="button">
|
||||||
|
<% end %>
|
||||||
|
</form>
|
||||||
|
<% if comments and #comments == 0 then %>
|
||||||
|
<p><i>No comments yet</i></p>
|
||||||
|
<% else %>
|
||||||
|
<section>
|
||||||
|
<% for _,comment in pairs(comments) do %>
|
||||||
|
<article>
|
||||||
|
<% if comment.isanon then %>
|
||||||
|
<p><b>Anonymous</b></p>
|
||||||
|
<% else %>
|
||||||
|
<p><b><%= comment.author %></b></p>
|
||||||
|
<% end %>
|
||||||
|
<p><%= comment.text %></p>
|
||||||
|
</article>
|
||||||
|
<% end %>
|
||||||
|
</section>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
|
@ -1,55 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>🍑</title>
|
|
||||||
<link href="/_css/milligram.css" rel="stylesheet">
|
|
||||||
<link href="/_css/style.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="container">
|
|
||||||
<main class="wrapper">
|
|
||||||
<h1 class="title">
|
|
||||||
<a href="https://<%= domain %>"><%= domain %></a>/
|
|
||||||
</h1>
|
|
||||||
<div class="row">
|
|
||||||
<form action="https://<%= domain %>/_search" method="get" class="search column row">
|
|
||||||
<input class="column" type="text" name="q" placeholder="+greentext -dotr +hits>20" value="<%= q %>"/>
|
|
||||||
<input class="column column-0 button button-clear" type="submit" value="🔎"/>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="content">
|
|
||||||
<% if #results == 0 then %>
|
|
||||||
No stories matched your search.
|
|
||||||
<% else %>
|
|
||||||
<table>
|
|
||||||
<% for k,v in pairs(results) do %>
|
|
||||||
<tr><td>
|
|
||||||
<a href="<%= v.id %>">
|
|
||||||
<%- v.title %>
|
|
||||||
</a>
|
|
||||||
</td><td>
|
|
||||||
<% if v.isanon then %>
|
|
||||||
By Anonymous
|
|
||||||
<% else %>
|
|
||||||
By <a href="https://<%= v.author %>.<%= domain %>"><%= v.author %></a>
|
|
||||||
<% end %>
|
|
||||||
</td><td>
|
|
||||||
<ul class="row tag-list">
|
|
||||||
<% for i = 1,math.min(#v.tags, 5) do %>
|
|
||||||
<li><a class="tag button button-outline" href="https://<%= domain %>/_search?tag=<%= v.tags[i] %>"><%= v.tags[i] %></a></li>
|
|
||||||
<% end %>
|
|
||||||
<% if #v.tags > 5 then %>
|
|
||||||
<li>+<%= #v.tags - 5%></li>
|
|
||||||
<% end %>
|
|
||||||
</ul>
|
|
||||||
</td><td>
|
|
||||||
<%= v.time %>
|
|
||||||
</td></tr>
|
|
||||||
<% end %>
|
|
||||||
</table>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
<body>
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
<{system cat src/pages/parts/header.etlua}>
|
||||||
|
<h1 class="title">
|
||||||
|
<a href="https://<%= domain %>"><%= domain %></a>/
|
||||||
|
</h1>
|
||||||
|
<div class="row">
|
||||||
|
<form action="https://<%= domain %>/_search" method="get" class="search column row">
|
||||||
|
<input class="column" type="text" name="q" placeholder="+greentext -dotr +hits>20" value="<%= q %>"/>
|
||||||
|
<input class="column column-0 button button-clear" type="submit" value="🔎"/>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<% if #results == 0 then %>
|
||||||
|
No stories matched your search.
|
||||||
|
<% else %>
|
||||||
|
<table>
|
||||||
|
<% for k,story in pairs(results) do %>
|
||||||
|
<{system cat src/pages/parts/story_breif.etlua}>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<{system cat src/pages/parts/footer.etlua}>
|
|
@ -3,7 +3,8 @@ SELECT
|
||||||
posts.post_title,
|
posts.post_title,
|
||||||
posts.isanon,
|
posts.isanon,
|
||||||
authors.name,
|
authors.name,
|
||||||
posts.post_time
|
posts.post_time,
|
||||||
|
posts.views
|
||||||
FROM
|
FROM
|
||||||
posts,authors
|
posts,authors
|
||||||
WHERE
|
WHERE
|
||||||
|
@ -30,7 +31,8 @@ SELECT
|
||||||
posts.post_title,
|
posts.post_title,
|
||||||
posts.isanon,
|
posts.isanon,
|
||||||
authors.name,
|
authors.name,
|
||||||
posts.post_time
|
posts.post_time,
|
||||||
|
posts.views
|
||||||
FROM
|
FROM
|
||||||
posts,authors,tags
|
posts,authors,tags
|
||||||
WHERE
|
WHERE
|
|
@ -3,7 +3,8 @@
|
||||||
SELECT
|
SELECT
|
||||||
posts.id,
|
posts.id,
|
||||||
posts.post_title,
|
posts.post_title,
|
||||||
posts.post_time
|
posts.post_time,
|
||||||
|
posts.views
|
||||||
FROM
|
FROM
|
||||||
posts,
|
posts,
|
||||||
authors
|
authors
|
||||||
|
|
|
@ -4,7 +4,8 @@ SELECT
|
||||||
posts.post_title,
|
posts.post_title,
|
||||||
posts.isanon,
|
posts.isanon,
|
||||||
posts.post_time,
|
posts.post_time,
|
||||||
authors.name
|
authors.name,
|
||||||
|
posts.views
|
||||||
FROM
|
FROM
|
||||||
posts,
|
posts,
|
||||||
authors
|
authors
|
||||||
|
|
Loading…
Reference in New Issue