Allow wiki i18n
This commit is contained in:
parent
94952978a4
commit
9e5622d6f4
|
@ -12,7 +12,7 @@ object Wiki extends LilaController {
|
|||
}
|
||||
|
||||
def show(slug: String) = Open { implicit ctx ⇒
|
||||
IOptionOk(api show slug) {
|
||||
IOptionOk(api.show(slug, lang(ctx.req).language)) {
|
||||
case (page, pages) ⇒ html.wiki.show(page, pages)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,8 +5,16 @@ import scalaz.effects._
|
|||
|
||||
final class Api(pageRepo: PageRepo) {
|
||||
|
||||
def show(slug: String): IO[Option[(Page, List[Page])]] = for {
|
||||
page ← pageRepo byId slug
|
||||
pages ← pageRepo.all
|
||||
} yield page map { _ -> pages }
|
||||
def show(slug: String, lang: String): IO[Option[(Page, List[Page])]] = for {
|
||||
page ← pageRepo.bySlugLang(slug, lang)
|
||||
pages ← pageRepo.forLang(lang)
|
||||
menu = makeMenu(pages)
|
||||
} yield page map { _ -> menu }
|
||||
|
||||
private def makeMenu(pages: List[Page]): List[Page] = {
|
||||
val (defaultPages, langPages) = pages partition (_.lang == "en")
|
||||
defaultPages map { dPage ⇒
|
||||
langPages find (_.number == dPage.number) getOrElse dPage
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,8 @@ final class Fetch(
|
|||
|
||||
private def filePage(file: File): Option[Page] = {
|
||||
val name = """^(.+)\.md$""".r.replaceAllIn(file.getName, _ group 1)
|
||||
(name != "Home") option Page(name, toHtml(fileContent(file)))
|
||||
if (name == "Home") None
|
||||
else Page(name, toHtml(fileContent(file)))
|
||||
}
|
||||
|
||||
private def getFiles: IO[List[File]] = io {
|
||||
|
|
|
@ -9,28 +9,35 @@ import java.text.Normalizer
|
|||
import java.util.regex.Matcher.quoteReplacement
|
||||
|
||||
case class Page(
|
||||
@Key("_id") id: String,
|
||||
name: String,
|
||||
title: String,
|
||||
body: String) {
|
||||
|
||||
def slug = id
|
||||
}
|
||||
@Key("_id") id: String,
|
||||
slug: String,
|
||||
number: Int,
|
||||
lang: String,
|
||||
title: String,
|
||||
body: String)
|
||||
|
||||
object Page {
|
||||
|
||||
def apply(name: String, body: String): Page = new Page(
|
||||
id = dropNumber(slugify(name)),
|
||||
name = name,
|
||||
title = dropNumber(name.replace("-", " ")),
|
||||
body = body)
|
||||
val NameRegex = """^(\w{2,3})_(\d+)_(.+)$""".r
|
||||
|
||||
// name = en_1_Some Title
|
||||
def apply(name: String, body: String): Option[Page] = name match {
|
||||
case NameRegex(lang, numberStr, title) ⇒
|
||||
parseIntOption(numberStr) map { number ⇒
|
||||
Page(
|
||||
id = name,
|
||||
number = number,
|
||||
slug = slugify(title),
|
||||
lang = lang,
|
||||
title = title.replace("-", " "),
|
||||
body = body)
|
||||
}
|
||||
case _ ⇒ none
|
||||
}
|
||||
|
||||
private def slugify(input: String) = {
|
||||
val nowhitespace = input.replace(" ", "_")
|
||||
val normalized = Normalizer.normalize(nowhitespace, Normalizer.Form.NFD)
|
||||
"""[^\w-]""".r.replaceAllIn(normalized, "")
|
||||
}
|
||||
|
||||
private def dropNumber(input: String) =
|
||||
"""^\d+_(.+)$""".r.replaceAllIn(input, m => quoteReplacement(m group 1))
|
||||
}
|
||||
|
|
|
@ -10,12 +10,18 @@ import scalaz.effects._
|
|||
final class PageRepo(
|
||||
collection: MongoCollection) extends SalatDAO[Page, String](collection) {
|
||||
|
||||
def byId(id: String): IO[Option[Page]] = io {
|
||||
findOneById(id)
|
||||
private val defaultLang = "en"
|
||||
|
||||
def bySlugLang(slug: String, lang: String): IO[Option[Page]] = io {
|
||||
findOne(DBObject("slug" -> slug, "lang" -> lang)) orElse
|
||||
findOne(DBObject("slug" -> slug, "lang" -> defaultLang))
|
||||
}
|
||||
|
||||
val all: IO[List[Page]] = io {
|
||||
find(DBObject()).sort(DBObject("name" -> 1)).toList
|
||||
def forLang(lang: String): IO[List[Page]] = io {
|
||||
find(DBObject("$or" -> DBList(
|
||||
"lang" -> lang,
|
||||
"lang" -> defaultLang
|
||||
))).sort(DBObject("number" -> 1)).toList
|
||||
}
|
||||
|
||||
def saveIO(page: Page): IO[Unit] = io {
|
||||
|
|
Loading…
Reference in a new issue