lila/app/templating/AssetHelper.scala

108 lines
4.0 KiB
Scala

package lila.app
package templating
import controllers.routes
import play.twirl.api.Html
import lila.api.Context
import lila.common.AssetVersion
trait AssetHelper { self: I18nHelper =>
def isProd: Boolean
val assetDomain = lila.api.Env.current.Net.AssetDomain
val assetBaseUrl = s"//$assetDomain"
def cdnUrl(path: String) = s"$assetBaseUrl$path"
def staticUrl(path: String) = s"$assetBaseUrl${routes.Assets.at(path)}"
def dbImageUrl(path: String) = s"$assetBaseUrl/image/$path"
def cssTag(name: String, staticDomain: Boolean = true)(implicit ctx: Context): Html =
cssAt("stylesheets/" + name, staticDomain)
def cssVendorTag(name: String, staticDomain: Boolean = true)(implicit ctx: Context) =
cssAt("vendor/" + name, staticDomain)
def cssAt(path: String, staticDomain: Boolean, version: AssetVersion): Html = Html {
val href = if (staticDomain) staticUrl(path) else routes.Assets.at(path)
s"""<link href="$href?v=$version" type="text/css" rel="stylesheet"/>"""
}
def cssAt(path: String, staticDomain: Boolean = true)(implicit ctx: Context): Html =
cssAt(path, staticDomain, ctx.pageData.assetVersion)
def jsTag(name: String, async: Boolean = false)(implicit ctx: Context) =
jsAt("javascripts/" + name, async = async)
def jsTagCompiled(name: String)(implicit ctx: Context) =
if (isProd) jsAt("compiled/" + name) else jsTag(name)
def jsAt(path: String, static: Boolean, async: Boolean, version: AssetVersion): Html = Html {
s"""<script${if (async) " async defer" else ""} src="${static.fold(staticUrl(path), path)}?v=$version"></script>"""
}
def jsAt(path: String, static: Boolean = true, async: Boolean = false)(implicit ctx: Context): Html =
jsAt(path, static, async, ctx.pageData.assetVersion)
val jQueryTag = Html {
s"""<script src="${staticUrl("javascripts/vendor/jquery.min.js")}"></script>"""
}
val highchartsTag = cdnOrLocal(
cdn = "//code.highcharts.com/4.1.4/highcharts.js",
test = "window.Highcharts",
local = staticUrl("vendor/highcharts4/highcharts.js")
)
val highchartsLatestTag = cdnOrLocal(
cdn = "//code.highcharts.com/4.2/highcharts.js",
test = "window.Highcharts",
local = staticUrl("vendor/highcharts-4.2.5/highcharts.js")
)
val highchartsMoreTag = Html {
"""<script src="//code.highcharts.com/4.1.4/highcharts-more.js"></script>"""
}
private val timeagoLangs = Set("ar", "be", "bg", "ca", "da", "de", "el", "en", "en_short", "es", "eu", "fa", "fi", "fr", "gl", "he", "hu", "in_BG", "in_HI", "in_ID", "it", "ja", "ko", "ml", "my", "nb_NO", "nl", "nn_NO", "pl", "pt_BR", "ro", "ru", "sv", "ta", "th", "tr", "uk", "vi", "zh_CN", "zh_TW")
private def timeagoLangUrl(code: String) = s"/assets/vendor/timeago/locales/$code.js"
def timeagoLangUrl(implicit ctx: lila.api.Context): Option[String] = {
Some("/assets/vendor/timeago/dist/timeago.locales.min.js")
// val l = lang(ctx)
// if (timeagoLangs(l.code)) Some(timeagoLangUrl(l.code))
// else if (timeagoLangs(l.language)) Some(timeagoLangUrl(l.language))
// else none
}
val tagmanagerTag = cdnOrLocal(
cdn = "//cdnjs.cloudflare.com/ajax/libs/tagmanager/3.0.0/tagmanager.js",
test = "$.tagsManager",
local = staticUrl("vendor/tagmanager/tagmanager.js")
)
val typeaheadTag = cdnOrLocal(
cdn = "//cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.11.1/typeahead.bundle.min.js",
test = "$.typeahead",
local = staticUrl("javascripts/vendor/typeahead.bundle.min.js")
)
val fingerprintTag = Html {
s"""<script async defer src="${staticUrl("javascripts/vendor/fp2.min.js")}"></script>"""
}
private def cdnOrLocal(cdn: String, test: String, local: String) = Html {
if (isProd)
s"""<script src="$cdn"></script><script>$test || document.write('<script src="$local">\\x3C/script>')</script>"""
else
s"""<script src="$local"></script>"""
}
def embedJs(js: String): Html = Html {
val escaped = js.replace("</script", "<|script")
s"""<script>$escaped</script>"""
}
def embedJs(js: Html): Html = embedJs(js.body)
}