Allow wiki i18n

This commit is contained in:
Thibault Duplessis 2013-04-21 16:38:11 -03:00
parent 94952978a4
commit 9e5622d6f4
5 changed files with 47 additions and 25 deletions

View file

@ -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)
}
}

View file

@ -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
}
}
}

View file

@ -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 {

View file

@ -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))
}

View file

@ -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 {