Skip to content

Commit

Permalink
feature: Maybe meta tag stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
LichtHund committed Jun 25, 2024
1 parent ea2d86c commit 284ebbb
Show file tree
Hide file tree
Showing 11 changed files with 191 additions and 6 deletions.
3 changes: 3 additions & 0 deletions backend/src/main/kotlin/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@ import io.ktor.server.netty.Netty
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.transactions.transaction
import java.io.File
import java.util.Properties

public val DATA_FOLDER: File = File("data")

public fun main() {
// Database connection
Database.connect(
Expand Down
2 changes: 2 additions & 0 deletions backend/src/main/kotlin/Module.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import io.ktor.server.application.Application
import io.ktor.server.application.install
import io.ktor.server.auth.Authentication
import io.ktor.server.auth.bearer
import io.ktor.server.http.content.staticFiles
import io.ktor.server.http.content.staticResources
import io.ktor.server.plugins.cachingheaders.CachingHeaders
import io.ktor.server.plugins.callloging.CallLogging
Expand Down Expand Up @@ -68,6 +69,7 @@ public fun Application.module() {
routing {

staticResources("/static", "static")
staticFiles("/banners", DATA_FOLDER)

install(CachingHeaders) {
options { _, outgoingContent ->
Expand Down
27 changes: 27 additions & 0 deletions backend/src/main/kotlin/api/ProjectSetup.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package dev.triumphteam.backend.api

import dev.triumphteam.backend.DATA_FOLDER
import dev.triumphteam.backend.api.database.DocVersionEntity
import dev.triumphteam.backend.api.database.PageEntity
import dev.triumphteam.backend.api.database.ProjectEntity
import dev.triumphteam.backend.banner.BannerMaker
import dev.triumphteam.website.project.Project
import org.jetbrains.exposed.sql.transactions.transaction
import java.net.URL
import javax.imageio.ImageIO

private val bannerMaker = BannerMaker()

public fun setupRepository(projects: List<Project>) {
transaction {
Expand All @@ -21,6 +27,8 @@ public fun setupRepository(projects: List<Project>) {
this.github = project.projectHome
}

val projectIcon = ImageIO.read(URL(project.icon))

project.versions.forEach { version ->

val versionEntity = DocVersionEntity.new(version.reference) {
Expand All @@ -30,7 +38,26 @@ public fun setupRepository(projects: List<Project>) {
this.recommended = version.recommended
}

val versionFolder = DATA_FOLDER.resolve("${project.id}/${version.reference}").also {
it.mkdirs()
}

version.pages.forEach { page ->

val pageDir = versionFolder.resolve(page.id).also {
it.mkdirs()
}

page.banner.apply {
bannerMaker.create(
icon = projectIcon,
group = group,
title = title,
subTitle = subTitle,
output = pageDir.resolve("banner.png"),
)
}

PageEntity.new(page.id) {
this.project = projectEntity
this.version = versionEntity
Expand Down
74 changes: 74 additions & 0 deletions backend/src/main/kotlin/banner/BannerMaker.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package dev.triumphteam.backend.banner

import java.awt.Font
import java.awt.RenderingHints
import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO


public class BannerMaker {

private val template =
requireNotNull(BannerMaker::class.java.classLoader.getResourceAsStream("board/board-template.png")) {
"Could not find banner template!"
}

private val templateImage = ImageIO.read(template)
private val fontRegular = resourceFont("board/poppins.ttf")
private val fontBold = resourceFont("board/bold-poppins.ttf")

public fun create(
icon: BufferedImage,
group: String,
title: String?,
subTitle: String?,
output: File,
) {

val image = templateImage.deepCopy()
val graphics = image.createGraphics()

graphics.apply {
// Change the quality of the strings rendered
setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,
)

// First write the bold part
font = fontBold.deriveFont(64f)
title?.let { drawString(it, 66, 429) }

// Then the rest
font = fontRegular.deriveFont(30f)
drawString(group, 66, 359)
subTitle?.let { drawString(it, 66, 479) }

// Then the icon
drawImage(icon, 712, 170, null)

// Finally dispose
dispose()
}

ImageIO.write(image, "png", output)
}

private fun resourceFont(path: String): Font {
val input = requireNotNull(BannerMaker::class.java.classLoader.getResourceAsStream(path)) {
"Could not find font on path '$path'!"
}

return requireNotNull(Font.createFont(Font.PLAIN, input)) {
"Could not create font on path '$path'!"
}
}

public fun BufferedImage.deepCopy(): BufferedImage {
val cm = colorModel
val isAlphaPremultiplied = cm.isAlphaPremultiplied
val raster = copyData(null)
return BufferedImage(cm, raster, isAlphaPremultiplied, null)
}
}
31 changes: 27 additions & 4 deletions backend/src/main/kotlin/website/pages/docs/DocsPage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import kotlinx.html.h1
import kotlinx.html.id
import kotlinx.html.img
import kotlinx.html.li
import kotlinx.html.meta
import kotlinx.html.script
import kotlinx.html.style
import kotlinx.html.styleLink
Expand Down Expand Up @@ -92,15 +93,37 @@ private fun HTML.renderFullPage(
developmentMode: Boolean,
project: ProjectData,
version: Version,
currentVersion: Page,
currentPage: Page,
) {
setupHead(developmentMode) {

styleLink("/static/css/docs_style.css")
styleLink("/static/css/docs_content.css")
styleLink("/static/css/themes/one_dark.css")

title { +"TrimphTeam | ${project.name}" }
val title = "TrimphTeam | ${project.name}"

meta {
name = "og:type"
content = "website"
}

meta {
name = "og:title"
content = title
}

meta {
name = "og:description"
content = "Bussy"
}

meta {
name = "og:image"
content = "/banners/${project.id}/${version.reference}/${currentPage.id}/banner.png"
}

title { +title }

style {
+CssBuilder().apply {
Expand Down Expand Up @@ -136,8 +159,8 @@ private fun HTML.renderFullPage(

classes = setOf("bg-docs-bg", "text-white", "overflow-y-auto overflow-x-hidden")

sideBar(project, version, currentVersion)
content(currentVersion)
sideBar(project, version, currentPage)
content(currentPage)
toast()

script {
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file added backend/src/main/resources/board/poppins.ttf
Binary file not shown.
11 changes: 10 additions & 1 deletion common/src/main/kotlin/project/SerialRepresentation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,16 @@ public data class Page(
public val id: String,
public val content: String,
public val summary: PageSummary,
)
public val banner: Banner,
) {

@Serializable
public data class Banner(
public val title: String?,
public val group: String,
public val subTitle: String?,
)
}

@Serializable
public data class SummaryEntry(
Expand Down
14 changes: 13 additions & 1 deletion docs/src/main/kotlin/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package dev.triumphteam.website.docs
import dev.triumphteam.website.HoconSerializer
import dev.triumphteam.website.JsonSerializer
import dev.triumphteam.website.api.Api
import dev.triumphteam.website.docs.markdown.BannerDataRenderer
import dev.triumphteam.website.docs.markdown.MarkdownRenderer
import dev.triumphteam.website.docs.markdown.hint.HintExtension
import dev.triumphteam.website.docs.markdown.summary.SummaryRenderer
Expand Down Expand Up @@ -112,6 +113,9 @@ public suspend fun main(args: Array<String>) {
}
})

println(JsonSerializer.encode<Repository>(repo))
return

logger.info("Paring complete!")
logger.info("Uploading..")

Expand Down Expand Up @@ -173,14 +177,22 @@ private fun parseVersions(versionDirs: List<File>, parentDir: File, repoSettings
}

val parsedFile = mdParser.parse(pageFile.readText())

val (bannerHeader, bannerParagraph) = BannerDataRenderer().render(parsedFile)

pageCollector.collect(
Page(
id = pageFile.nameWithoutExtension.lowercase(),
content = htmlRenderer.render(parsedFile),
summary = PageSummary(
path = "${repoSettings.editPath.removeSuffix("/")}/${pageFile.relativeTo(parentDir).path}",
entries = summaryRenderer.render(parsedFile),
)
),
banner = Page.Banner(
title = bannerHeader,
subTitle = bannerParagraph,
group = parsedGroupConfig.header,
),
)
)
}
Expand Down
35 changes: 35 additions & 0 deletions docs/src/main/kotlin/markdown/BannerDataRenderer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package dev.triumphteam.website.docs.markdown

import org.commonmark.node.AbstractVisitor
import org.commonmark.node.HtmlBlock
import org.commonmark.node.Node

private val headerPattern = "(?<=<center><h1>)[^<]+(?=</h1></center>)".toRegex()
private val paragraphPattern = "(?<=<center><p>)[^<]+(?=</p></center>)".toRegex()

public class BannerDataRenderer : AbstractVisitor() {

private var header: String? = null
private var paragraph: String? = null

public fun render(node: Node): Pair<String?, String?> {
node.accept(this)

return header to paragraph
}

override fun visit(block: HtmlBlock) {
val literal = block.literal

val headerMatch = headerPattern.find(literal)
if (headerMatch != null) {
if (header != null) return
header = headerMatch.value
return
}

val paragraphMatch = headerPattern.find(literal) ?: return
if (paragraph != null) return
paragraph = paragraphMatch.value
}
}

0 comments on commit 284ebbb

Please sign in to comment.