Ya que (s.e.u.o.) "mi Neo" es la única que conozco que se haya traducido al español. voy a dejar aquí el script Neo.js que he "españolizado", por si alguien prefiere tener en su blog los links de Neo en este idioma, en lugar de en inglés:
<script language='javascript'>
// This file is part of the Neo template. As I spent quite some time developing
// this code, please give proper credits to Hackosphere if you are going to
// re-use the code.
// - Ramani@hackosphere
var postTitle = new Array();
var postContent = new Array();
var postId = new Array();
var postDate = new Array();
var postPermalink = new Array();
var commentAuthor = new Array();
var commentContent = new Array();
var commentDate = new Array();
var blogid, blogurl, totalComments;
var monthnames = new Array();
var startIndex = 1;
var oldestFirstOrder = 0;
function dateString(rawdate, needYear) {
monthnames[1] = "Enero";
monthnames[2] = "Febrero";
monthnames[3] = "Marzo";
monthnames[4] = "Abril";
monthnames[5] = "Mayo";
monthnames[6] = "Junio";
monthnames[7] = "Julio";
monthnames[8] = "Agosto";
monthnames[9] = "Septiembre";
monthnames[10] = "Octubre";
monthnames[11] = "Noviembre";
monthnames[12] = "Diciembre";
var year = rawdate.substring(0,4);
var month = rawdate.substring(5,7);
var day = rawdate.substring(8,10);
str = monthnames[parseInt(month,10)] + ' ' + day;
if (needYear) str = str + ', ' + year;
return (str);
}
function updateLabelPosts(json) {
feedid = json.feed.id.$t;
start = feedid.indexOf('blog-');
blogid = feedid.substr(start+5);
for (var k = 0; k < json.feed.link.length; k++) {
if (json.feed.link[k].rel == 'alternate') {
alturl = json.feed.link[k].href;
break;
}
}
index = alturl.lastIndexOf('/');
var label = alturl.substr(index+1);
label = decodeURIComponent(label);
var labelposts = document.getElementById("LabelPosts");
var labeltitle = document.getElementById("LabelTitle");
if (label == "") {
labeltitle.innerHTML = '<h2>Recientes</h2>';
} else {
labeltitle.innerHTML = '<h2>Entradas bajo la etiqueta "' + label + '"</h2>';
labeltitle.innerHTML = labeltitle.innerHTML + '<img style="border: 0pt none;" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png"/>&nbsp;';
labeltitle.innerHTML = labeltitle.innerHTML + '<a href="' + blogurl + 'feeds/posts/default/-/' + label + '">Subscribir</a><hr/>';
}
var disp = '';
for (var i = 0; i < json.feed.entry.length; i++) {
var entry = json.feed.entry[i];
var selfurl;
postTitle[i] = entry.title.$t;
postContent[i] = entry.content.$t;
postDate[i] = entry.published.$t.substring(0,10);
entryid = entry.id.$t;
start = entryid.indexOf('post-');
postId[i] = entryid.substr(start+5);
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == 'alternate') {
postPermalink[i] = entry.link[k].href;
break;
}
}
disp = disp + '<a href="javascript:updatePost(' + i + ');">' + entry.title.$t + '</a><br/><br/>';
}
if (label == "index.html") label = "";
disp = disp + '<p class="navLinks">';
if (startIndex != 1) {
disp = disp + '<a href="javascript:fetchNewerPosts(\'' + label + '\');"><<&nbsp;Newer</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
}
if (json.feed.entry.length == numPosts) {
disp = disp + '<a href="javascript:fetchOlderPosts(\'' + label + '\');">Older&nbsp;>></a>';
}
disp = disp + '</p>';
labelposts.innerHTML = disp;
}
function updatePost(index) {
var datediv = document.getElementById("PostDate");
var titlediv = document.getElementById("PostTitle");
var contentdiv = document.getElementById("PostContent");
var editdiv = document.getElementById("PostEditLink");
var commentdiv = document.getElementById("PostCommentLink");
datediv.innerHTML = dateString(postDate[index], 1);
titlediv.innerHTML = '<a href="' + postPermalink[index] + '">' + postTitle[index] + '</a>';
contentdiv.innerHTML = '<p>' + postContent[index] + '</p><div style="clear: both;"></div>';
if (editdiv)
editdiv.innerHTML = '<a href="http://www2.blogger.com/post-edit.g?blogID=' + blogid + '&postID=' + postId[index] + '"><span class="quick-edit-icon">&#160;</span></a>';
commentdiv.innerHTML = '<a target="_blank" href="http://www2.blogger.com/comment.g?blogID=' + blogid +'&postID=' + postId[index] + '">Click para comentar</a>';
var backlinksdiv = document.getElementById("backlinks-container");
backlinksdiv.innerHTML = '';
//var postdiv = document.getElementById("post");
//postdiv.scrollIntoView(true);
checkFullNeo();
fetchComments(postId[index]);
}
function updateComments(json) {
if (json.feed.entry) {
for (var i = 0; i < json.feed.entry.length; i++) {
var entry = json.feed.entry[i];
commentAuthor[i] = entry.author[0].name.$t;
commentContent[i] = entry.content.$t;
commentDate[i] = entry.published.$t.substring(0,10);
}
totalComments = json.feed.entry.length;
} else totalComments = 0;
updateCommentsPage(0);
}
function showNextPage(page) {
updateCommentsPage(page);
var commentdiv = document.getElementById('comments');
commentdiv.scrollIntoView(true);
}
function updateCommentsPage(page) {
var commentdiv = document.getElementById('comments');
if (totalComments == 0) {
commentdiv.innerHTML = "<center><h2>Sin comentarios aún</h2></center>";
return;
}
disp = "<center><h2>" + totalComments + " ";
var numpages = (totalComments / 10);
if (numpages > 1) {
disp = disp + ",&nbsp;Pages:&nbsp;"
for (i = 0; i < numpages; i++) {
if (i == page)
disp = disp + (i+1) + "&nbsp;&nbsp;";
else
disp = disp + '<a href="javascript:updateCommentsPage(' + i + ');">' + (i+1) + '</a>&nbsp;&nbsp;';
}
}
disp = disp + "</h2></center><dl class='comments-block' id='comments-block'>";
if (oldestFirstOrder == 1) {
max = totalComments - 1 - (page * 10);
min = totalComments - 1 - ((page+1) * 10);
if (min < 0)
min = 0;
for (var i = max; i >= min; i--)
{
disp = disp + "<dt class='comment-author'>" + "En " + dateString(commentDate[i], 0) + ", " + commentAuthor[i] + " dijo...</dt>";
if (commentAuthor[i] == blogAuthor) {
disp = disp + "<dd class='comment-body-author'>" + commentContent[i] + "</dd><br/>";
} else {
disp = disp + "<dd class='comment-body'>" + commentContent[i] + "</dd><br/>";
}
}
} else {
max = (page + 1) * 10;
if (max > totalComments)
max = totalComments;
for (var i = page * 10; i < max; i++) {
disp = disp + "<dt class='comment-author'>" + "En " + dateString(commentDate[i], 0) + ", " + commentAuthor[i] + " dijo...</dt>";
if (commentAuthor[i] == blogAuthor) {
disp = disp + "<dd class='comment-body-author'>" + commentContent[i] + "</dd><br/>";
} else {
disp = disp + "<dd class='comment-body'>" + commentContent[i] + "</dd><br/>";
}
}
}
disp = disp + "</dl>";
if (page < (numpages-1)) {
disp = disp + '<center><h3><a href="javascript:showNextPage(' + (page+1) + ');">Next comments page>></a></h3></center><br/>';
}
commentdiv.innerHTML = disp;
}
function fetchOlderPosts(label) {
startIndex = startIndex + numPosts;
fetchPosts(label);
document.getElementById('LabelDisplay').scrollIntoView(true);
}
function fetchNewerPosts(label) {
startIndex = startIndex - numPosts;
fetchPosts(label);
document.getElementById('LabelDisplay').scrollIntoView(true);
}
function fetchLatestPosts(url, label) {
blogurl = url;
startIndex = 1;
fetchPosts(label);
}
function fetchPosts(label) {
var labelposts = document.getElementById("LabelPosts");
var labeltitle = document.getElementById("LabelTitle");
labeltitle.innerHTML = "<h2><img alt='Indicator' src='http://bloggerhacked.googlepages.com/indicator.gif'/>&nbsp;&nbsp;Actualizando...</h2><hr/>";
if (label == '') {
feedurl = blogurl + 'feeds/posts/default?orderby=published&start-index=' + startIndex + '&max-results=' + numPosts + '&alt=json-in-script&callback=updateLabelPosts';
} else {
label = label.replace(" ", "%20");
feedurl = blogurl + 'feeds/posts/default/-/' + label + '?orderby=published&start-index=' + startIndex + '&max-results=' + numPosts + '&alt=json-in-script&callback=updateLabelPosts';
}
var script = document.createElement('script');
script.setAttribute('src', feedurl);
script.setAttribute('id', 'jsonScript');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);
}
function fetchComments(postid) {
var script = document.createElement('script');
script.setAttribute('src', blogurl + 'feeds/' + postid + '/comments/default?max-results=100&alt=json-in-script&callback=updateComments');
script.setAttribute('id', 'jsonScript');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);
}
function showFullNeo() {
var showspan = document.getElementById('showlink');
var hidespan = document.getElementById('hidelink');
var fullspan = document.getElementById('fullpost');
showspan.style.display = 'none';
hidespan.style.display = 'inline';
fullspan.style.display = 'inline';
}
function hideFullNeo() {
var showspan = document.getElementById('showlink');
var hidespan = document.getElementById('hidelink');
var fullspan = document.getElementById('fullpost');
showspan.style.display = 'inline';
hidespan.style.display = 'none';
fullspan.style.display = 'none';
var post = document.getElementById('post');
post.scrollIntoView(true);
}
function checkFullNeo() {
var showspan = document.getElementById('showlink');
var hidespan = document.getElementById('hidelink');
var fullpost = document.getElementById('fullpost');
if (fullpost) {
showspan.style.display = 'inline';
hidespan.style.display = 'none';
} else {
showspan.style.display = 'none';
hidespan.style.display = 'none';
}
}
</script>
<!-- configurable parameter to control the number of posts in the second column of Neo -->
<!-- configurable parameter to control the number of posts in the second column of Neo -->
<script language='javascript'>
var numPosts = 10;
</script>
<script type='text/javascript'>
/*
cbb function by Roger Johansson, http://www.456bereastreet.com/
*/
var cbb = {
init : function() {
// Check that the browser supports the DOM methods used
if (!document.getElementById || !document.createElement || !document.appendChild) return false;
var oElement, oOuter, oI1, oI2, tempId;
// Find all elements with a class name of cbb
var arrElements = document.getElementsByTagName('*');
var oRegExp = new RegExp("(^|\\s)cbb(\\s|$)");
for (var i=0; i<arrElements.length; i++) {
// Save the original outer element for later
oElement = arrElements[i];
if (oRegExp.test(oElement.className)) {
// Create a new element and give it the original element's class name(s) while replacing 'cbb' with 'cb'
oOuter = document.createElement('div');
oOuter.className = oElement.className.replace(oRegExp, '$1cb$2');
// Give the new div the original element's id if it has one
if (oElement.getAttribute("id")) {
tempId = oElement.id;
oElement.removeAttribute('id');
oOuter.setAttribute('id', '');
oOuter.id = tempId;
}
// Change the original element's class name and replace it with the new div
oElement.className = 'i3';
oElement.parentNode.replaceChild(oOuter, oElement);
// Create two new div elements and insert them into the outermost div
oI1 = document.createElement('div');
oI1.className = 'i1';
oOuter.appendChild(oI1);
oI2 = document.createElement('div');
oI2.className = 'i2';
oI1.appendChild(oI2);
// Insert the original element
oI2.appendChild(oElement);
// Insert the top and bottom divs
cbb.insertTop(oOuter);
cbb.insertBottom(oOuter);
}
}
},
insertTop : function(obj) {
var oOuter, oInner;
// Create the two div elements needed for the top of the box
oOuter=document.createElement("div");
oOuter.className="bt"; // The outer div needs a class name
oInner=document.createElement("div");
oOuter.appendChild(oInner);
obj.insertBefore(oOuter,obj.firstChild);
},
insertBottom : function(obj) {
var oOuter, oInner;
// Create the two div elements needed for the bottom of the box
oOuter=document.createElement("div");
oOuter.className="bb"; // The outer div needs a class name
oInner=document.createElement("div");
oOuter.appendChild(oInner);
obj.appendChild(oOuter);
},
// addEvent function from http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
addEvent : function(obj, type, fn) {
if (obj.addEventListener)
obj.addEventListener(type, fn, false);
else if (obj.attachEvent) {
obj["e"+type+fn] = fn;
obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
obj.attachEvent("on"+type, obj[type+fn]);
}
}
};
cbb.addEvent(window, 'load', cbb.init);
</script>
----------------------------
Llevaba una temporada echando un vistazo a todo lo que encontraba sobre esta plantilla de hackosphere y me llamaba poderosamente la atención que no hay prácticamente nada en español: la única "demo" que existe en este idioma... no funciona, al parecer. Al menos yo he recurrido a un blog portugués y a otro chino para poder enterarme de algo. (y no es broma).
Bien: el caso es que he intentado insertarla en un blog antigüo de pruebas que carecía de estilo: un blog en el que inserté mi prueba de ocultar la sidebar , y parece que no ha quedado mal del todo, aunque la he cargado más de la cuenta para insertar cosas como breadcrumbs o últimos comentarios. Me gusta particularmente la sincronicidad de las etiquetas con las entradas recientes: cuando picas en una etiqueta, se recarga y actualiza automáticamente el bloque de entradas recientes (que en la página principal muestra las diez últimas entradas) para mostrar aquéllas que contengan la etiqueta elegida.
Hay cosas que he insertado por mi cuenta, como unas etiquetas de las de siempre, colocadas junto a la entrada... porque no me acostumbro a no verlas "cerca"...
Y hay otras cosas a las que no me acostumbro y/o me gustan menos de la Neo, sobre todo en cuestión de "encorsetamiento" a la hora de "rediseñarla", pero... la plantilla está francamente bien. En mi caso, he optado por no probar el CSS original (fondo negro y sidebares con fondo azul), sino la Rounder, que he, como digo, adaptado a mi manera en este blog, empezando por colocar el cuerpo de entradas a la izquierda y a la derecha ambas sidebares: aquí se puede, sin problemas, colocar las entradas en el centro y las sidebares a los lados o alinear éstas a la izquierda, como en la demo de Rounder... cada quien, a su gusto.
Otra cosa, es que he adaptado el lenguaje de la plantilla y de los scripts al español (eso sí: me he "cargado" el "comments", porque no hay forma de que se adapte al número de comentario, singular o plural y, de hecho, casi todo lo que he visto por ahí ha optado por eliminarlo también y dejar sólo el número de comentarios totales).
Y basta de charla... quien quiera verla y probarla, ahí la tiene; y si a alguien le gusta y quiere los scripts y la plantilla en español, intentaré sacar tiempo para ello...
✍ ¿Quieres hacer algún comentario? ✍