From bb9f52f0366312a931d32a9b59818d828abb7047 Mon Sep 17 00:00:00 2001 From: Lanius Trolling Date: Sat, 6 Apr 2024 08:29:03 -0400 Subject: [PATCH] We like to refactor. We do a little refactoring --- .../kotlin/info/mechyrdia/Factbooks.kt | 5 -- .../kotlin/info/mechyrdia/data/nations.kt | 7 ++- .../kotlin/info/mechyrdia/lore/fonts.kt | 8 ++-- .../kotlin/info/mechyrdia/lore/html_utils.kt | 12 ----- .../kotlin/info/mechyrdia/lore/parser_html.kt | 2 - .../kotlin/info/mechyrdia/lore/preparser.kt | 8 ++-- .../kotlin/info/mechyrdia/lore/view_tpl.kt | 48 ++++++++----------- .../kotlin/info/mechyrdia/lore/views_quote.kt | 36 +++++++------- 8 files changed, 51 insertions(+), 75 deletions(-) diff --git a/src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt b/src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt index 3b5055d..af9fcc4 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt @@ -34,9 +34,6 @@ import org.slf4j.event.Level import java.io.IOException import java.util.concurrent.atomic.AtomicLong -lateinit var application: Application - private set - fun main() { System.setProperty("logback.statusListenerClass", "ch.qos.logback.core.status.NopStatusListener") @@ -48,8 +45,6 @@ fun main() { } fun Application.factbooks() { - application = this - install(AutoHeadResponse) install(IgnoreTrailingSlash) diff --git a/src/jvmMain/kotlin/info/mechyrdia/data/nations.kt b/src/jvmMain/kotlin/info/mechyrdia/data/nations.kt index 15c12fe..5f1e744 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/data/nations.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/data/nations.kt @@ -2,7 +2,6 @@ package info.mechyrdia.data import com.github.agadar.nationstates.shard.NationShard import info.mechyrdia.OwnerNationId -import info.mechyrdia.application import info.mechyrdia.auth.NSAPI import info.mechyrdia.auth.UserSession import info.mechyrdia.auth.executeSuspend @@ -11,6 +10,8 @@ import io.ktor.server.sessions.* import io.ktor.util.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.util.concurrent.ConcurrentHashMap @Serializable @@ -23,6 +24,8 @@ data class NationData( val isBanned: Boolean = false ) : DataDocument { companion object : TableHolder { + private val logger: Logger = LoggerFactory.getLogger(NationData::class.java) + override val Table = DocumentTable() override suspend fun initialize() { @@ -30,7 +33,7 @@ data class NationData( } fun unknown(id: Id): NationData { - application.log.warn("Unable to find nation with Id $id - did it CTE?") + logger.warn("Unable to find nation with Id $id - did it CTE?") return NationData(id, "Unknown Nation", "https://www.nationstates.net/images/flags/exnation.png") } diff --git a/src/jvmMain/kotlin/info/mechyrdia/lore/fonts.kt b/src/jvmMain/kotlin/info/mechyrdia/lore/fonts.kt index 6fc9f79..9ddcf3e 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/lore/fonts.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/lore/fonts.kt @@ -4,12 +4,12 @@ import com.jaredrummler.fontreader.truetype.FontFileReader import com.jaredrummler.fontreader.truetype.TTFFile import com.jaredrummler.fontreader.util.GlyphSequence import info.mechyrdia.Configuration -import info.mechyrdia.application import info.mechyrdia.route.KeyedEnumSerializer import info.mechyrdia.yieldThread -import io.ktor.server.application.* import io.ktor.util.* import kotlinx.serialization.Serializable +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.awt.Font import java.awt.Shape import java.awt.geom.AffineTransform @@ -46,6 +46,8 @@ enum class TextAlignment { object TextAlignmentSerializer : KeyedEnumSerializer(TextAlignment.entries) object MechyrdiaSansFont { + private val logger: Logger = LoggerFactory.getLogger(MechyrdiaSansFont::class.java) + fun renderTextToSvg(text: String, bold: Boolean, italic: Boolean, align: TextAlignment): String { val (file, font) = getFont(bold, italic) return layoutText(text, file, font, align).toSvgDocument(80.0 / file.unitsPerEm, 12.0) @@ -197,7 +199,7 @@ object MechyrdiaSansFont { return shape } catch (ex: Exception) { - application.log.error("Error converting text $text to font shape", ex) + logger.error("Error converting text $text to font shape", ex) return GeneralPath() } finally { g2d.dispose() diff --git a/src/jvmMain/kotlin/info/mechyrdia/lore/html_utils.kt b/src/jvmMain/kotlin/info/mechyrdia/lore/html_utils.kt index 5d4e59f..c8ba93a 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/lore/html_utils.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/lore/html_utils.kt @@ -3,18 +3,6 @@ package info.mechyrdia.lore import kotlinx.html.* import java.time.Instant -fun interface SECTIONS { - fun section(body: SECTION.() -> Unit) -} - -fun MAIN.sectioned(): SECTIONS = MainSections(this) - -private class MainSections(private val delegate: MAIN) : SECTIONS { - override fun section(body: SECTION.() -> Unit) { - delegate.section(block = body) - } -} - fun FlowOrPhrasingContent.dateTime(instant: Instant) { span(classes = "moment") { style = "display:none" diff --git a/src/jvmMain/kotlin/info/mechyrdia/lore/parser_html.kt b/src/jvmMain/kotlin/info/mechyrdia/lore/parser_html.kt index ecbb623..46973f7 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/lore/parser_html.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/lore/parser_html.kt @@ -368,8 +368,6 @@ fun processCommentLink(param: String?): Map = processExternalLin fun processCommentImage(url: String, domain: String) = "https://$domain/${url.sanitizeExtImgLink()}" -fun processAnchor(param: String?): Map = param?.let { mapOf("id" to it, "name" to it) }.orEmpty() - enum class FactbookFormattingTag(val type: HtmlLexerTag) { B(HtmlTagLexerTag(attributes = mapOf("style" to "font-weight:bold"), tagMode = HtmlTagMode.INLINE, tagCreator = TagConsumer<*>::span.toTagCreator())), I(HtmlTagLexerTag(attributes = mapOf("style" to "font-style:italic"), tagMode = HtmlTagMode.INLINE, tagCreator = TagConsumer<*>::span.toTagCreator())), diff --git a/src/jvmMain/kotlin/info/mechyrdia/lore/preparser.kt b/src/jvmMain/kotlin/info/mechyrdia/lore/preparser.kt index e5cf35a..a3ce0a2 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/lore/preparser.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/lore/preparser.kt @@ -1,12 +1,14 @@ package info.mechyrdia.lore -import info.mechyrdia.application -import io.ktor.server.application.* import io.pebbletemplates.pebble.PebbleEngine import io.pebbletemplates.pebble.error.PebbleException +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.io.StringWriter object PreParser { + private val logger: Logger = LoggerFactory.getLogger(PreParser::class.java) + private val pebble = PebbleEngine.Builder() .addEscapingStrategy("none", PebbleNoEscaping) .defaultEscapingStrategy("none") @@ -24,7 +26,7 @@ object PreParser { template.evaluate(writer, context) return writer.toString() } catch (ex: PebbleException) { - application.log.error("Runtime error pre-parsing factbook $name", ex) + logger.error("Runtime error pre-parsing factbook $name", ex) "[h1]Error[/h1]\n\nThere was a runtime error pre-parsing this factbook: ${ex.message}" } } diff --git a/src/jvmMain/kotlin/info/mechyrdia/lore/view_tpl.kt b/src/jvmMain/kotlin/info/mechyrdia/lore/view_tpl.kt index 746744c..bfa20dd 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/lore/view_tpl.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/lore/view_tpl.kt @@ -32,6 +32,24 @@ val preloadImages = listOf( "icon.png", ) +context(ApplicationCall) +private fun HEAD.initialHead(pageTitle: String, ogData: OpenGraphData?) { + meta(charset = "utf-8") + meta(name = "viewport", content = "width=device-width, initial-scale=1.0") + + meta(name = "theme-color", content = "#FFCC33") + + ogData?.let { data -> + renderOgData(pageTitle, data) + } + + link(rel = "icon", type = "image/svg+xml", href = "/static/images/icon.png") + + title { + +pageTitle + } +} + fun ApplicationCall.page(pageTitle: String, navBar: List? = null, sidebar: Sidebar? = null, ogData: OpenGraphData? = null, content: MAIN.() -> Unit): HTML.() -> Unit { return { pageTheme.attributeValue?.let { attributes["data-theme"] = it } @@ -39,14 +57,7 @@ fun ApplicationCall.page(pageTitle: String, navBar: List? = null, sideb lang = "en" head { - meta(charset = "utf-8") - meta(name = "viewport", content = "width=device-width, initial-scale=1.0") - - meta(name = "theme-color", content = "#FFCC33") - - ogData?.let { data -> - renderOgData(pageTitle, data) - } + initialHead(pageTitle, ogData) for (font in preloadFonts) link( @@ -66,8 +77,6 @@ fun ApplicationCall.page(pageTitle: String, navBar: List? = null, sideb attributes["as"] = "image" } - link(rel = "icon", type = "image/svg+xml", href = "/static/images/icon.png") - link(rel = "stylesheet", type = "text/css", href = "/static/style.css") request.queryParameters["redirect"]?.let { redirect -> @@ -80,10 +89,6 @@ fun ApplicationCall.page(pageTitle: String, navBar: List? = null, sideb } script(src = "/static/init.js") {} - - title { - +pageTitle - } } body { div { id = "bg" } @@ -168,22 +173,9 @@ fun ApplicationCall.rawPage(pageTitle: String, ogData: OpenGraphData? = null, co lang = "en" head { - meta(charset = "utf-8") - meta(name = "viewport", content = "width=device-width, initial-scale=1.0") - - meta(name = "theme-color", content = "#FFCC33") - - ogData?.let { data -> - renderOgData(pageTitle, data) - } - - link(rel = "icon", type = "image/svg+xml", href = "/static/images/icon.png") + initialHead(pageTitle, ogData) link(rel = "stylesheet", type = "text/css", href = "/static/raw.css") - - title { - +pageTitle - } } body { content() diff --git a/src/jvmMain/kotlin/info/mechyrdia/lore/views_quote.kt b/src/jvmMain/kotlin/info/mechyrdia/lore/views_quote.kt index 6526500..4b540ed 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/lore/views_quote.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/lore/views_quote.kt @@ -94,21 +94,26 @@ fun Quote.toJson(): String { }.toString() } +context(Quote) +private fun FlowContent.quoteWithAttribution() { + h1 { +title } + blockQuote { + +quote + } + p { + style = "align:right" + unsafe { raw("―") } + +Entities.nbsp + a(href = fullLink) { +author } + } +} + context(ApplicationCall) suspend fun Quote.toHtml(title: String): HTML.() -> Unit { return page(title, standardNavBar(), QuoteOriginSidebar(author, fullPortrait, fullLink)) { section { a { id = "page-top" } - h1 { +title } - blockQuote { - +quote - } - p { - style = "align:right" - unsafe { raw("―") } - +Entities.nbsp - a(href = fullLink) { +author } - } + quoteWithAttribution() } } } @@ -116,16 +121,7 @@ suspend fun Quote.toHtml(title: String): HTML.() -> Unit { context(ApplicationCall) fun Quote.toRawHtml(title: String): HTML.() -> Unit { return rawPage(title) { - h1 { +title } - blockQuote { - +quote - } - p { - style = "align:right" - unsafe { raw("―") } - +Entities.nbsp - a(href = fullLink) { +author } - } + quoteWithAttribution() p { style = "align:center" a(href = fullLink) { -- 2.25.1