So, how would I test this function in specs? I would need to create a mock object of S, right?
Thanks, Bradford On Mar 29, 8:02 pm, bradford <fingerm...@gmail.com> wrote: > This can probably be improved (and I've done little testing on it), > but I've come up with something to satisfy my description above: > > def group(template: NodeSeq): NodeSeq = { > val default = S.attr("default").openOr("") > val active_attrs = S.prefixedAttrsToMetaData("active") > > val names = template \\ "bind" filter(_.prefix == "menu") > flatMap(_.attributes.get("name")) > > def bind(xml: NodeSeq, currentPage: String): NodeSeq = { > xml.flatMap { > node => node match { > case s : Elem if (node.prefix == "menu" && > node.label == "bind") => { > node.attributes.get("name") match { > case None => bind(node.child, > currentPage) > case Some(ns) => { > SiteMap.findLoc(ns.text) match > { > case Full(location) => > val link: Elem = <a > href={location.createDefaultLink}>{location.linkText.openOr("")}</a> // > location.createDefaultLink.toList.firstOption.getOrElse(<a > />).asInstanceOf[Elem] > > if (ns == currentPage) > link % > anchorAttributes(node.attributes) % active_attrs > else > link % > anchorAttributes(node.attributes) > case _ => bind > (node.child, currentPage) > } > } > } > } > case Group(nodes) => Group(bind(nodes, > currentPage)) > case s : Elem => Elem(node.prefix, node.label, > node.attributes,node.scope, bind(node.child, currentPage) : _*) > case n => node > } > } > } > > for (request <- S.request.toList; > loc <- request.location.toList) > yield { > val currentPage: String = if (names.contains(loc.name)) > loc.name else default > println("currentPage" + currentPage) > Group(bind(template, currentPage)) > } > } > > private def anchorAttributes(attributes : MetaData) : MetaData = { > val amap = Map() ++ attributes.flatMap(attr => attr match { > case ua : PrefixedAttribute => > ua.pre match { > case "a" => List(ua.key -> > ua.value.first.toString) > case _ => Nil > } > case _ => Nil > }) > S.mapToAttrs(amap) > } > > On Mar 28, 11:59 am, bradford <fingerm...@gmail.com> wrote: > > > Hi Derek, > > > Cool. I will still use your changes, but for this task I will need > > what I have described above. This will give me the ability to set > > attributes to the "selected" item or default to a selected item if > > there is no match. For example, let's say I have archives, music, and > > movies. If I am on music, I want to set a selected class or style on > > it. But if I embed movies into home, there will be no matches so I > > want it to default to movies. > > > Thanks for your help and work, > > Bradford > > > On Mar 28, 11:53 am, Derek Chen-Becker <dchenbec...@gmail.com> wrote: > > > > Argh, stupid mistake on not capturing attrs. I'm pushing a fix up to git > > > in > > > about 10 minutes. With this fix, is there still a reason that you need to > > > build your own MyMenu.group snippet? > > > > Derek > > > > On Fri, Mar 27, 2009 at 7:02 PM, bradford <fingerm...@gmail.com> wrote: > > > > > Derek, I saw the changes and noticed that it doesn't capture the a > > > > attributes anymore. I just wanted to point it out, because I wasn't > > > > sure if that was intended or not. > > > > > Ok, I finally came up with a design for what I'm looking for: > > > > > <lift:MyMenu.group active:class="selected" default="home"> > > > > <li><menu:bind name="home" a:id="home" /></li> > > > > <li><menu:bind name="archives" a:id="archives" /></li> > > > > <li><menu:bind name="music" a:id="music" a:style="margin-left: > > > > 10px;" /></li> > > > > </lift:MyMenu.group> > > > > > I originally was going to try <menu:home /> and <menu:archives /> > > > > instead since I could probably just call bind straight up on them, but > > > > I couldn't figure out how to extract these sub-elements since they are > > > > prefixed. > > > > > Regards, > > > > Bradford > > > > > On Mar 27, 1:57 am, Derek Chen-Becker <dchenbec...@gmail.com> wrote: > > > > > It's in trunk now. Add the "donthide" attribute to your Menu.item tags > > > > and > > > > > you'll get the same text as you would normally, just not in link form. > > > > > > Derek > > > > > > On Wed, Mar 25, 2009 at 4:31 PM, bradford <fingerm...@gmail.com> > > > > > wrote: > > > > > > > Derek, that'll work :) > > > > > > > Thanks, > > > > > > Bradford > > > > > > > On Mar 25, 6:13 pm, Derek Chen-Becker <dchenbec...@gmail.com> wrote: > > > > > > > That seems reasonable to me. That's actually what the Menu.builder > > > > does, > > > > > > > essentially. I don't think we want to modify the default behavior, > > > > but I > > > > > > > could make it a "donthide" attribute instead of "always" to do > > > > > > > what > > > > > > you're > > > > > > > saying. Bradford, would that work for you? > > > > > > > > Derek > > > > > > > > On Wed, Mar 25, 2009 at 3:54 PM, Charles F. Munat <c...@munat.com> > > > > > > wrote: > > > > > > > > > Actually, my feeling on item is that if you're on that page, > > > > > > > > item > > > > > > should > > > > > > > > return placeholder text (i.e. the same text without the link). > > > > > > > > For > > > > me, > > > > > > > > at least, that's the most common scenario. > > > > > > > > > Chas. > > > > > > > > > bradford wrote: > > > > > > > > > David, you're right that needing to surround the element text > > > > > > > > > of > > > > a > > > > > > > > > with span is a unique case and should be a custom snippet. > > > > > > > > > I've > > > > > > > > > removed the span now and think that Derek's addition of > > > > > > > > > "always" > > > > > > would > > > > > > > > > be just what I need. Adding group="foo" to Menu.builder would > > > > > > suffice > > > > > > > > > as well. > > > > > > > > > > Thanks for the tips, Chas. > > > > > > > > > > Derek, if you do add "always" can you please let me know so > > > > > > > > > that > > > > I > > > > > > can > > > > > > > > > update my code. > > > > > > > > > > Thanks, > > > > > > > > > Bradford > > > > > > > > > > On Mar 24, 10:37 pm, Derek Chen-Becker <dchenbec...@gmail.com> > > > > > > wrote: > > > > > > > > >> The general case is that a page won't link to itself, I > > > > > > > > >> think, > > > > which > > > > > > is > > > > > > > > why > > > > > > > > >> the default isn't to show it when the page matches. Unless > > > > anyone > > > > > > has > > > > > > > > >> objections I can add an "always" attribute. As for #1, the > > > > Menu.item > > > > > > > > makes a > > > > > > > > >> link using whatever the contents of the Menu.item tag are for > > > > the > > > > > > link > > > > > > > > text: > > > > > > > > > >> <lift:Menu.item name="foo"><span>Go > > > > > > > > >> here</span></lift:Menu.item> > > > > > > > > > >> should become > > > > > > > > > >> <a href={foo location}><span>Go here</span></a> > > > > > > > > > >> Am I misunderstanding what you're looking for there? As for > > > > > > > > >> #2, > > > > you > > > > > > > > should > > > > > > > > >> be able to add a class using the prefixed attribute: > > > > > > > > > >> <lift:Menu.builder li_item:class="bar" /> > > > > > > > > > >> In this context, li_item is the menu item that matches the > > > > current > > > > > > page. > > > > > > > > >> With Menu.group, you can specify the binding template: > > > > > > > > > >> <ul> > > > > > > > > >> <lift:Menu.group group="help"> > > > > > > > > >> <li class="bar"><menu:bind /></li> > > > > > > > > >> </lift:Menu.group> > > > > > > > > >> </ul> > > > > > > > > > >> But there's no provision to do anything special for the > > > > > > > > >> current > > > > > > page. > > > > > > > > > >> Let me know if that's not sufficient or if I'm > > > > > > > > >> misunderstanding > > > > your > > > > > > > > >> requirement. > > > > > > > > > >> Derek > > > > > > > > > >> On Tue, Mar 24, 2009 at 3:50 PM, bradford > > > > > > > > >> <fingerm...@gmail.com > > > > > > > wrote: > > > > > > > > > >>> Thanks for the clarification, David, and for your snippet, > > > > Derek. > > > > > > > > >>> I think adding an "always" attribute to Menu.item would be > > > > > > > > >>> very > > > > > > > > >>> beneficial. I still don't understand why that's not its > > > > default > > > > > > > > >>> behavior. > > > > > > > > >>> It looks like I will not be able to use any of lift's Menu > > > > > > > > >>> tags > > > > at > > > > > > > > >>> this time, because 1) I need to surround the item text with > > > > span > > > > > > and > > > > > > > > >>> 2) I need a way to add class="active" to the li_item. Both > > > > > > > > >>> are > > > > not > > > > > > > > >>> possible with Menu.item, Menu.group, or Menu.builder. Let > > > > > > > > >>> me > > > > know > > > > > > if > > > > > > > > >>> I am mistaken. If I am not not, may I put in a feature > > > > > > > > >>> request > > > > for > > > > > > > > >>> these items. For the time being I will just hard code it as > > > > > > follows > > > > > > > > >>> (which is not a big deal to me at this time): > > > > > > > > >>> <ul class="menu"> > > > > > > > > >>> <li><a href="/foo1" class="active"><span>Foo1</span></foo> > > > > > > > > >>> <li><a href="/foo2"><span>Foo2</span></foo> > > > > > > > > >>> <li><a href="/foo3"><span>Foo3</span></foo> > > > > > > > > >>> </ul> > > > > > > > > >>> Thanks again for the great support :) > > > > > > > > >>> Bradford > > > > > > > > >>> On Mar 24, 12:08 pm, David Pollak < > > > > feeder.of.the.be...@gmail.com> > > > > > > > > >>> wrote: > > > > > > > > >>>> On Tue, Mar 24, 2009 at 9:02 AM, Charles F. Munat < > > > > c...@munat.com > > > > > > > > > >>> wrote: > > > > > > > > >>>>> David Pollak wrote: > > > > > > > > >>>>>> What's the best practice: > > ... > > read more » --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~----------~----~----~----~------~----~------~--~---