Try hash based cache busting with stylesheets too.

Use a semantic blockquote element instead of span in plugin_bbcode for [quote]
You can now use <blockquote> elements directly in posts.
Added styling for quotes to Shadow, Cosora and Nox.
Experimenting with the padding on Nox's Control Panel Menu.
Tweaked the padding for the User Manager items on Nox.
Fixed #back filling up all the space it can on Tempra Simple.
Added a bit of padding below the last element before the footer on Tempra Simple.

Tempra Simple's misc.js is now loaded asynchronously.
Shadow's misc.js is now loaded asynchronously.
profile_member.js is now loaded asynchronously.
account.js is now loaded asynchronously.
This commit is contained in:
Azareal 2019-03-24 17:23:38 +10:00
parent 660f24acff
commit 23a0bf3f41
24 changed files with 105 additions and 32 deletions

View File

@ -25,7 +25,7 @@ type Header struct {
PreScriptsAsync []HResource PreScriptsAsync []HResource
ScriptsAsync []HResource ScriptsAsync []HResource
//Preload []string //Preload []string
Stylesheets []string Stylesheets []HResource
Widgets PageWidgets Widgets PageWidgets
Site *site Site *site
Settings SettingMap Settings SettingMap
@ -92,7 +92,15 @@ func (header *Header) AddScriptAsync(name string) {
}*/ }*/
func (header *Header) AddSheet(name string) { func (header *Header) AddSheet(name string) {
header.Stylesheets = append(header.Stylesheets, name) fname := "/static/" + name
var hash string
if fname[0] == '/' && fname[1] != '/' {
file, ok := StaticFiles.Get(fname)
if ok {
hash = file.Sha256
}
}
header.Stylesheets = append(header.Stylesheets, HResource{name, hash})
} }
func (header *Header) AddNotice(name string) { func (header *Header) AddNotice(name string) {

View File

@ -217,7 +217,7 @@ func PreparseMessage(msg string) string {
's': []string{"", "trong", "pan"}, 's': []string{"", "trong", "pan"},
'd': []string{"el"}, 'd': []string{"el"},
'u': []string{""}, 'u': []string{""},
'b': []string{""}, 'b': []string{"", "lockquote"},
'i': []string{""}, 'i': []string{""},
'g': []string{""}, // Quick and dirty fix for Grammarly 'g': []string{""}, // Quick and dirty fix for Grammarly
} }
@ -261,7 +261,10 @@ func PreparseMessage(msg string) string {
}, },
'd': []*TagToAction{&TagToAction{"el", buildLitMatch("del"), 0, false}}, 'd': []*TagToAction{&TagToAction{"el", buildLitMatch("del"), 0, false}},
'u': []*TagToAction{&TagToAction{"", buildLitMatch("u"), 0, false}}, 'u': []*TagToAction{&TagToAction{"", buildLitMatch("u"), 0, false}},
'b': []*TagToAction{&TagToAction{"", buildLitMatch("strong"), 0, false}}, 'b': []*TagToAction{
&TagToAction{"", buildLitMatch("strong"), 0, false},
&TagToAction{"lockquote", buildLitMatch("blockquote"), 0, false},
},
'i': []*TagToAction{&TagToAction{"", buildLitMatch("em"), 0, false}}, 'i': []*TagToAction{&TagToAction{"", buildLitMatch("em"), 0, false}},
'g': []*TagToAction{ 'g': []*TagToAction{
&TagToAction{"", func(act *TagToAction, open bool, i int, runes []rune) (int, string) { &TagToAction{"", func(act *TagToAction, open bool, i int, runes []rune) (int, string) {

View File

@ -108,7 +108,7 @@ func tmplInitHeaders(user User, user2 User, user3 User) (*Header, *Header, *Head
Theme: Themes[DefaultThemeBox.Load().(string)], Theme: Themes[DefaultThemeBox.Load().(string)],
CurrentUser: user, CurrentUser: user,
NoticeList: []string{"test"}, NoticeList: []string{"test"},
Stylesheets: []string{"panel.css"}, Stylesheets: []HResource{HResource{"panel.css", "d"}},
Scripts: []HResource{HResource{"whatever.js", "d"}}, Scripts: []HResource{HResource{"whatever.js", "d"}},
PreScriptsAsync: []HResource{HResource{"whatever.js", "d"}}, PreScriptsAsync: []HResource{HResource{"whatever.js", "d"}},
ScriptsAsync: []HResource{HResource{"whatever.js", "d"}}, ScriptsAsync: []HResource{HResource{"whatever.js", "d"}},

View File

@ -60,7 +60,7 @@ func bbcodeRegexParse(msg string) string {
msg = bbcodeStrikethrough.ReplaceAllString(msg, "<s>$1</s>") msg = bbcodeStrikethrough.ReplaceAllString(msg, "<s>$1</s>")
msg = bbcodeURL.ReplaceAllString(msg, "<a href=''$1$2//$3' rel='nofollow'>$1$2//$3</i>") msg = bbcodeURL.ReplaceAllString(msg, "<a href=''$1$2//$3' rel='nofollow'>$1$2//$3</i>")
msg = bbcodeURLLabel.ReplaceAllString(msg, "<a href=''$1$2//$3' rel='nofollow'>$4</i>") msg = bbcodeURLLabel.ReplaceAllString(msg, "<a href=''$1$2//$3' rel='nofollow'>$4</i>")
msg = bbcodeQuotes.ReplaceAllString(msg, "<span class='postQuote'>$1</span>") msg = bbcodeQuotes.ReplaceAllString(msg, "<blockquote>$1</blockquote>")
//msg = bbcodeCode.ReplaceAllString(msg,"<span class='codequotes'>$1</span>") //msg = bbcodeCode.ReplaceAllString(msg,"<span class='codequotes'>$1</span>")
return msg return msg
} }
@ -197,7 +197,7 @@ func bbcodeParseWithoutCode(msg string) string {
msg = string(msgbytes) msg = string(msgbytes)
msg = bbcodeURL.ReplaceAllString(msg, "<a href='$1$2//$3' rel='nofollow'>$1$2//$3</i>") msg = bbcodeURL.ReplaceAllString(msg, "<a href='$1$2//$3' rel='nofollow'>$1$2//$3</i>")
msg = bbcodeURLLabel.ReplaceAllString(msg, "<a href='$1$2//$3' rel='nofollow'>$4</i>") msg = bbcodeURLLabel.ReplaceAllString(msg, "<a href='$1$2//$3' rel='nofollow'>$4</i>")
msg = bbcodeQuotes.ReplaceAllString(msg, "<span class='postQuote'>$1</span>") msg = bbcodeQuotes.ReplaceAllString(msg, "<blockquote>$1</blockquote>")
return bbcodeCode.ReplaceAllString(msg, "<span class='codequotes'>$1</span>") return bbcodeCode.ReplaceAllString(msg, "<span class='codequotes'>$1</span>")
} }
return string(msgbytes) return string(msgbytes)
@ -323,7 +323,7 @@ func bbcodeFullParse(msg string) string {
//msg = bbcode_url.ReplaceAllString(msg,"<a href=\"$1$2//$3\" rel=\"nofollow\">$1$2//$3</i>") //msg = bbcode_url.ReplaceAllString(msg,"<a href=\"$1$2//$3\" rel=\"nofollow\">$1$2//$3</i>")
msg = bbcodeURLLabel.ReplaceAllString(msg, "<a href='$1$2//$3' rel='nofollow'>$4</i>") msg = bbcodeURLLabel.ReplaceAllString(msg, "<a href='$1$2//$3' rel='nofollow'>$4</i>")
msg = bbcodeQuotes.ReplaceAllString(msg, "<span class='postQuote'>$1</span>") msg = bbcodeQuotes.ReplaceAllString(msg, "<blockquote>$1</blockquote>")
msg = bbcodeCode.ReplaceAllString(msg, "<span class='codequotes'>$1</span>") msg = bbcodeCode.ReplaceAllString(msg, "<span class='codequotes'>$1</span>")
} else { } else {
msg = string(msgbytes[0 : len(msgbytes)-10]) msg = string(msgbytes[0 : len(msgbytes)-10])

View File

@ -60,10 +60,10 @@ func TestBBCodeRender(t *testing.T) {
msgList.Add("[code]hi[/code]", "<span class='codequotes'>hi</span>") msgList.Add("[code]hi[/code]", "<span class='codequotes'>hi</span>")
msgList.Add("[code][b]hi[/b][/code]", "<span class='codequotes'>[b]hi[/b]</span>") msgList.Add("[code][b]hi[/b][/code]", "<span class='codequotes'>[b]hi[/b]</span>")
msgList.Add("[code][b]hi[/code][/b]", "<span class='codequotes'>[b]hi</span>[/b]") msgList.Add("[code][b]hi[/code][/b]", "<span class='codequotes'>[b]hi</span>[/b]")
msgList.Add("[quote]hi[/quote]", "<span class='postQuote'>hi</span>") msgList.Add("[quote]hi[/quote]", "<blockquote>hi</blockquote>")
msgList.Add("[quote][b]hi[/b][/quote]", "<span class='postQuote'><b>hi</b></span>") msgList.Add("[quote][b]hi[/b][/quote]", "<blockquote><b>hi</b></blockquote>")
msgList.Add("[quote][b]h[/b][/quote]", "<span class='postQuote'><b>h</b></span>") msgList.Add("[quote][b]h[/b][/quote]", "<blockquote><b>h</b></blockquote>")
msgList.Add("[quote][b][/b][/quote]", "<span class='postQuote'><b></b></span>") msgList.Add("[quote][b][/b][/quote]", "<blockquote><b></b></blockquote>")
msgList.Add("[url][/url]", "<a href=''></a>") msgList.Add("[url][/url]", "<a href=''></a>")
msgList.Add("[url]https://github.com/Azareal/Gosora[/url]", "<a href='https://github.com/Azareal/Gosora'>https://github.com/Azareal/Gosora</a>") msgList.Add("[url]https://github.com/Azareal/Gosora[/url]", "<a href='https://github.com/Azareal/Gosora'>https://github.com/Azareal/Gosora</a>")
msgList.Add("[url]http://github.com/Azareal/Gosora[/url]", "<a href='http://github.com/Azareal/Gosora'>http://github.com/Azareal/Gosora</a>") msgList.Add("[url]http://github.com/Azareal/Gosora[/url]", "<a href='http://github.com/Azareal/Gosora'>http://github.com/Azareal/Gosora</a>")

View File

@ -1,7 +1,9 @@
"use strict" "use strict";
$(document).ready(function(){ (() => {
addInitHook("end_init", () => {
$("#dash_username input").click(function(){ $("#dash_username input").click(function(){
$("#dash_username button").show(); $("#dash_username button").show();
}); });
}); });
})();

View File

@ -12,7 +12,9 @@ function handle_profile_hashbit() {
$("." + hash_class).show(); $("." + hash_class).show();
} }
$(document).ready(() => { (() => {
addInitHook("end_init", () => {
if(window.location.hash) handle_profile_hashbit(); if(window.location.hash) handle_profile_hashbit();
window.addEventListener("hashchange", handle_profile_hashbit, false); window.addEventListener("hashchange", handle_profile_hashbit, false);
}); });
})();

View File

@ -356,7 +356,7 @@ func accountEditHead(titlePhrase string, w http.ResponseWriter, r *http.Request,
header.Title = phrases.GetTitlePhrase(titlePhrase) header.Title = phrases.GetTitlePhrase(titlePhrase)
header.Path = "/user/edit/" header.Path = "/user/edit/"
header.AddSheet(header.Theme.Name + "/account.css") header.AddSheet(header.Theme.Name + "/account.css")
header.AddScript("account.js") header.AddScriptAsync("account.js")
} }
func AccountEdit(w http.ResponseWriter, r *http.Request, user common.User, header *common.Header) common.RouteError { func AccountEdit(w http.ResponseWriter, r *http.Request, user common.User, header *common.Header) common.RouteError {

View File

@ -32,7 +32,7 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user common.User, heade
// TODO: Preload this? // TODO: Preload this?
header.AddSheet(header.Theme.Name + "/profile.css") header.AddSheet(header.Theme.Name + "/profile.css")
if user.Loggedin { if user.Loggedin {
header.AddScript("profile_member.js") header.AddScriptAsync("profile_member.js")
} }
var err error var err error

View File

@ -4,7 +4,7 @@
<title>{{.Title}} | {{.Header.Site.Name}}</title> <title>{{.Title}} | {{.Header.Site.Name}}</title>
<link href="/static/{{.Header.Theme.Name}}/main.css" rel="stylesheet" type="text/css"> <link href="/static/{{.Header.Theme.Name}}/main.css" rel="stylesheet" type="text/css">
{{range .Header.Stylesheets}} {{range .Header.Stylesheets}}
<link href="/static/{{.}}" rel="stylesheet" type="text/css">{{end}} <link href="/static/{{.Name}}{{if .Hash}}?h={{.Hash}}{{end}}" rel="stylesheet" type="text/css">{{end}}
{{range .Header.PreScriptsAsync}} {{range .Header.PreScriptsAsync}}
<script async type="text/javascript" src="/static/{{.Name}}{{if .Hash}}?h={{.Hash}}{{end}}"></script>{{end}} <script async type="text/javascript" src="/static/{{.Name}}{{if .Hash}}?h={{.Hash}}{{end}}"></script>{{end}}
<meta property="x-loggedin" content="{{.CurrentUser.Loggedin}}" /> <meta property="x-loggedin" content="{{.CurrentUser.Loggedin}}" />

View File

@ -997,6 +997,12 @@ textarea {
width: 100%; width: 100%;
max-width: 240px; max-width: 240px;
} }
blockquote {
margin: 0px;
background-color: #EEEEEE;
padding: 12px;
margin-bottom: -3px;
}
.post_item { .post_item {
display: flex; display: flex;
margin-bottom: 16px; margin-bottom: 16px;

View File

@ -32,14 +32,16 @@
.rowmenu { .rowmenu {
margin-left: 18px; margin-left: 18px;
margin-bottom: 2px; /*margin-bottom: 2px;*/
margin-bottom: 3px;
font-size: 17px; font-size: 17px;
} }
.rowmenu a { .rowmenu a {
color: rgb(180, 180, 180); color: rgb(180, 180, 180);
} }
.rowmenu .rowitem { .rowmenu .rowitem {
margin-bottom: 4px; /*margin-bottom: 4px;*/
margin-bottom: 6px;
} }
.to_right { .to_right {

View File

@ -199,6 +199,7 @@ li a {
border-radius: 3px; border-radius: 3px;
background-color: #444444; background-color: #444444;
padding: 16px; padding: 16px;
/*padding: 18px;*/
} }
.filter_item { .filter_item {
margin-bottom: 5px; margin-bottom: 5px;
@ -729,6 +730,19 @@ button, .formbutton, .panel_right_button:not(.has_inner_button) {
width: 100%; width: 100%;
max-width: 320px; max-width: 320px;
} }
blockquote {
background-color: #555555;
border-radius: 3px;
padding: 8px;
margin: 0px;
margin-bottom: 8px;
}
blockquote + br {
display: none;
}
blockquote:only-child {
margin-bottom: 0px;
}
.post_item { .post_item {
display: flex; display: flex;
margin-bottom: 12px; margin-bottom: 12px;

View File

@ -18,8 +18,10 @@
{{template "acc_panel_common.css" }} {{template "acc_panel_common.css" }}
.colstack_left .colstack_head { .colstack_left .colstack_head {
font-size: 19px; font-size: 19px;
padding-top: 10px; /*padding-top: 10px;
padding-bottom: 10px; padding-bottom: 10px;*/
padding-top: 12px;
padding-bottom: 12px;
} }
.menu_stats { .menu_stats {
margin-left: 4px; margin-left: 4px;
@ -120,8 +122,10 @@
} }
#panel_users .rowitem { #panel_users .rowitem {
padding-top: 20px;
padding-left: 4px; padding-left: 4px;
padding-right: 4px; padding-right: 4px;
padding-bottom: 18px;
} }
button, .formbutton, .panel_right_button:not(.has_inner_button), #panel_users .profile_url { button, .formbutton, .panel_right_button:not(.has_inner_button), #panel_users .profile_url {
background: rgb(100,100,200); background: rgb(100,100,200);

View File

@ -888,6 +888,11 @@ input[type=checkbox]:checked + label.poll_option_label .sel {
background-color: rgb(71,71,71); background-color: rgb(71,71,71);
padding: 10px; padding: 10px;
} }
blockquote {
background-color: rgb(71,71,71);
margin: 0px;
padding: 10px;
}
/* Profiles */ /* Profiles */
#profile_left_lane { #profile_left_lane {

View File

@ -1,4 +1,5 @@
$(document).ready(function(){ (() => {
addInitHook("end_init", () => {
// TODO: Run this when the image is loaded rather than when the document is ready? // TODO: Run this when the image is loaded rather than when the document is ready?
$(".topic_list img").each(function(){ $(".topic_list img").each(function(){
let aspectRatio = this.naturalHeight / this.naturalWidth; let aspectRatio = this.naturalHeight / this.naturalWidth;
@ -10,4 +11,5 @@ $(document).ready(function(){
height: aspectRatio * this.width height: aspectRatio * this.width
}); });
}); });
}); });
})();

View File

@ -16,7 +16,8 @@
"Resources": [ "Resources": [
{ {
"Name":"shadow/misc.js", "Name":"shadow/misc.js",
"Location":"global" "Location":"global",
"Async":true
} }
] ]
} }

View File

@ -1,3 +1,6 @@
#back {
width: 100%;
}
.sidebar { .sidebar {
display: none; display: none;
} }

View File

@ -155,6 +155,9 @@ li a {
#main { #main {
width: 100%; width: 100%;
} }
main > *:last-child {
margin-bottom: 12px;
}
.rowblock { .rowblock {
border: 1px solid hsl(0, 0%, 80%); border: 1px solid hsl(0, 0%, 80%);
@ -541,6 +544,14 @@ input, select {
background-color: white; background-color: white;
padding: 10px; padding: 10px;
} }
/*blockquote {
background-color: #EEEEEE;
padding: 12px;
margin: 0px;
}
.staff_post blockquote {
background-color: rgba(255, 214, 255, 1);
}*/
.little_row_avatar { .little_row_avatar {
display: none; display: none;
@ -742,7 +753,7 @@ button.username {
background-color: rgb(255,245,245); background-color: rgb(255,245,245);
} }
.postQuote { blockquote {
border: 1px solid hsl(0, 0%, 80%); border: 1px solid hsl(0, 0%, 80%);
background: white; background: white;
padding: 5px; padding: 5px;
@ -967,8 +978,9 @@ input[type=checkbox]:checked + label.poll_option_label .sel {
.pageset { .pageset {
display: flex; display: flex;
margin-bottom: 10px; /*margin-bottom: 10px;*/
margin-top: 8px; margin-top: 8px;
margin-bottom: 2px;
} }
.pageitem { .pageitem {
background-color: white; background-color: white;

View File

@ -1,7 +1,7 @@
@media(min-width: 881px) { @media(min-width: 881px) {
.shrink_main { .shrink_main {
float: left; float: left;
width: calc(75% - 12px); /*width: calc(75% - 12px);*/
} }
.sidebar { .sidebar {
float: left; float: left;

View File

@ -1,4 +1,5 @@
$(document).ready(function(){ (() => {
addInitHook("end_init", () => {
// TODO: Run this when the image is loaded rather than when the document is ready? // TODO: Run this when the image is loaded rather than when the document is ready?
$(".topic_list img").each(function(){ $(".topic_list img").each(function(){
let aspectRatio = this.naturalHeight / this.naturalWidth; let aspectRatio = this.naturalHeight / this.naturalWidth;
@ -10,4 +11,5 @@ $(document).ready(function(){
height: aspectRatio * this.width height: aspectRatio * this.width
}); });
}); });
}); });
})();

View File

@ -1,3 +1,6 @@
#back {
width: 100%;
}
.sidebar { .sidebar {
display: none; display: none;
} }

View File

@ -1,3 +1,6 @@
#back {
width: 100%;
}
.sidebar { .sidebar {
display: none; display: none;
} }

View File

@ -17,7 +17,8 @@
"Resources": [ "Resources": [
{ {
"Name":"tempra_simple/misc.js", "Name":"tempra_simple/misc.js",
"Location":"global" "Location":"global",
"Async":true
} }
] ]
} }