我正在使用Moovweb / Tritium使用Zurb Foundation框架使常规桌面站点响应。
作为其中的一部分,我想创建辅助函数来启用基金会小部件,例如Moovweb中已有的Uranium integrations。但是像top bar这样的一些Foundation组件具有复杂的布局,需要比单个函数调用中看起来合理的更多配置。
例如,启用顶栏需要类似以下结构:
# Use the foundation topbar
insert_top("nav", class: "top-bar") {
# Create the title area
insert("ul", class: "title-area") {
inject("<li class='name'><h1><a href='/'>Website Name</a></h1></li>")
inject("<li class='toggle-topbar menu-icon'><a href='#'><span>Menu</span></a></li>")
}
# Grab the header links and put them in the top bar
insert("section", class: "top-bar-section") {
insert("ul", class: "left") {
# Move the original header links here
move_here("//span[@class='pagetop']//a"){
wrap("li")
}
}
}
}
将这个抽象为可重复使用的氚函数的正确方法是什么,这些函数可以最大限度地减少样板并提供灵活性?
答案 0 :(得分:3)
在我的用例中,我通过将布局分解为相互嵌套的相关函数来处理此问题。所以上面的原始代码变成了:
# enable the foundation top bar
zurb_topbar() {
zurb_topbar_title("Website Name", "Menu", "menu-icon")
zurb_topbar_left() {
move_here("//span[@class='pagetop']//a"){
wrap("li")
}
}
}
其中函数定义为:
@func XMLNode.zurb_topbar() {
insert_top("nav", class: "top-bar") {
yield()
}
}
@func XMLNode.zurb_topbar_title(Text %name, Text %menu_btn_name, Text %menu_icon) {
insert("ul", class: "title-area") {
inject("<li class='name'><h1><a href='/'>" +%name +"</a></h1></li>")
inject("<li class='toggle-topbar "+%menu_icon+"'><a href='#'><span>"+%menu_btn_name+"</span></a></li>")
}
}
@func XMLNode.zurb_topbar_left() {
insert("section", class: "top-bar-section") {
insert("ul", class: "left") {
yield()
}
}
}
您可以想象一个zurb_topbar_right
函数,可以选择用于定义顶部栏的右侧部分。
注意zurb_topbar_title
<LI>
的href和结构是硬编码的,因为你通常不希望将href指向除root之外的任何地方。相反,您要自定义的部分可能是顶部栏的标题,菜单按钮的标题以及菜单栏图标的存在。
zurb_topbar_left
<LI>
zurb_topbar
内容可能由程序员填充,因此产量。
权衡似乎是自动强制以正确的方式使用正确的功能组合变得更加棘手,即
zurb_topbar_title
和zurb_topbar_left
zurb_topbar_right
或zurb_topbar_left