Sorry to go against the "ONE" criteria but I am going to name two.
1) An extension to assist in content modification testing preferably leveraging the multi-armed bandit theory (
http://en.wikipedia.org/wiki/Multi-armed_bandit). There is also a blog post with some js code that claims to do this (
http://stevehanov.ca/blog/index.php?id=132)
2) An extension to easily loop through a flattened JSON object and place values into a delimited list. Lincoln has its own data object that looks like this:
{"page":
{"wlpdesktop":"Consumer",
"wlppagelabel":"P12400299741316786111396",
"breadcrumb":"Home|Resource Center",
"l1":"LFG"},
"events":[],
"portlets":[ {"id":"portlet_HUB002543",
"type":"content",
"manifestId":"HUB002543",
"contentIds":"HUB_000725"},
{"id":"portlet_HUB006602",
"type":"content",
"manifestId":"HUB006602",
"contentIds":"HUB006601"},
{"id":"portlet_HUB002554",
"type":"content",
"manifestId":"HUB002554",
"contentIds":"HUB002349,HUB002350,HUB002351,HUB002352"},
{"id":"portlet_HUB002907",
"type":"content",
"manifestId":"HUB002907",
"contentIds":"HUB_000731"},
{"id":"portlet_HUB002539",
"type":"content",
"manifestId":"HUB002539",
"contentIds":"HUB_000730,HUB002001,HUB002002,HUB007801,HUB002003,HUB002004,HUB002005"}
]}
When flattened the portlets piece looks something like this.
portlets.array-size=5
portlets0.contentIds="HUB_000725"
portlets0.id="portlet_HUB002543"
portlets0.manifestId="HUB002543"
portlets0.type="content"
portlets1.contentIds="HUB006601"
portlets1.id="portlet_HUB006602"
portlets1.manifestId="HUB006602"
portlets1.type="content"
portlets2.contentIds="HUB002349,HUB002350,HUB002351,HUB002352"
portlets2.id="portlet_HUB002554"
portlets2.manifestId="HUB002554"
portlets2.type="content"
portlets3.contentIds="HUB_000731"
portlets3.id="portlet_HUB002907"
portlets3.manifestId="HUB002907"
portlets3.type="content"
portlets4.contentIds="HUB_000730,HUB002001,HU...003,HUB002004,HUB002005"
portlets4.id="portlet_HUB002539"
portlets4.manifestId="HUB002539"
portlets4.type="content"
Our developers can move portlets around on the page very easily and a page could have any number of portlets. Currently we use the a javascript plugin that looks like this
var contentIds=[];
for(var i=0; i<=b["portlets.array-size"]; i++) {
var count="";
if(contentIds){
try{count = b["portlets"+i+".contentIds"];}catch(e){}
}
if(typeof count!="undefined" && count != ""){
contentIds.push(count);
}
}
b["portlets.contentIds"]=contentIds.join(",");
This effectively grabs all the portlet contentIds and joins them in a list delimited by comma so I can pass them into an Omniture list prop.