Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 8923c699df
Fetching contributors…

Cannot retrieve contributors at this time

76 lines (65 sloc) 2.961 kb
* Copyright 2007-2011 WorldWide Conferencing, LLC
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* See the License for the specific language governing permissions and
* limitations under the License.
package net.liftweb
package builtin
package snippet
import scala.xml._
import net.liftweb.http._
import net.liftweb.util._
import net.liftweb.common._
import Box._
* This object implements the logic for the <lift:embed> tag. It
* supports retrieving a template based on the "what" attribute, and
* any <lift:bind-at> tags contained in the embed tag will be used
* to replace <lift:bind> tags within the embedded template.
object Embed extends DispatchSnippet {
private lazy val logger = Logger(this.getClass)
def dispatch : DispatchIt = {
case _ => render _
def render(kids: NodeSeq) : NodeSeq =
(for {
ctx <- S.session ?~ ("FIX"+"ME: session is invalid")
what <- S.attr ~ ("what") ?~ ("FIX" + "ME The 'what' attribute not defined. In order to embed a template, the 'what' attribute must be specified")
templateOpt <- ctx.findTemplate(what.text) ?~ ("FIX"+"ME trying to embed a template named '"+what+"', but the template not found. ")
} yield (what, Templates.checkForContentId(templateOpt))) match {
case Full((what,template)) => {
val bindingMap : Map[String,NodeSeq] = Map(kids.flatMap({
case p : scala.xml.PCData => None // Discard whitespace and other non-tag junk
case t : scala.xml.Text => None // Discard whitespace and other non-tag junk
case e : Elem if e.prefix == "lift" && e.label == "bind-at" => {
e.attribute("name") match {
/* DCB: I was getting a type error if I just tried to use e.child
* here. I didn't feel like digging to find out why Seq[Node]
* wouldn't convert to NodeSeq, so I just do it with fromSeq. */
case Some(name) => Some(name.text -> NodeSeq.fromSeq(e.child))
case None => logger.warn("Found <lift:bind-at> tag without name while embedding \"%s\"".format(what.text)); None
case _ => None
}): _*)
BindHelpers.bind(bindingMap, template)
case Failure(msg, _, _) =>
logger.error("'embed' snippet failed with message: "+msg)
throw new SnippetExecutionException("Embed Snippet failed: "+msg)
case _ =>
logger.error("'embed' snippet failed because it was invoked outside session context")
throw new SnippetExecutionException("session is invalid")
Jump to Line
Something went wrong with that request. Please try again.