<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: userscript code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 27 Jul 2008 04:56:06 GMT</pubDate>
    <description>DZone Snippets: userscript code</description>
    <item>
      <title>DOM Mouse-Over Element Selection and Isolation</title>
      <link>http://snippets.dzone.com/posts/show/4513</link>
      <description>DOM ISO.v.0.3.0.7.bookmarklet.js&lt;br /&gt;bookmarklet for selecting and isolating an element on a page.&lt;br /&gt;&lt;br /&gt;two sections:&lt;br /&gt;section 1:  Mouseover DOM, setup and handle mouse events and show information about element in informational div.  Click to select, Any key to cancel.&lt;br /&gt;section 2:  Element Isolation with help of XPath.  prompt user for XPath expression  e.g., //DIV[@id='post-body'].  then use XPath to select all elements not(ancestor or descendant or self), then delete those elements.  also ignore self-or-descendants of head and title.&lt;br /&gt;&lt;br /&gt;tools:&lt;br /&gt;Ruderman's javascript development environment:  https://www.squarefree.com/bookmarklets/webdevel.html#jsenv&lt;br /&gt;Mielczarek's js to bookmarklet generator:  http://ted.mielczarek.org/code/mozilla/bookmarklet.html&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;(function() {&lt;br /&gt;	//GLOBALS&lt;br /&gt;		//globals for classMausWork&lt;br /&gt;		var gSelectedElement;	//currently only one selection&lt;br /&gt;		var gHoverElement;		//whatever element the mouse is over&lt;br /&gt;		var gHovering=false;	//mouse is over something&lt;br /&gt;		var gObjArrMW=[];	//global array of classMausWork objects.  for removing event listeners when done selecting.&lt;br /&gt;		&lt;br /&gt;		//extended	&lt;br /&gt;		var infoDiv;		//currently just container for InfoDivHover, might add more here&lt;br /&gt;		var infoDivHover;	//container for hoverText text node.&lt;br /&gt;		var hoverText;		//show information about current element that the mouse is over&lt;br /&gt;		//const EXPERIMENTAL_NEW_CODE=true;	//debugging. new features.&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	//START&lt;br /&gt;	SetupDOMSelection();	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;		&lt;br /&gt;	//(Section 1) Element Selection&lt;br /&gt;	function SetupDOMSelection()&lt;br /&gt;	{&lt;br /&gt;&lt;br /&gt;		{&lt;br /&gt;			//setup event listeners&lt;br /&gt;			//var pathx="//div | //span | //table | //td | //tr | //ul | //ol | //li | //p";&lt;br /&gt;			var pathx="//div | //span | //table | //th | //td | //tr | //ul | //ol | //li | //p | //iframe";&lt;br /&gt;			var selection=$XPathSelect(pathx);&lt;br /&gt;			for(var element, i=0;element=selection(i);i++)&lt;br /&gt;			{			&lt;br /&gt;				if(element.tagName.match(/^(div|span|table|td|tr|ul|ol|li|p)$/i))	//redundant check.&lt;br /&gt;				{&lt;br /&gt;					var m = new classMausWork(element);&lt;br /&gt;					gObjArrMW.push(m);&lt;br /&gt;					attachMouseEventListeners(m);&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			document.body.addEventListener('mousedown',MiscEvent,false);&lt;br /&gt;			document.body.addEventListener('mouseover',MiscEvent,false);&lt;br /&gt;			document.body.addEventListener('mouseout',MiscEvent,false);&lt;br /&gt;			document.addEventListener('keypress',MiscEvent,false);&lt;br /&gt;		}&lt;br /&gt;		{&lt;br /&gt;			//setup informational div to show which element the mouse is over.&lt;br /&gt;			infoDiv=document.createElement('div');&lt;br /&gt;			var s=infoDiv.style;&lt;br /&gt;			s.position='fixed';&lt;br /&gt;			s.top='0';&lt;br /&gt;			s.right='0';&lt;br /&gt;			&lt;br /&gt;			s.display='block';&lt;br /&gt;			s.width='auto';&lt;br /&gt;			s.padding='0px';&lt;br /&gt;&lt;br /&gt;			document.body.appendChild(infoDiv);&lt;br /&gt;			infoDivHover=document.createElement('div');&lt;br /&gt;&lt;br /&gt;			s=infoDivHover.style;&lt;br /&gt;			s.fontWeight='bold';			&lt;br /&gt;			s.padding='3px';&lt;br /&gt;			s.Opacity='0.8';&lt;br /&gt;			s.borderWidth='thin';&lt;br /&gt;			s.borderStyle='solid';&lt;br /&gt;			s.borderColor='white';&lt;br /&gt;			s.backgroundColor='black';&lt;br /&gt;			s.color='white';&lt;br /&gt;			&lt;br /&gt;			infoDiv.appendChild(infoDivHover);			&lt;br /&gt;			hoverText=document.createTextNode('selecting');&lt;br /&gt;			infoDivHover.appendChild(hoverText);&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	function CleanupDOMSelection()&lt;br /&gt;	{&lt;br /&gt;		for(var m; m=gObjArrMW.pop(); )&lt;br /&gt;		{&lt;br /&gt;			detachMouseEventListeners(m);&lt;br /&gt;		}&lt;br /&gt;		ElementRemove(infoDiv);&lt;br /&gt;		document.body.removeEventListener('mousedown',MiscEvent,false);&lt;br /&gt;		document.body.removeEventListener('mouseover',MiscEvent,false);&lt;br /&gt;		document.body.removeEventListener('mouseout',MiscEvent,false);		&lt;br /&gt;		document.removeEventListener('keypress',MiscEvent,false);&lt;br /&gt;	}	&lt;br /&gt;&lt;br /&gt;	function attachMouseEventListeners(c)&lt;br /&gt;	{&lt;br /&gt;		//c is object of class classMausWork&lt;br /&gt;		c.element.addEventListener("mouseover",c.mouse_over,false);				&lt;br /&gt;		c.element.addEventListener("mouseout",c.mouse_out,false);	&lt;br /&gt;		c.element.addEventListener("mousedown",c.mouse_click,false);		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	function detachMouseEventListeners(c)&lt;br /&gt;	{&lt;br /&gt;		//c is object of class classMausWork&lt;br /&gt;		c.resetElementStyle();&lt;br /&gt;		c.element.removeEventListener("mouseover",c.mouse_over,false);				&lt;br /&gt;		c.element.removeEventListener("mouseout",c.mouse_out,false);	&lt;br /&gt;		c.element.removeEventListener("mousedown",c.mouse_click,false);		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	//mouse event  handling class for element, el.&lt;br /&gt;	function classMausWork(element)&lt;br /&gt;	{	&lt;br /&gt;		//store information about the element this object is assigned to handle. element,  original style, etc.	&lt;br /&gt;		this.element=element;&lt;br /&gt;		&lt;br /&gt;		var elementStyle=element.getAttribute('style');&lt;br /&gt;		var target;&lt;br /&gt;		&lt;br /&gt;		this.mouse_over=function(ev)&lt;br /&gt;		{	&lt;br /&gt;			if(gHovering)return;&lt;br /&gt;			var e=element;			&lt;br /&gt;			var s=e.style;&lt;br /&gt;			s.backgroundColor='yellow';&lt;br /&gt;			s.borderWidth='thin';&lt;br /&gt;			s.borderColor='lime';&lt;br /&gt;			s.borderStyle='solid';					&lt;br /&gt;			InfoMSG(ElementInfo(e),'yellow','blue','yellow');&lt;br /&gt;			gHoverElement=e;&lt;br /&gt;			gHovering=true;&lt;br /&gt;			target=ev.target;&lt;br /&gt;			ev.stopPropagation();		&lt;br /&gt;		};&lt;br /&gt;		&lt;br /&gt;		this.mouse_out=function(ev)&lt;br /&gt;		{&lt;br /&gt;			if(!gHovering)return;&lt;br /&gt;			if(gHoverElement!=element ||ev.target!=target)return;&lt;br /&gt;			var e=element;&lt;br /&gt;			e.setAttribute('style',elementStyle);&lt;br /&gt;			InfoMSG('-','white','black','white');	&lt;br /&gt;			gHoverElement=null;&lt;br /&gt;			gHovering=false;&lt;br /&gt;			target=null;&lt;br /&gt;			//ev.stopPropagation();&lt;br /&gt;		};&lt;br /&gt;		&lt;br /&gt;		this.mouse_click=function(ev)&lt;br /&gt;		{&lt;br /&gt;			if(!gHovering)return;&lt;br /&gt;			if(gHoverElement!=element ||ev.target!=target)return;&lt;br /&gt;			var e=element;&lt;br /&gt;			e.setAttribute('style',elementStyle);&lt;br /&gt;			ev.stopPropagation();			&lt;br /&gt;			CleanupDOMSelection();			&lt;br /&gt;			gHoverElement=null;&lt;br /&gt;			gHovering=false;&lt;br /&gt;			target=null;&lt;br /&gt;			&lt;br /&gt;			if(ev.button==0)&lt;br /&gt;			{&lt;br /&gt;				gSelectedElement=e;&lt;br /&gt;				ElementSelected(e);	//finished selecting, cleanup then move to next part (section 2), element isolation.&lt;br /&gt;			}&lt;br /&gt;		};&lt;br /&gt;		&lt;br /&gt;		this.resetElementStyle=function()&lt;br /&gt;		{&lt;br /&gt;			element.setAttribute('style',elementStyle);&lt;br /&gt;		};		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	function MiscEvent(ev)		//keypress, and mouseover/mouseout/mousedown event on body.  cancel selecting.&lt;br /&gt;	{&lt;br /&gt;		if(ev.type=='mouseout' &amp;&amp; !gHovering)&lt;br /&gt;		{&lt;br /&gt;			InfoMSG('-','white','black','white');&lt;br /&gt;		}&lt;br /&gt;		else if(ev.type=='mouseover' &amp;&amp; !gHovering)&lt;br /&gt;		{&lt;br /&gt;			InfoMSG('cancel','yellow','red','yellow');&lt;br /&gt;		}&lt;br /&gt;		else //keypress on document or mousedown on body, cancel ops.&lt;br /&gt;		{&lt;br /&gt;			CleanupDOMSelection();&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	function InfoMSG(text,color,bgcolor,border)&lt;br /&gt;	{&lt;br /&gt;		&lt;br /&gt;		var s=infoDivHover.style;&lt;br /&gt;		if(color)s.color=color;&lt;br /&gt;		if(bgcolor)s.backgroundColor=bgcolor;&lt;br /&gt;		if(border)s.borderColor=border;&lt;br /&gt;		if(text)hoverText.data=text;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	//(Section 2) Element Isolation&lt;br /&gt;	function ElementSelected(element)	//finished selecting element.  setup string to prompt user.&lt;br /&gt;	{&lt;br /&gt;		PromptUserXpath(ElementInfo(element));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	function PromptUserXpath(defaultpath)		//prompt user, isolate element.&lt;br /&gt;	{&lt;br /&gt;		var userpath = prompt("XPath of elements to isolate : ", defaultpath);&lt;br /&gt;		if(userpath &amp;&amp; userpath.length&gt;0)&lt;br /&gt;		{&lt;br /&gt;			var addPredicate = "[count(./ancestor-or-self::head)=0][count(./ancestor-or-self::title)=0]";	//exclude head &amp; title elements from selection so they aren't removed&lt;br /&gt;			var addPath = "//script | //form | //object | //embed";	//include these elements in selection for removal&lt;br /&gt;			var pathx=TransformXPath_NoAncestorDescendentSelf(userpath, addPredicate, addPath);		//the xpath selection of all elements to be removed/deleted.&lt;br /&gt;			&lt;br /&gt;			try&lt;br /&gt;			{&lt;br /&gt;				var element;&lt;br /&gt;				var elements=$XPathSelect(pathx);	&lt;br /&gt;				for(var i=0;element=elements(i);i++)&lt;br /&gt;				{			&lt;br /&gt;&lt;br /&gt;					if(!element.nodeName.match(/^(head|title)$/i))	//redundant check.&lt;br /&gt;					{&lt;br /&gt;						ElementRemove(element);&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			&lt;br /&gt;			catch(err)&lt;br /&gt;			{&lt;br /&gt;				alert("wtf: "+err);&lt;br /&gt;			}&lt;br /&gt;			&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;		&lt;br /&gt;	&lt;br /&gt;	//support&lt;br /&gt;	function $XPathSelect(p, context) &lt;br /&gt;	{&lt;br /&gt;	  if (!context) context = document;&lt;br /&gt;	  var i, arr = [], xpr = document.evaluate(p, context, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);&lt;br /&gt;	  return function(x) { return xpr.snapshotItem(x); };	//closure.  wooot!  returns function-type array of elements (usually elements, or something else depending on the xpath expression).&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	function ElementRemove(e)&lt;br /&gt;	{&lt;br /&gt;		if(e)e.parentNode.removeChild(e);&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	function ElementInfo(element)&lt;br /&gt;	{&lt;br /&gt;		var txt='';&lt;br /&gt;		if(element)&lt;br /&gt;		{&lt;br /&gt;			txt=element.tagName.toLowerCase();		//txt=element.tagName;&lt;br /&gt;			txt=attrib(txt,element,'id');&lt;br /&gt;			txt=attrib(txt,element,'class');	&lt;br /&gt;			txt='//'+txt;&lt;br /&gt;		}&lt;br /&gt;		return txt;&lt;br /&gt;		&lt;br /&gt;		function attrib(t,e,a)&lt;br /&gt;		{			&lt;br /&gt;			if(e.hasAttribute(a))&lt;br /&gt;			{&lt;br /&gt;				t+="[@"+a+"='"+e.getAttribute(a)+"']";&lt;br /&gt;			}&lt;br /&gt;			return t;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;	//function to 'invert' the XPath by selecting all elements that are not ancestor and not descendent and not self.&lt;br /&gt;	function TransformXPath_NoAncestorDescendentSelf(u, includePredicates, includePaths)&lt;br /&gt;	{	&lt;br /&gt;		&lt;br /&gt;		//sample input (u):					//div[@class='sortbox']&lt;br /&gt;		//sample output						//*[  not(./descendant-or-self::*=//div[@class='sortbox'])][  not(./ancestor-or-self::*=//div[@class='sortbox'])]&lt;br /&gt;		//sample output with additional conditions:		//*[  not(./descendant-or-self::*=//div[@class='sortbox'])][  not(./ancestor-or-self::*=//div[@class='sortbox'])][count(./ancestor-or-self::head)=0][count(./ancestor-or-self::title)=0]&lt;br /&gt;		&lt;br /&gt;			//obsolete method.  much faster but can only be used for limited types of (simple) xpath expressions -- unlike the current version, which should be able to convert any xpath.&lt;br /&gt;			//input:			table[@id='topbar']&lt;br /&gt;			//output:			//*[not(./descendant-or-self::table[@id='topbar']) and not(./ancestor-or-self::table[@id='topbar'])]&lt;br /&gt;			//output (alternative):	//*[count(./descendant-or-self::table[@id='topbar'])=0 and count(./ancestor-or-self::table[@id='topbar'])=0]&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		var o1=	'./descendant-or-self::*='+gr(u);&lt;br /&gt;		o1=	'not' + gr(o1);&lt;br /&gt;		o1=	nt(o1);	&lt;br /&gt;		var o2= './ancestor-or-self::*='+gr(u);&lt;br /&gt;		o2=	'not' + gr(o2);&lt;br /&gt;		o2=	nt(o2);&lt;br /&gt;&lt;br /&gt;		var o=	'//*'+o1+o2;&lt;br /&gt;		if(includePredicates &amp;&amp; includePredicates.length&gt;0)	o += includePredicates;&lt;br /&gt;		if(includePaths &amp;&amp; includePaths.length&gt;0) o += ' | ' + includePaths;&lt;br /&gt;		return o;&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		function nt(term){return wrap(term,'[]');}	//node test; predicate - enclose with bracket.&lt;br /&gt;		function gr(term){return wrap(term,'()');}	//group - parenthesize.&lt;br /&gt;		function wrap(term, enclosure){return enclosure.charAt(0)+term+enclosure.charAt(1);}&lt;br /&gt;	}	&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;})();&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 09 Sep 2007 01:25:47 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4513</guid>
      <author>jczerg68 (Jon C)</author>
    </item>
    <item>
      <title>BlockFlash-Revisited.user.js</title>
      <link>http://snippets.dzone.com/posts/show/3054</link>
      <description>&lt;code&gt;&lt;br /&gt;// ==UserScript==&lt;br /&gt;// @name		BlockFlash-Revisited&lt;br /&gt;// @namespace		http://snippets.dzone.com/posts/show/3054&lt;br /&gt;// @description	Do not start Flash animation until you click on them.&lt;br /&gt;// @include		*&lt;br /&gt;// @exclude		http://www.macromedia.com/*&lt;br /&gt;// @exclude		http://www.atomfilms.com/*&lt;br /&gt;// @exclude		http://uploads.ungrounded.net/*&lt;br /&gt;// @exclude		http://www.albinoblacksheep.com/*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;	Revised by Andrew Pennebaker (andrew.pennebaker@gmail.com)&lt;br /&gt;&lt;br /&gt;	Author: Jos van den Oever (jos@vandenoever.info)&lt;br /&gt;&lt;br /&gt;	License: GPL&lt;br /&gt;&lt;br /&gt;	Version history:&lt;br /&gt;		2006-02-12: initial version&lt;br /&gt;		2006-11-28: changed appearance&lt;br /&gt;&lt;br /&gt;Inspiration for this script comes from the removeFlash script and the FlashBlock firefox extension.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;(function () {&lt;br /&gt;	var objects=document.getElementsByTagName("object");&lt;br /&gt;&lt;br /&gt;	for (i=0; i&lt;objects.length; i++) {&lt;br /&gt;		var flash=objects[i];&lt;br /&gt;&lt;br /&gt;		if (flash.innerHTML.match(/.swf|shockwave|flash/)) {&lt;br /&gt;			var placeholder=document.createElement("div");&lt;br /&gt;&lt;br /&gt;			placeholder.style.cursor='pointer';&lt;br /&gt;			placeholder.style.background='orange'; // 'gray '&lt;br /&gt;			placeholder.style.textAlign='center';&lt;br /&gt;			placeholder.style.color='black';&lt;br /&gt;			placeholder.innerHTML="[Play Flash]";&lt;br /&gt;&lt;br /&gt;			flash.parentNode.insertBefore(placeholder, flash);&lt;br /&gt;			flash.on=false;&lt;br /&gt;&lt;br /&gt;			placeholder.addEventListener(&lt;br /&gt;				'click',&lt;br /&gt;				function() {&lt;br /&gt;					if (flash.on) {&lt;br /&gt;						flash.style.display='none';&lt;br /&gt;						placeholder.innerHTML="[Play Flash]";&lt;br /&gt;						flash.on=false;&lt;br /&gt;					}&lt;br /&gt;					else {&lt;br /&gt;						flash.style.display='';&lt;br /&gt;						placeholder.innerHTML="[Stop Flash]";&lt;br /&gt;						flash.on=true;&lt;br /&gt;					}&lt;br /&gt;				},&lt;br /&gt;				true&lt;br /&gt;			);&lt;br /&gt;&lt;br /&gt;			flash.style.display='none';&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;})();&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 29 Nov 2006 01:03:18 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3054</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>Anidar comentarios en Meneame.net  1&#170; referencia(UserScript)</title>
      <link>http://snippets.dzone.com/posts/show/2520</link>
      <description>Anida los comentarios usando el n&#250;mero de comentario (#XX) que los usuarios de Meneame utilizan para referirse a otros comentarios, pero &#250;nicamente tiene en cuenta la 1&#170; referencia.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// ==UserScript==&lt;br /&gt;// @name          Meneame.net: anidar comentarios (1 ref)&lt;br /&gt;// @description   Anida comentarios en meneame.net&lt;br /&gt;// @include       http://meneame.net/story/*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;(function() {&lt;br /&gt;var cl = document.getElementById("comments-list"); //cl = lista de comentarios&lt;br /&gt;var l = null; //l = cada elemento hijo de cl&lt;br /&gt;for(var i in cl.childNodes)&lt;br /&gt;{&lt;br /&gt; l = cl.childNodes.item(i);&lt;br /&gt; if(l &amp;&amp; (l.tagName) &amp;&amp; (l.tagName.toUpperCase() == "LI")) //ignora lo que no sean elementos LI&lt;br /&gt; {&lt;br /&gt;  var d = l.firstChild; //d = el div que contiene cada el texto del comentario&lt;br /&gt;  var nc = parseInt(d.id.slice(8)); //nc = numero de comentario&lt;br /&gt;  var r = d.firstChild.nextSibling.nextSibling.innerHTML.match(/#[0-9]+/g); //r = lista de comentarios referenciados&lt;br /&gt;  var nr = 0; //nr = numero del comentario referenciado&lt;br /&gt;  var anidado = false;&lt;br /&gt;  for(var j in r) // j = cada referencia&lt;br /&gt;  {&lt;br /&gt;   nr = parseInt(r[j].slice(1));&lt;br /&gt;   if((anidado = (nr &gt; 0) &amp;&amp; (nc &gt; nr))) //si el numero del comentario es mayor que el referenciado...&lt;br /&gt;   {&lt;br /&gt;    var lr = document.getElementById("comment-" + nr).parentNode; //lr = el elemento LI referenciado&lt;br /&gt;    if(lr.lastChild.name != "anidados")&lt;br /&gt;    {&lt;br /&gt;     var a = document.createElement("ul");&lt;br /&gt;     a.name = "anidados";&lt;br /&gt;     a.style.borderLeft = "1px dotted #aaaaaa";&lt;br /&gt;     lr.appendChild(a);&lt;br /&gt;    }&lt;br /&gt;    lr.lastChild.appendChild(l.cloneNode(true));&lt;br /&gt;    try{cl.removeChild(l);} catch(e){}&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;})();&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 02 Sep 2006 20:54:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2520</guid>
      <author>jnsntndr (jnsntndr)</author>
    </item>
    <item>
      <title>Enlaces entre comentarios en Meneame.net (userscript)</title>
      <link>http://snippets.dzone.com/posts/show/2519</link>
      <description>Funciona como el script de anidar pero enlazando a los comentarios&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// ==UserScript==&lt;br /&gt;// @name          Meneame.net: enlazar comentarios&lt;br /&gt;// @description   Enlaza comentarios en meneame.net&lt;br /&gt;// @include       http://meneame.net/story/*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;(function() {&lt;br /&gt;var cl = document.getElementById("comments-list"); //cl = lista de comentarios&lt;br /&gt;var l = null; //l = cada elemento hijo de cl&lt;br /&gt;for(var i in cl.childNodes)&lt;br /&gt;{&lt;br /&gt; l = cl.childNodes.item(i);&lt;br /&gt; if(l &amp;&amp; (l.tagName) &amp;&amp; (l.tagName.toUpperCase() == "LI")) //ignora lo que no sean elementos LI&lt;br /&gt; {&lt;br /&gt;  var d = l.firstChild;&lt;br /&gt;  var nc = parseInt(d.id.slice(8)); //nc = numero de comentario&lt;br /&gt;  var nr = 0; //nr = numero del comentario referenciado&lt;br /&gt;  var o = d.firstChild.nextSibling.nextSibling;&lt;br /&gt;  var t = o.innerHTML;&lt;br /&gt;  var r = t.match(/#[0-9]+/g); //lista de comentarios referenciados&lt;br /&gt;  for(var j in r)&lt;br /&gt;  {&lt;br /&gt;   nr = parseInt(r[j].slice(1));&lt;br /&gt;   if((nr &gt;0) &amp;&amp; (nc &gt; nr))&lt;br /&gt;    t = t.replace(r[j],"&lt;a href='" + document.URL.replace(/#comment.*$/g,"") + "#comment-" + nr + "'&gt;" + r[j] +"&lt;/a&gt;");&lt;br /&gt;    o.innerHTML = t;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;})();&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 02 Sep 2006 18:56:15 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2519</guid>
      <author>jnsntndr (jnsntndr)</author>
    </item>
    <item>
      <title>Anidar comentarios en Meneame.net (UserScript)</title>
      <link>http://snippets.dzone.com/posts/show/2517</link>
      <description>Anida los comentarios usando el n&#250;mero de comentario (#XX) que los usuarios de Meneame utilizan para referirse a otros comentarios&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// ==UserScript==&lt;br /&gt;// @name          Meneame.net: anidar comentarios&lt;br /&gt;// @description   Anida comentarios en meneame.net&lt;br /&gt;// @include       http://meneame.net/story/*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;(function() {&lt;br /&gt;var cl = document.getElementById("comments-list"); //cl = lista de comentarios&lt;br /&gt;var l = null; //l = cada elemento hijo de cl&lt;br /&gt;for(var i in cl.childNodes)&lt;br /&gt;{&lt;br /&gt; l = cl.childNodes.item(i);&lt;br /&gt; if(l &amp;&amp; (l.tagName) &amp;&amp; (l.tagName.toUpperCase() == "LI")) //ignora lo que no sean elementos LI&lt;br /&gt; {&lt;br /&gt;  var d = l.firstChild; //d = el div que contiene cada el texto del comentario&lt;br /&gt;  var nc = parseInt(d.id.slice(8)); //nc = numero de comentario&lt;br /&gt;  var r = d.firstChild.nextSibling.nextSibling.innerHTML.match(/#[0-9]+/g); //r = lista de comentarios referenciados&lt;br /&gt;  var nr = 0; //nr = numero del comentario referenciado&lt;br /&gt;  var anidado = false;&lt;br /&gt;  for(var j in r) // j = cada referencia&lt;br /&gt;  {&lt;br /&gt;   nr = parseInt(r[j].slice(1));&lt;br /&gt;   if((anidado = (nr &gt; 0) &amp;&amp; (nc &gt; nr))) //si el numero del comentario es mayor que el referenciado...&lt;br /&gt;   {&lt;br /&gt;    var lr = document.getElementById("comment-" + nr).parentNode; //lr = el elemento LI referenciado&lt;br /&gt;    if(lr.lastChild.name != "anidados")&lt;br /&gt;    {&lt;br /&gt;     var a = document.createElement("ul");&lt;br /&gt;     a.name = "anidados";&lt;br /&gt;     a.style.borderLeft = "1px dotted #aaaaaa";&lt;br /&gt;     lr.appendChild(a);&lt;br /&gt;    }&lt;br /&gt;    lr.lastChild.appendChild(l.cloneNode(true));&lt;br /&gt;    try{cl.removeChild(l);} catch(e){}&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;})();&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 02 Sep 2006 15:59:25 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2517</guid>
      <author>jnsntndr (jnsntndr)</author>
    </item>
  </channel>
</rss>
