miércoles, 27 de marzo de 2013

Entradas con estilos variables segun la etiqueta

Para establecer estilos diferenciados en cierto tipo de páginas, en Blogger podemos usar los códigos condicionales ya que todo aquello que se encuentre dentro de esa condición, sólo se ejecutará si esta se cumple. Por ejemplo, si quisiéramos que el color de fondo del blog fuera rojo cuando se muestra una página estática, pondríamos algo así:
<b:if cond='data:blog.pageType != &:quot;static_page&:quot;'>
<style>
body {background-color:red;}
</style>
</b:if>
Pero hay cierto tipo de páginas un poco más complejas de diferenciar ya que no hay condiciones exactas. Por ejemplo, las páginas de etiquetas que son de tipo index al igual que muchos otros tipo de páginas incluyendo el home.

Una alternativa para reconocer este tipo de páginas es usar los selectores condicionales de CSS que nos permiten detectar el contenido de cualquier atributo que tenga una etiqueta y, de ese modo, definir reglas de estilo especiales para ellas.

¿Un poco confuso? En realidad es bastante simple. Supongamos que los enlaces de nuestro sitio son de color verde:
a {color:green:}
y quisiéramos que aquellos tienen el atributo target="_blank" fueran de color amarillo; agregaríamos lo siguiente, con o sin la palabra !important:
a[target="_blank"] { {color: yellow !important;}
¿Y si quisiéramos algo más genérico como diferenciar el color de los enlaces internos de los enlaces externos? En ese caso podríamos usar el atributo href que es el que contiene la dirección url y un "comodín" (el caracter asterisco) para que la regla se aplique a cualquier enlace que contenga parte de nuestra dirección. En el caso de este blog, podría ser algo así:
a[href*="vagabundia.blogspot.com"] { {color: yellow !important;}
la sintaxis en general es:
[atributo*="dato"]
Donde el comodín hace que se aplique a cualquier atributo cuyo contenido contenga el dato total o parcialmente.

Entonces, para establecer reglas de estilo diferentes en ciertas páginas como las etiquetas, podríamos utilizar este sistema pero debemos tener algo en donde mirar, debe haber alguna etiqueta que tenga algún atributo que podamos leer y actuar en consecuencia.

Se me ocurre que lo más sencillo es colocarlo en la etiqueta body que normalmente dice esto:
<body>
o esto:
<body expr:class='&quot;loading&quot; + data:blog.mobileClass'>
o cualquier cosa similar, no tiene importancia, basta que allí agreguemos un atributo extra como rel y la url de la página que obtenemos de los datos del mismo Blogger:
<body expr:rel='data:blog.canonicalUrl' .......
Hecho eso, nada cambiará así que ahora crearemos las reglas que se nos ocurran ya que sabemos que ese atributo contendrá algo así cuando estemos en una página de etiquetas:
rel="http://miblog.com/search/label/nombre_etiqueta"
Suponiendo que quisiera que las páginas de etiquetas Google de este blog tuvieran un color de fondo rojo, la regla sería:
body[rel*="label/Google"] {background: red;}
Y si quisiera cambiar el título de los posts:
body[rel*="label/Google"] .post-title { ....... acá las propiedades ....... }
y el header:
body[rel*="label/Google"]  #header-wrapper { ....... acá las propiedades ....... }
Aplicando after y before también podemos agregar "contenido".

Si pusiera esta regla, cuando se abre una página de etiquetas Google, se vería una imagen a la derecha del header:
body[rel*="label/Google"] #header-wrapper {position: relative;}
body[rel*="label/Google"] #header-wrapper:after {
content: url(url_imagen);
position: absolute;
right: 20rpx;
top: 20px;
}
En resumen, a partir del primer selector, puedo acceder a cualquier etiqueta, id o clase interna y definir reglas exactas que se apliquen en ciertas condiciones.

Obviamente, alguien preguntará si podríamos hacer lo mismo para diferenciar los posts según su etiqueta y ahí las cosas se complican porque, hasta donde sé, no hay ningún dato al que podamos acceder para conocer la etiqueta de una entrada hasta que esta es cargada en el includable post lo que significa que cualquier cambio que hagamos podría tardar en verse ya que puede haber otras partes de nuestra página que se mostrarían antes y si estas tardan, primero se mostrará el estilo general y luego el modificado.

El segundo problema es que allí podemos leer las etiquetas del post pero esto se debe hacer en un bucle y usar JavaScript para agregar el dato extra que necesitamos (el nombre de la etiqueta).

Entonces, haremos eso, buscaremos:
<b:includable id='post' var='post'>
y veremos que la siguiente linea dice algo como esto o similar:
<div class='post hentry uncustomized-post-template'>
Debajo, pondremos lo siguiente:
<b:if cond='data:blog.pageType != &quot;item&quot;'>
<b:loop values='data:post.labels' var='label'>
<b:if cond='data:label.isLast == &quot;true&quot;'>
<script type='text/javascript'>
var postetiqueta=&#39;<data:label.name/>&#39;;
</script>
</b:if>
</b:loop>

<!-- con eso, tenemos el nombre de la última etiqueta (si es que el post tiene varias) guardada en una variable -->

<script type='text/javascript'>
// agregamos el atributo rel con el nombre en la etiqueta body
document.body.setAttribute(&#39;rel&#39;,postetiqueta);
</script>

</b:if>
Y si usamos jQuery podemos reemplazar document.body.setAttribute() por:
$(&#39;body&#39;).attr(&#39;rel&#39;,postetiqueta);
De acá en más, en las páginas individuales, la etiqueta body tendrá un atributo rel cuyo valor es el nombre de la etiqueta de la entrada así que, con un criterio similar al comentado inicialmente, podemos usar selectores y definir estilos particulares para esas entradas aunque, en este caso, no necesitamos el comodín.

En el blog de pruebas hay dos entradas armadas de este modo, en una, la etiqueta es rojo y algunas de sus reglas son estas:
<style>
body[rel="rojo"] #header-wrapper {display: none;}
body[rel="rojo"] #sidebar-wrapper {display: none;}
body[rel="rojo"] #main-wrapper {width: 100%;}
body[rel="rojo"] {background: #800;}
body[rel="rojo"] .post-title a { ....... propiedades ....... }
body[rel="rojo"] .post-body { ....... propiedades ....... }
</style>
Lo mismo ocurre con otra entrada del demo cuya etiqueta es azul; simplemente, cambian las reglas:
body[rel="azul"] {background: #79B;}

martes, 26 de marzo de 2013

Egg Social Icon Set

Egg Social es un set de íconos de redes sociales en forma de huevos de pascua que podemos usar para nuestro blog o sitio web.

CARACTERÍSTICAS

Pack de íconos en forma de huevo de pascua de las principales redes sociales.
Autor : Land of Web
Formato: PNG.
Tamaños: 512x512, 256x256, 128x128, 64x64.

Descargar

Pagar con un tweet contenido recibido del blog


Pay with a tweet



Pay with a tweet o "pague con un tweet" traducido al español, es un sistema de pago social, con el cual es posible ofrecer un producto a cambio de un tweet, aunque opcionalmente también funciona con una publicación en facebook.



Este servicio se inició hace algún tiempo y goza de cierta popularidad. Es utilizado en sitios web para la difusión de cualquier tipo de contendido que pueda ser descargado, como imágenes, e-books, música, y otros archivos. Esta misma idea ya ha sido materializada por la compañia Kellogg's, en donde era posible recibir una caja de sus productos a cambio de un tweet, en una tienda que fue creada para ese propósito.




Cómo funciona Pay with a tweet


Es simple, una vez que se haya enviado el tweet o publicación a Facebook, usando el botón que se facilita en la página, se recibe automáticamente el link de descarga del producto que se está promocionando.



Desde las opciones de configuración, puedes agregar el texto que llevará el tweet, limitar la cantidad de personas que pueden enviar un tweet, así como también establecer una fecha de vencimiento para tu campaña "pague con un tweet".






Quién puede usarlo



En general, cualquier persona que tenga un sitio web y que quiera difundir su contenido. Si eres por ejemplo diseñador gráfico y estás ofreciendo a la venta un set de iconos, podrías ofrecer una porción de éstos a cambio de un tweet. Igualmente puedes ofrecer un e-book de recetas de cocina, consejos de belleza, o cualquier otra cosa de valor que pueda ser descargada y que quieras promover.





Cómo obtener el botón de Pay with a tweet





 Es fácil, para obtenerlo solo sigue estos pasos:




  1. Vas a la página de Pay with a tweet.

  2. Haz click en el botón que dice "Crea un botón de pago".

  3. Rellena todos los campos del formulario, y selecciona las opciones que quieres que tenga el botón.

  4. Acepta los términos y condiciones (una vez que los leas), y obtén el código en "Crear mi botón".


Una vez conseguido el código del botón,  puedes agregarlo a la página donde mostrarás el contenido que vas a ofrecer para ser descargado.



Y listo, ya habrás obtenido un botón para empezar tu campaña de pague con un tweet ;)




Conclusiones 


Pay with a tweet representa un medio muy efectivo para promocionar contenido, donde las dos partes involucradas se ven beneficiadas.



Del mismo modo que puedes utilizar la dirección web del archivo para descargarse, una vez que se haga el tweet, podrías por ejemplo agregar la dirección de una página estática, donde tuvieses material exclusivo.

domingo, 24 de marzo de 2013

Servicios para agregar imágenes temporales

¿Imágenes falsas? ¿Para qué? Son útiles a la hora de probar cosas, nos evitan tener que subir alguna o re-dimensionarlas y están siempre listas.

Hay muchos sitios que brindan ese servicio. fakeimg nos permite definir su tamaño (ancho y alto), el color de fondo y del texto así como su contenido. Son todas opciones que se agregan de manera sencilla:
<img src="http://fakeimg.pl/200/" /> será una imagen cuadrada de 200x200
<img src="http://fakeimg.pl/300x200/" /> será una imagen rectangular de 300x200
<img src="http://fakeimg.pl/300x200/ffff00/" /> será una imagen rectangular de 300x200 con fondo amarillo
<img src="http://fakeimg.pl/300x200/ffff00/000" /> será una imagen rectangular de 300x200 con fondo amarillo y texto en negro
<img src="http://fakeimg.pl/300x200/?text=Hola" /> así establecemos el texto a mostrar
<img src="http://fakeimg.pl/300x200/?text=Hola&font=museo" /> y de este modo podemos indicar una fuente par el texto (lobster, bebas, museo)

Pero hay más alternativas. Tanto Dummy Image como placehold son similares en cuanto a opciones:
<img src="http://placehold.it/300x200" />
<img src="http://dummyimage.com/300x200" />

PlaceKitten excepto que lo que nos mostrará son imágenes de gatos definiendo su ancho y alto:
<img src="http://placekitten.com/300/200" />

y para que nadie se queje, Placedog lo hará mostrando imágenes de perros; si usamos Placeape serán monos y Placebear nos dará osos:
<img src="http://placedog.com/300/200" />
<img src="http://placeape.com/300/200" />
<img src="http://placebear.com/400/200" />

Si no se quieren animales, los hambrientos pueden usar Bacon Mockup y mostrar imágenes de comida.

Si se quieren calaveras (hay para todos los gustos, se puede usar PlaceSkull:
<img src="http://baconmockup.com/300/200" />
<img src="http://placeskull.com/300/200/" />

Y si nada nos convence, está Lorempixel que genera imágenes aleatorias con opciones diversas:
<img src="http://lorempixel.com/300/200/" /> es una imagen de 300x200
<img src="http://lorempixel.com/g/300/200" /> es una imagen en tonos de gris
<img src="http://lorempixel.com/300/200/sports" /> muestra una imagen de cierta categoría (abstract, animals, city, food, night, life, fashion, people, nature, sports, technics, transport)

Hay muchas opciones más y el sitio posee una herramienta que nos permite generar el código.

REFERENCIAS:paulund.co.uk

Menú horizontal con subpestañas y buscador integrado 2



Hace algún tiempo vimos el menú horizontal con subpestañas y buscador integrado y desde eso me han preguntado cómo hacer ese mismo menú pero de varios niveles, es decir, que las subpestañas del menú también tengan subpestañas. El menú a continuación tiene esa característica, además de conservar el buscador dentro del menú.
Los estilos redondeados en los submenús se han quitado por cuestiones estéticas, pero ya saben que cualquiera de estas monerías pueden personalizarse a consideración y gusto propio.

El menú puedes verlo en este blog de pruebas.

ATENCIÓN: Si usas una plantilla hecha a través del Diseñador de plantillas de Blogger primero necesitas seguir los pasos de esta entrada.


Para poner este menú horizontal con submenús en tu blog entra en la Edición HTML de tu plantilla, y antes de ]]></b:skin> pega los estilos:
/* Menu horizontal con buscador
----------------------------------------------- */
#menuWrapper {
width:100%; /* Ancho del menú */
height:35px;
padding-left:14px;
background:#333; /* Color de fondo */
border-radius:20px; /* Bordes redondeados de la barra principal */
}
.menu {
padding:0;
margin:0;
list-style:none;
height:35px;
position:relative;
z-index:5;
font-family:arial, verdana, sans-serif;
}
.menu li:hover li a {
background:none;
}
.menu li.top {display:block; float:left;}
.menu li a.top_link {
display:block;
float:left;
height:35px;
line-height:34px;
color:#ccc;
text-decoration:none;
font-family:"Lucida Sans Unicode", "Trebuchet Unicode MS", "Lucida Grande",sans-serif;
font-size:13px; /* Tamaño de la fuente */
font-weight:bold;
padding:0 0 0 12px;
cursor:pointer;
}
.menu li a.top_link span {
float:left;
display:block;
padding:0 24px 0 12px;
height:35px;
}
.menu li a.top_link span.down {
float:left;
display:block;
padding:0 24px 0 12px;
height:35px;
}
.menu li a.top_link:hover, .menu li:hover > a.top_link {color:#fff; }
.menu li:hover {position:relative; z-index:2;}
.menu ul,
.menu li:hover ul ul,
.menu li:hover ul li:hover ul ul,
.menu li:hover ul li:hover ul li:hover ul ul,
.menu li:hover ul li:hover ul li:hover ul li:hover ul ul
{position:absolute; left:-9999px; top:-9999px; width:0; height:0; margin:0; padding:0; list-style:none;}

.menu li:hover ul.sub {
left:0;
top:35px;
background:#333; /* Color de fondo del submenú */
padding:3px;
white-space:nowrap;
width:200px;
height:auto;
z-index:3;
}
.menu li:hover ul.sub li {
display:block;
height:30px;
position:relative;
float:left;
width:200px;
font-weight:normal;
}
.menu li:hover ul.sub li a{
display:block;
height:30px;
width:200px;
line-height:30px;
text-indent:5px;
color:#ccc;
text-decoration:none;
}
.menu li ul.sub li a.fly {
/* Color de fondo del submenú */
background:#333 url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFxacb0vA2IhsqDqe7LXdq0974NNqgL07iB-BjuUwr-qkmTOucW0Gl2xQIxhiZdwRWQLyiAupLdSCsp0yeZenNTgBu74_5UTwl-7k9xSokkyBi3iXOeADDtbIUu_xf6XEOTrhpckIeNG6j/) 185px 10px no-repeat;}
.menu li:hover ul.sub li a:hover {
background:#2580a2; /* Color de fondo al pasar el cursor */
color:#fff;
}
.menu li:hover ul.sub li a.fly:hover, .menu li:hover ul li:hover > a.fly {
/* Color de fondo al pasar el cursor */
background:#2580a2 url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFxacb0vA2IhsqDqe7LXdq0974NNqgL07iB-BjuUwr-qkmTOucW0Gl2xQIxhiZdwRWQLyiAupLdSCsp0yeZenNTgBu74_5UTwl-7k9xSokkyBi3iXOeADDtbIUu_xf6XEOTrhpckIeNG6j/) 185px 10px no-repeat; color:#fff;}

.menu li:hover ul li:hover ul,
.menu li:hover ul li:hover ul li:hover ul,
.menu li:hover ul li:hover ul li:hover ul li:hover ul,
.menu li:hover ul li:hover ul li:hover ul li:hover ul li:hover ul {
left:200px;
top:-4px;
background: #333; /* Color de fondo del submenú */
padding:3px;
white-space:nowrap;
width:200px;
z-index:4;
height:auto;
}
#search {
width: 228px; /* Ancho del buscador */
height: 22px;
float: right;
text-align: center;
margin-top: 6px;
margin-right: 6px;
/* Imagen de fondo del buscador */
background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbNps93HyZstsblqp2FloayJLGIp58a0pi6MIJ_ydOIo3byXrwB-LB6wxz7TbQAW220XOKuIcQlgBDGiOHJEwzdeNnhJE41Dg-ePVuHzy2Gc0MhhkB9N5pbL5OfF63kfflXHccuOCcUm4/s1600/search-bar.png) no-repeat;
}
#search-box {
margin-top: 3px;
border:0px;
background: transparent;
text-align:center;
}
Luego entra en Diseño y en un gadget HTML/Javascript pega lo siguiente:
<div id='menuWrapper'>
<ul class='menu'>
<li class='top'><a class='top_link' href='URL del enlace'><span>Pestaña 1</span></a></li>

<li class='top'><a class='top_link' href='#'><span class='down'>Pestaña 2</span></a><ul class='sub'><li><a class='fly' href='#'>Pestaña 2.1</a><ul>
<li><a href='URL del enlace'>Pestaña 2.1.1</a></li>
<li><a href='URL del enlace'>Pestaña 2.1.2</a></li>
<li><a href='URL del enlace'>Pestaña 2.1.3</a></li>
</ul>
</li>
<li class='mid'><a class='fly' href='#'>Pestaña 2.2</a>
<ul>
<li><a href='URL del enlace'>Pestaña 2.2.1</a></li>
<li><a href='URL del enlace'>Pestaña 2.2.2</a></li>
<li><a href='URL del enlace'>Pestaña 2.2.3</a></li>
<li><a class='fly' href='#'>Pestaña 2.2.4</a>
<ul>
<li><a href='URL del enlace'>Pestaña 2.2.4.1</a></li>
<li><a href='URL del enlace'>Pestaña 2.2.4.2</a></li>
<li><a href='URL del enlace'>Pestaña 2.2.4.3</a></li>
</ul>
</li>
<li><a href='URL del enlace'>Pestaña 2.2.5</a></li>
<li><a class='fly' href='#'>Pestaña 2.2.6</a>
<ul>
<li><a href='URL del enlace'>Pestaña 2.2.6.1</a></li>
<li><a href='URL del enlace'>Pestaña 2.2.6.2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href='URL del enlace'>Pestaña 2.3</a></li>
<li><a href='URL del enlace'>Pestaña 2.4</a></li>
<li><a href='URL del enlace'>Pestaña 2.5</a></li>
</ul>
</li>

<li class='top'><a class='top_link' href='#'><span class='down'>Pestaña 3</span></a>
<ul class='sub'>
<li><a href='URL del enlace'>Pestaña 3.1</a></li>
<li><a href='URL del enlace'>Pestaña 3.2</a></li>
<li><a href='URL del enlace'>Pestaña 3.3</a></li>
<li><a href='URL del enlace'>Pestaña 3.4</a></li>
</ul>
</li>

<li class='top'><a class='top_link' href='#'><span class='down'>Pestaña 4</span></a>
<ul class='sub'>
<li><a href='URL del enlace'>Pestaña 4.1</a></li>
<li><a class='fly' href='#'>Pestaña 4.2</a>
<ul>
<li><a href='URL del enlace'>Pestaña 4.2.1</a></li>
<li><a href='URL del enlace'>Pestaña 4.2.2</a></li>
<li><a href='URL del enlace'>Pestaña 4.2.3</a></li>
<li><a href='URL del enlace'>Pestaña 4.2.4</a></li>
<li><a href='URL del enlace'>Pestaña 4.2.5</a></li>
<li><a href='URL del enlace'>Pestaña 4.2.6</a></li>
</ul>
</li>
<li><a href='URL del enlace'>Pestaña 4.3</a></li>
<li><a href='URL del enlace'>Pestaña 4.4</a></li>
<li><a href='URL del enlace'>Pestaña 4.5</a></li>
<li><a href='URL del enlace'>Pestaña 4.6</a></li>
</ul>
</li>

<li class='top'><a class='top_link' href='#'><span class='down'>Pestaña 5</span></a>
<ul class='sub'>
<li><a href='URL del enlace'>Pestaña 5.1</a></li>
<li><a href='URL del enlace'>Pestaña 5.2</a></li>
<li><a href='URL del enlace'>Pestaña 5.3</a></li>
</ul>
</li>


<!-- Buscador -->
<li>
<form action='/search' id='search' method='get' name='searchForm' style='display:inline;'>
<input id='search-box' name='q' onblur='if (this.value == &quot;&quot;) this.value = &quot;Buscar...&quot;;' onfocus='if (this.value == &quot;Buscar...&quot;) this.value = &quot;&quot;;' size='28' type='text' value='Buscar...'/></form>
</li>

</ul>
</div>
Guarda los cambios y listo. En color verde puedes ver las áreas para cambiar los colores.

Antes de <!-- Buscador --> puedes agregar más pestañas si lo deseas.
Si quisieras añadir otra pestaña simple, agrega una línea como esta:
<li class="top"><a href="URL del enlace" class="top_link"><span>Pestaña</span></a></li>
Si quisieras agregar una pestaña con subpestañas entonces agrega este código:
<li class="top"><a href="#" class="top_link"><span class="down">Pestaña</span></a>
<ul class="sub">
<li><a href="URL del enlace">Sub pestaña</a></li>
<li><a href="URL del enlace">Sub pestaña</a></li>
<li><a href="URL del enlace">Sub pestaña</a></li>
</ul>
</li>
Y si quisieras que una de las subpestañas tuviera otras subpestañas entonces elimina una línea como la que está en color naranja y cámbiala por un código como este:
<li><a href="#" class="fly">Sub pestaña</a>
<ul>
<li><a href="URL del enlace">Otra Sub pestaña</a></li>
<li><a href="URL del enlace">Otra Sub pestaña</a></li>
<li><a href="URL del enlace">Otra Sub pestaña</a></li>
</ul>
</li>

Con esta variación del menú podemos agrupar más enlaces y categorías en poco espacio, y que además, al conservar el buscador dentro del menú hace que sea un menú práctico, compacto y útil.

miércoles, 20 de marzo de 2013

Efecto hover desde distintas direcciones

Aunque me ha costado armarlo para que funcionara acá porque hay cosas que no termino de entender bien, la idea de crear efectos hover que muestren contenidos distintos según sea la dirección desde la cual se entra con el cursor, no deja de ser interesante.

Lo básico es empezar con el HTML que no es otra cosa que un DIV donde incluimos cuatro etiquetas SPAN con los textos y una imagen.
<div class=multi-hover>
<span>hover desde la derecha</span>
<span>hover desde arriba</span>
<span>hover desde la izquierda</span>
<span>hover desde abajo</span>
<img src="https://lh5.googleusercontent.com/-RAUoNEersrc/UGt18u6HXyI/AAAAAAAACwo/QWa2I1zG7Y0/s400/24_0144.jpg">
</div>
Si se usa en una entrada de Blogger, habrá que tener en cuenta que todo debe ser escrito en una sola línea para evitar los saltos (etiquetas BR) que se agregan por defecto.

El resultado sería esto:

hover desde la derechahover desde arribahover desde la izquierdahover desde abajo

Y el CSS:
<style>

/* el contenedor y la imagen */
div.multi-hover {
overflow: hidden;
position: relative;
vertical-align: middle;
width: 100%;
/* tuve que establecer la altura para que los textos se centraran verticalmente */
height: 358px;
line-height: 358px;
}
div.multi-hover img {width: 100%;}

/* los textos que, por defecto, permanecerán ocultos */
div.multi-hover span {
color: #FFF;
font-size: 32px;
height: 100%;
opacity: 0;
position: absolute;
text-align: center;
transition: all 0.3s linear 0s; /* agregar los prefijos para cada navegador */
width: 100%;
}

/* y esto es lo que generará el efecto */

div.multi-hover span:nth-child(1) { /* desde la derecha */
background: none repeat scroll 0 0 rgba(216, 38, 38, 0.6);
left: 90%;
top: 0;
}
div.multi-hover span:nth-child(2) { /* desde arriba */
background: none repeat scroll 0 0 rgba(127, 216, 38, 0.6);
left: 0;
top: -80%;
}
div.multi-hover span:nth-child(3) { /* desde la izquierda */
background: none repeat scroll 0 0 rgba(38, 216, 216, 0.6);
left: -90%;
top: 0;
}
div.multi-hover span:nth-child(4) { /* desde abajo */
background: none repeat scroll 0 0 rgba(127, 38, 216, 0.6);
left: 0;
top: 80%;
}

/* los hacemos visibles ... */
div.multi-hover span:hover {opacity: 1;}

/* ... moviéndolos horizontalmente ... */
div.multi-hover span:nth-child(2n+1):hover {left: 0;}
/* ... o verticalmente ... */
div.multi-hover span:nth-child(2n):hover {top: 0;}

</style>
Para probar si los valors que colocamos son correctos, lo que conviene es poner opacity: 1; en la regla div.multi-hover span {} y ver el resultado. En este caso, debería verse algo así:


Al dejarlos "visibles", podemos ver como los SPAN se superponen un poco en la imagen que es, justamente, la forma en que serán detectados por el hover. De ese modo, una vez que los hayamos ubicado, tenemos listo el efecto y podemos ocultarlos definitivamente.

REFERENCIAS:demosthenes.info

sábado, 16 de marzo de 2013

Batck, Free and Other icons


Batch Icons descargar


Free Glyphs descargar


Other Icons descargar

Ocultar entradas con determinada etiqueta en el inicio de Blogger

A petición de +Danilo Cisneros, he creado un tutorial con el cual conseguiremos ocultar entradas con cierta etiqueta en el inicio de nuestro blog, de manera que éstas aparezcan únicamente al ingresar a la categoría correspondiente.

Esto puede ser útil para filtrar algunas entradas y/u organizar nuestra página de inicio, o bien para lo que desees. También puedes hacer algo "a la inversa", es decir, mostrar las entradas con la etiqueta X y ocultar el resto.

blogger, etiquetas, pagina inicio, homepage

El tutorial:

Para comprobar la funcionalidad del tutorial, he creado un demo en el cual se ocultan todas las entradas etiquetadas como Blogger, las demás se muestran en el índice y en las categorías normalmente.

Opción 1: Ocultar entradas con determinada etiqueta:
Con los artilugios expandidos, en nuestro editor HTML buscaremos el siguiente código (Búscalo por su inicio y su cierre):

<b:includable id='post' var='post'>

<!-- Acá va una gran cantidad de código el cual no tocaremos -->

</b:includable>

Cuando hayas encontrado este código, incluye el código siguiente de esta manera:
<b:includable id='post' var='post'>

<!-- Inicio del código-->
<b:loop values='data:post.labels' var='label'>
<b:if cond='data:blog.url == data:blog.homepageUrl'>
<b:if cond='data:label.name == &quot;Nombre de la etiqueta&quot;'>
<b:else/>

<!-- Acá va el código que iba dentro del <b:includable> -->

</b:if>
<b:else/>

<!-- Acá va el código que iba dentro del <b:includable>, otra vez -->
</b:if>
</b:loop>
<!-- Fin del código -->

</b:includable>

En donde aparece "Nombre de la etiqueta" escribe exactamente el nombre de cual quieras excluir en el inicio del blog, una vez hecho esto previsualiza los cambios, y si consigues observar el resultado puedes guardar tu plantilla.

Importante: Para que todo siga funcionando correctamente dentro de tu blog, es necesario que el código que estaba dentro del <b:includable> lo agregues también en el espacio que he marcado.

Opción 2: Mostrar únicamente entradas con determinada etiqueta:

Para invertir la operación, bastaría con buscar la segunda condicional dentro del código (La que se encuentra dentro del <b:loop>:
<b:if cond='data:label.name == "Nombre de la etiqueta"'>

Y en donde aparece == deberás dejarlo como !=, quedando de la siguiente manera:
<b:if cond='data:label.name != "Nombre de la etiqueta"'>

Guardas los cambios y listo.

Opción 3: Ocultar y hacer coincidir la última etiqueta:

A petición de +Emilio Luna he actualizado esta entrada con el código para hacer coincidir la última etiqueta de los posts y así ocultarlos:
<b:includable id='post' var='post'>
<!-- Inicio del código-->
<b:loop values='data:post.labels' var='label'>
    <b:if cond='data:blog.url == data:blog.homepageUrl'>
        <b:if cond='data:label.isLast == &quot;true&quot;'>
            <b:if cond='data:label.name == &quot;Nombre de la etiqueta&quot;'>
            <b:else/>
                <!-- Acá va el código que iba dentro del <b:includable> -->
            </b:if>
        </b:if>
    <b:else/>
        <!-- Acá va el código que iba dentro del <b:includable>, otra vez -->
    </b:if>
</b:loop>
<!-- Fin del código -->
</b:includable>

El procedimiento para invertir la función es el mismo que el del método 2.

viernes, 15 de marzo de 2013

Únete y participa en la comunidad: "Todo Blogger en español"

Todo Blogger en español, es una comunidad en Google+ que nace motivada por la idea de crear un lugar dónde compartir ideas, experiencias y recursos, sobre la plataforma de Blogger.



Esta comunidad ha sido creada con el firme propósito de unir a las personas con intereses comunes, dando lugar a un ambiente propicio para la conversación,  la cooperación, y toda participación que pueda ser enriquecedora a beneficio de todos sus miembros.



Hoy me complace hacerte una atenta invitación para que te unas a la comunidad, y participes en ella ;)



Al ser parte de la comunidad, podrás:


  • Compartir tu blog con todos los miembros y conocer otros blogs 

  • Colaborar con otros miembros, aportando nuevas ideas que puedan ser útiles para mejorar el blog                                 

  • Aprender sobre distintos temas relacionados a la plataforma de Blogger a través de los debates, o las referencias de publicaciones en blogs, etc.





La iniciativa de crear la comunidad, fue ideada y organizada por +Jesús González autor de Iniciablog.com, quien cordialmente me invitó a formar parte del equipo de moderadores. Además de una servidora, existen otros miembros que también forman parte del equipo de moderadores y que a continuación te presento.




El equipo de moderadores


Como en toda comunidad de Google+, existen los moderadores, quienes tienen la responsabilidad de velar por el orden de la comunidad. He aquí la lista completa del equipo de moderadores de la comunidad:



+Jesús González autor de Iniciablog.com

+Víctor Calderón, autor de Ayuda-Bloggers.info

+Oloman autor de oloBlogger.com

DanielGarcia, autor de GadgetsBlogger.com

+Hayder Juvinao autor de miltrucosblogger.info

y una sevidora +Karla Castañeda.




La dinámica: Categorías en la comunidad




Al ser miembro de la comunidad, podrás hacer comentarios y publicaciones libremente. Para llevar un orden en las publicaciones, es necesario elegir la categoría en la que harás tu publicación, de ese modo la comunidad estará bien organizada ;)



Hacer publicaciones siguiendo un orden es sencillo, simplemente selecciona la categoría del menú que aparece en el cuadro para compartir la publicación, antes de que la publiques, ¿fácil verdad?



Podrás publicar sobre distintos temas relacionados a Blogger, por ejemplo, puedes compartir tu blog a todos los miembros de la comunidad usando la categoría  "Presenta tu blog". Si tienes alguna duda o inquietud sobre la plataforma de Blogger o algún tema relacionado, puedes hacer una pregunta desde la categoría "Debates"; en fin, puedes participar en cualquiera de las categorías o temas que han sido creadas y por supuesto, también puedes comentar en cualquiera de las publicaciones.



Si lo deseas, puedes sugerir la apertura de otro tema o categoría que pueda ser de interés para la comunidad ;)



Así que no esperes más y colabora, comparte y aprende en la comunidad pensada en beneficiar a blogueros como tú ;)






Todo Blogger en Español





¡Te esperamos!. Por último, si deseas saber más sobre las comunidades de Google+, también te invito a echarle un vistazo a la página de Google, donde podrás ver toda la información al respecto.

jueves, 14 de marzo de 2013

Bloggerest: Plantilla para Blogger

descargas
Nombre:Bloggerest
Diseñador:El Potro
Compatibilidad:Google Chrome, Mozilla Firefox, Safari, Opera, Internet Explorer
Características:Plantilla para Blogger, 2 columnas, 980px de ancho, Entradas estilo Pinterest, Cabecera flotante, Colores minimalistas, Comentarios del autor destacados, Botones para compartir.
Incluye:Plantilla XML, Instrucciones de instalación, Licencia


Hace ya mucho tiempo que no creaba una plantilla gratuita para Blogger, así que esta vez quise darme un tiempo para poder diseñar una plantilla que pudieran descargar y usar libremente.

Bloggerest es una plantilla gratuita inspirada en Pinterest, aunque no es una réplica (ni pretende serla), ideal para blogs de fotografia, o blogs donde las imágenes juegan un rol importante.
El diseño de la plantilla es un tanto minimalista, predominan los colores rojo y blanco con un toque de gris. El título del blog así como los títulos de los gadgets usan una fuente tipo caligrafía para darle un aire elegante.
La cabecera ocupa el 100% del ancho de la página al mismo tiempo de ser flotante. Las imágenes en la portada tienen opacidad al pasar el cursor y éstas conducen a la entrada al dar click sobre ellas, también muestra la miniatura del video cuando están alojados en YouTube y cuando no hay una imagen que lo antecede.
Este es un ejemplo de una entrada donde se puede apreciar cómo se visualizan los bloques entrecomillados, las listas numeradas, las listas con viñetas, los botones para compartir, los gadgets de la sidebar y los comentarios donde se destacan los realizados por el autor.

Personalización:

La cabecera tiene un alto de 124px por lo que se recomienda usar un logotipo que no exceda esa medida.

El menú de la plantilla es el menú horizontal con subpestañas y buscador integrado, por lo que en esa entrada podrás ver un poco más sobre su personalización. En la plantilla puedes identificar el menú por la etiqueta <div id='menuWrapper'>

La forma de redactar las entradas es igual que como lo harías siempre, sin embargo, en caso de que tu entrada sólo contenga una imagen, o un video, sin nada de texto, tendrás que dar uno o más saltos de línea (ENTER) al final del código de tu imagen o de tu video, ya que si no lo haces la imagen no se formará en miniatura y se distorcionará.


Es compatible con todos los navegadores más conocidos (arriba se especifica cuáles) según la última versión actual de cada uno de ellos.

El sistema magazine que utiliza permite mostrar muchas entradas en la portada ya que en la portada las entradas no cargan de forma completa, permitiendo agilizar la carga del blog. Las pocas imágenes que usa la plantilla están alojadas directamente en base 64 por lo que no dependerás de ningún servicio externo para cargarlas.

Espero que sea de su entero agrado, que la disfruten, y que no retiren los créditos :P

ACTUALIZACIÓN 4/abr/2013
Si en la pestaña Diseño no ves la sidebar, entra en Plantilla | Edición de HTML y elimina estas partes en color rojo:
<b:if cond='data:blog.pageType != &quot;index&quot;'>
<b:if cond='data:blog.pageType != &quot;archive&quot;'>
<b:if cond='data:blog.homepageUrl != data:blog.url'>

<div id='sidebar-wrapper'>
<b:section class='sidebar' id='sidebar' preferred='yes'>
<b:widget id='Label1' locked='false' mobile='yes' title='Categorías' type='Label'/>
<b:widget id='PopularPosts1' locked='false' mobile='yes' title='Entradas populares' type='PopularPosts'/>
<b:widget id='BlogArchive1' locked='false' mobile='yes' title='Archivo del blog' type='BlogArchive'/>
</b:section>
</div>

</b:if>
</b:if>
</b:if>
Eso hará que la sidebar aparezca en la sección Diseño. Si notaras que con ese cambio tarda un poco más en cargar la portada del blog, o si aparecen menos entradas, pon de nuevo ese código después de haber hecho todas las modificaciones deseadas en la sidebar.


ACTUALIZACIÓN 12/abr/2013
Se ha modificado la plantilla para resolver el problema de las entradas que tenían añadido el salto de línea (Leer más) manualmente. También se ha agregado un enlace a la imagen predeterminada para las entradas que no tienen una imagen.

martes, 12 de marzo de 2013

Reestructura fácilmente las entradas en Blogger

Habíamos visto con anterioridad la manera de personalizar las entradas de tu blog de varias maneras, pero creo que a muchos usuarios les interesará poder organizar la forma en la que se muestran los elementos dentro de sus artículos. Para ello, he conseguido organizar los elementos mediante etiquetas <b:includable>, para que con unas simples líneas puedas adaptar todo según tus necesidades.



Para que puedas comprender mejor el sistema, bastaría con observar el siguiente código de ejemplo y su modificación:

<!--ESCRUCTURA EJEMPLO 1--> 
<div class="post">
<código titulo entrada />
<código titulo resúmen post />
<código etiquetas />
</div>
<!--ESCRUCTURA EJEMPLO 2-->
<div class="post">
<código etiquetas />
<código titulo resúmen post />
<código titulo entrada />
</div>

Las etiquetas de los ejemplos son únicamente para ejemplificar.

Ahora que entendiste el propósito del tutorial, empezaremos con la primera modificación, pero antes te invito a que hagas un respaldo de tu plantilla por si algo no sale bien o por si no te gusta el resultado.

Paso 1: Reemplaza el <b:widget type='Blog'> de tu plantilla:

Lo primero que necesitas hacer, es buscar un código muy similar a este desde la edición HTML de tu plantilla (Sin expandir artilugios):

<b:widget id='Blog1' locked='true' title='Entradas del blog' type='Blog'/>

Deberás seleccionarlo, y en su lugar añadir todo este código:

<b:widget id='Blog88' locked='false' title='Entradas del blog' type='Blog'>
<b:includable id='post' var='post'>


<div class='post'>

<b:if cond='data:blog.pageType == "index"'>
// Acá deberás pegar los códigos de los items que desees mostrar en las entradas del índice.
<b:else/>
// Esto se verá en entradas y páginas estáticas.
</b:if>


</div>
</b:includable>


<b:includable id="descripcion">
<!-- LOS SIGUIENTES INCLUDABLES PERMITEN EL CORRECTO FUNCIONAMIENTO DE LAS ENTRADAS DEL BLOG, NO LOS ALTERES A MENOS QUE SEPAS LO QUE ESTÁS HACIENDO

LÍNEAS ORGANIZADAS POR VÍCTOR CALDERÓN PARA AYUDA BLOGGERS.
-->

</b:includable>


<b:includable id='navegacion'><div class='blog-pager' id='blog-pager'><b:if cond='data:newerPageUrl'><span id='blog-pager-newer-link'><a class='blog-pager-newer-link' expr:href='data:newerPageUrl' expr:id='data:widget.instanceId + &quot;_blog-pager-newer-link&quot;' expr:title='data:newerPageTitle'><data:newerPageTitle/></a></span></b:if><b:if cond='data:olderPageUrl'><span id='blog-pager-older-link'><a class='blog-pager-older-link' expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + &quot;_blog-pager-older-link&quot;' expr:title='data:olderPageTitle'><data:olderPageTitle/></a></span></b:if><a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a></div><div class='clear'/></b:includable>
<b:includable id="imagen-miniatura"><b:if cond='data:post.thumbnailUrl'><img class="postthumb" expr:src ="data:post.thumbnailUrl" expr:alt="data:post.title"/></b:if></b:includable>
<b:includable id="primera-imagen"><img alt='first-image' expr:src='data:post.firstImageUrl'/></b:includable>
<b:includable id='mensaje-estado'><b:if cond='data:navMessage'><div class='status-msg-wrap'><div class='status-msg-body'><data:navMessage/></div><div class='status-msg-border'><div class='status-msg-bg'><div class='status-msg-hidden'><data:navMessage/></div></div></div></div><div style='clear: both;'/></b:if></b:includable>

<b:includable id="titulos-entradas"><b:if cond='data:post.title'><h1 class='post-title entry-title'><b:if cond='data:post.link'><a expr:href='data:post.link'><data:post.title/></a><b:else/><b:if cond='data:post.url'><b:if cond='data:blog.url != data:post.url'><a expr:href='data:post.url'><data:post.title/></a><b:else/><data:post.title/></b:if><b:else/><data:post.title/></b:if></b:if></h1></b:if></b:includable>


<b:includable id="fecha-entrada"><div class='post-timestamp'><b:if cond='data:top.showTimestamp'><data:top.timestampLabel/><a class='timestamp-link' expr:href='data:post.url' rel='bookmark' title='permanent link'><data:post.timestamp/></a></b:if></div></b:includable>

<b:includable id="etiquetas-post"><div class='post-labels'><b:if cond='data:post.labels'><data:postLabelsLabel/><b:loop values='data:post.labels' var='label'><a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:label.isLast != &quot;true&quot;'>,</b:if></b:loop></b:if></div></b:includable>

<b:includable id='editar-entrada' var='post'><b:if cond='data:post.editUrl'><span expr:class='&quot;item-control &quot; + data:post.adminClass'><a expr:href='data:post.editUrl' expr:title='data:top.editPostMsg'> <img alt='' class='icon-action' height='18' src='http://img2.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/></a></span></b:if></b:includable>

<b:includable id="enlace-comentarios"><div class='jump-link'><b:if cond='data:blog.pageType != &quot;item&quot;'><b:if cond='data:blog.pageType != &quot;static_page&quot;'><b:if cond='data:post.allowComments'> <b:if cond='data:post.forceIframeComments'><span class='cmt_count_iframe_holder' expr:data-count='data:post.numComments' expr:data-onclick='data:post.addCommentOnclick' expr:data-url='data:post.canonicalUrl'></span><b:else/>
<b:if cond='data:post.commentSource == 1'><span class='cmt_count_iframe_holder' expr:data-count='data:post.numComments' expr:data-onclick='data:post.addCommentOnclick' expr:data-url='data:post.canonicalUrl'></span><b:else/><a class='comment-link' expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><data:post.commentLabelFull/></a></b:if></b:if></b:if></b:if></b:if></div></b:includable>

<b:includable id="cuerpo-entrada"><div class='post-body'><data:post.body/><div style='clear: both;'/></div></b:includable>

<b:includable id="resumen-entrada"><div class='post-body'><data:post.snippet/></div></b:includable>


<b:includable id="autor-entrada"><div class="post-author">Escrito por: <a expr:href='data:post.authorProfileUrl' rel='author' title='author profile'><data:post.author/></a></div></b:includable>

<b:includable id="leer-mas"><b:if cond='data:post.hasJumpLink'><div class='jump-link'><a expr:href='data:post.url + &quot;#more&quot;' expr:title='data:post.title'><data:post.jumpText/></a></div></b:if></b:includable>

<b:includable id='main' var='top'><div class='all-posts'><b:loop values='data:posts' var='post'><b:include data='post' name='post'/><b:if cond='data:blog.pageType == &quot;static_page&quot;'><b:include data='post' name='comment_picker'/></b:if><b:if cond='data:blog.pageType == &quot;item&quot;'><b:include data='post' name='comment_picker'/></b:if></b:loop></div></b:includable>

<b:includable id='mobile-main' var='top'><!--Vacío--></b:includable>
<b:includable id='mobile-nextprev'><!-- Vacío--></b:includable>
<b:includable id='mobile-index-post' var='post'><!-- Vacío--></b:includable>
<b:includable id='mobile-post' var='post'><!-- Vacío--></b:includable>
<b:includable id='shareButtons' var='post'><!--Vacío--></b:includable>



<b:includable id='threaded_comment_js' var='post'>
<script async='async' expr:src='data:post.commentSrc' type='text/javascript'/>

<script type='text/javascript'>
(function() {
var items = <data:post.commentJso/>;
var msgs = <data:post.commentMsgs/>;
var config = <data:post.commentConfig/>;

// <![CDATA[
var cursor = null;
if (items && items.length > 0) {
cursor = parseInt(items[items.length - 1].timestamp) + 1;
}

var bodyFromEntry = function(entry) {
if (entry.gd$extendedProperty) {
for (var k in entry.gd$extendedProperty) {
if (entry.gd$extendedProperty[k].name == 'blogger.contentRemoved') {
return '<span class="deleted-comment">' + entry.content.$t + '</span>';
}
}
}
return entry.content.$t;
}

var parse = function(data) {
cursor = null;
var comments = [];
if (data && data.feed && data.feed.entry) {
for (var i = 0, entry; entry = data.feed.entry[i]; i++) {
var comment = {};
// comment ID, parsed out of the original id format
var id = /blog-(\d+).post-(\d+)/.exec(entry.id.$t);
comment.id = id ? id[2] : null;
comment.body = bodyFromEntry(entry);
comment.timestamp = Date.parse(entry.published.$t) + '';
if (entry.author && entry.author.constructor === Array) {
var auth = entry.author[0];
if (auth) {
comment.author = {
name: (auth.name ? auth.name.$t : undefined),
profileUrl: (auth.uri ? auth.uri.$t : undefined),
avatarUrl: (auth.gd$image ? auth.gd$image.src : undefined)
};
}
}
if (entry.link) {
if (entry.link[2]) {
comment.link = comment.permalink = entry.link[2].href;
}
if (entry.link[3]) {
var pid = /.*comments\/default\/(\d+)\?.*/.exec(entry.link[3].href);
if (pid && pid[1]) {
comment.parentId = pid[1];
}
}
}
comment.deleteclass = 'item-control blog-admin';
if (entry.gd$extendedProperty) {
for (var k in entry.gd$extendedProperty) {
if (entry.gd$extendedProperty[k].name == 'blogger.itemClass') {
comment.deleteclass += ' ' + entry.gd$extendedProperty[k].value;
} else if (entry.gd$extendedProperty[k].name == 'blogger.displayTime') {
comment.displayTime = entry.gd$extendedProperty[k].value;
}
}
}
comments.push(comment);
}
}
return comments;
};

var paginator = function(callback) {
if (hasMore()) {
var url = config.feed + '?alt=json&v=2&orderby=published&reverse=false&max-results=50';
if (cursor) {
url += '&published-min=' + new Date(cursor).toISOString();
}
window.bloggercomments = function(data) {
var parsed = parse(data);
cursor = parsed.length < 50 ? null
: parseInt(parsed[parsed.length - 1].timestamp) + 1
callback(parsed);
window.bloggercomments = null;
}
url += '&callback=bloggercomments';
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
};
var hasMore = function() {
return !!cursor;
};
var getMeta = function(key, comment) {
if ('iswriter' == key) {
var matches = !!comment.author
&& comment.author.name == config.authorName
&& comment.author.profileUrl == config.authorUrl;
return matches ? 'true' : '';
} else if ('deletelink' == key) {
return config.baseUri + '/delete-comment.g?blogID='
+ config.blogId + '&postID=' + comment.id;
} else if ('deleteclass' == key) {
return comment.deleteclass;
}
return '';
};

var replybox = null;
var replyUrlParts = null;
var replyParent = undefined;

var onReply = function(commentId, domId) {
if (replybox == null) {
// lazily cache replybox, and adjust to suit this style:
replybox = document.getElementById('comment-editor');
if (replybox != null) {
replybox.height = '250px';
replybox.style.display = 'block';
replyUrlParts = replybox.src.split('#');
}
}
if (replybox && (commentId !== replyParent)) {
document.getElementById(domId).insertBefore(replybox, null);
replybox.src = replyUrlParts[0]
+ (commentId ? '&parentID=' + commentId : '')
+ '#' + replyUrlParts[1];
replyParent = commentId;
}
};

var hash = (window.location.hash || '#').substring(1);
var startThread, targetComment;
if (/^comment-form_/.test(hash)) {
startThread = hash.substring('comment-form_'.length);
} else if (/^c[0-9]+$/.test(hash)) {
targetComment = hash.substring(1);
}

// Configure commenting API:
var configJso = {
'maxDepth': config.maxThreadDepth
};
var provider = {
'id': config.postId,
'data': items,
'loadNext': paginator,
'hasMore': hasMore,
'getMeta': getMeta,
'onReply': onReply,
'rendered': true,
'initComment': targetComment,
'initReplyThread': startThread,
'config': configJso,
'messages': msgs
};

var render = function() {
if (window.goog && window.goog.comments) {
var holder = document.getElementById('comment-holder');
window.goog.comments.render(holder, provider);
}
};

// render now, or queue to render when library loads:
if (window.goog && window.goog.comments) {
render();
} else {
window.goog = window.goog || {};
window.goog.comments = window.goog.comments || {};
window.goog.comments.loadQueue = window.goog.comments.loadQueue || [];
window.goog.comments.loadQueue.push(render);
}
})();
// ]]>
</script>
</b:includable>



<b:includable id='commentDeleteIcon' var='comment'>
<span expr:class='&quot;item-control &quot; + data:comment.adminClass'>
<b:if cond='data:showCmtPopup'>
<div class='goog-toggle-button'>
<div class='goog-inline-block comment-action-icon'/>
</div>
<b:else/>
<a class='comment-delete' expr:href='data:comment.deleteUrl' expr:title='data:top.deleteCommentMsg'>
<img src='//www.blogger.com/img/icon_delete13.gif'/>
</a>
</b:if>
</span>
</b:includable>
<b:includable id='backlinkDeleteIcon' var='backlink'>
<span expr:class='&quot;item-control &quot; + data:backlink.adminClass'>
<a expr:href='data:backlink.deleteUrl' expr:title='data:top.deleteBacklinkMsg'>
<img src='//www.blogger.com/img/icon_delete13.gif'/>
</a>
</span>
</b:includable>
<b:includable id='comment_picker' var='post'>
<b:if cond='data:post.forceIframeComments'>
<b:include data='post' name='iframe_comments'/>
<b:if cond='data:post.showThreadedComments'>
<b:include data='post' name='threaded_comments'/>
<b:else/>
<b:include data='post' name='comments'/>
</b:if>
<b:else/>
<b:if cond='data:post.commentSource == 1'>
<b:include data='post' name='iframe_comments'/>
<b:else/>
<b:if cond='data:post.showThreadedComments'>
<b:include data='post' name='threaded_comments'/>
<b:else/>
<b:include data='post' name='comments'/>
</b:if>
</b:if>
</b:if>
</b:includable>



<b:includable id='comment_count_picker' var='post'></b:includable>
<b:includable id='comments' var='post'>
<div class='comments' id='comments'>
<a name='comments'/>
<b:if cond='data:post.allowComments'>
<h4><data:post.commentLabelFull/>:</h4>

<b:if cond='data:post.commentPagingRequired'>
<span class='paging-control-container'>
<b:if cond='data:post.hasOlderLinks'>
<a expr:class='data:post.oldLinkClass' expr:href='data:post.oldestLinkUrl'><data:post.oldestLinkText/></a>
&#160;
<a expr:class='data:post.oldLinkClass' expr:href='data:post.olderLinkUrl'><data:post.olderLinkText/></a>
&#160;
</b:if>

<data:post.commentRangeText/>

<b:if cond='data:post.hasNewerLinks'>
&#160;
<a expr:class='data:post.newLinkClass' expr:href='data:post.newerLinkUrl'><data:post.newerLinkText/></a>
&#160;
<a expr:class='data:post.newLinkClass' expr:href='data:post.newestLinkUrl'><data:post.newestLinkText/></a>
</b:if>
</span>
</b:if>

<div expr:id='data:widget.instanceId + &quot;_comments-block-wrapper&quot;'>
<dl expr:class='data:post.avatarIndentClass' id='comments-block'>
<b:loop values='data:post.comments' var='comment'>
<dt expr:class='&quot;comment-author &quot; + data:comment.authorClass' expr:id='data:comment.anchorName'>
<b:if cond='data:comment.favicon'>
<img expr:src='data:comment.favicon' height='16px' style='margin-bottom:-2px;' width='16px'/>
</b:if>
<a expr:name='data:comment.anchorName'/>
<b:if cond='data:blog.enabledCommentProfileImages'>
<data:comment.authorAvatarImage/>
</b:if>
<b:if cond='data:comment.authorUrl'>
<a expr:href='data:comment.authorUrl' rel='nofollow'><data:comment.author/></a>
<b:else/>
<data:comment.author/>
</b:if>
<data:commentPostedByMsg/>
</dt>
<dd class='comment-body' expr:id='data:widget.instanceId + data:comment.cmtBodyIdPostfix'>
<b:if cond='data:comment.isDeleted'>
<span class='deleted-comment'><data:comment.body/></span>
<b:else/>
<p>
<data:comment.body/>
</p>
</b:if>
</dd>
<dd class='comment-footer'>
<span class='comment-timestamp'>
<a expr:href='data:comment.url' title='comment permalink'>
<data:comment.timestamp/>
</a>
<b:include data='comment' name='commentDeleteIcon'/>
</span>
</dd>
</b:loop>
</dl>
</div>

<b:if cond='data:post.commentPagingRequired'>
<span class='paging-control-container'>
<a expr:class='data:post.oldLinkClass' expr:href='data:post.oldestLinkUrl'>
<data:post.oldestLinkText/>
</a>
<a expr:class='data:post.oldLinkClass' expr:href='data:post.olderLinkUrl'>
<data:post.olderLinkText/>
</a>
&#160;
<data:post.commentRangeText/>
&#160;
<a expr:class='data:post.newLinkClass' expr:href='data:post.newerLinkUrl'>
<data:post.newerLinkText/>
</a>
<a expr:class='data:post.newLinkClass' expr:href='data:post.newestLinkUrl'>
<data:post.newestLinkText/>
</a>
</span>
</b:if>

<p class='comment-footer'>
<b:if cond='data:post.embedCommentForm'>
<b:if cond='data:post.allowNewComments'>
<b:include data='post' name='comment-form'/>
<b:else/>
<data:post.noNewCommentsText/>
</b:if>
<b:else/>
<b:if cond='data:post.allowComments'>
<a expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><data:postCommentMsg/></a>
</b:if>
</b:if>

</p>
</b:if>
<b:if cond='data:showCmtPopup'>
<div id='comment-popup'>
<iframe allowtransparency='true' frameborder='0' id='comment-actions' name='comment-actions' scrolling='no'>
</iframe>
</div>
</b:if>

<div id='backlinks-container'>
<div expr:id='data:widget.instanceId + &quot;_backlinks-container&quot;'>
<b:if cond='data:post.showBacklinks'>
<b:include data='post' name='backlinks'/>
</b:if>
</div>
</div>
</div>
</b:includable>
<b:includable id='comment-form' var='post'>
<div class='comment-form'>
<a name='comment-form'/>
<b:if cond='data:mobile'>
<h4 id='comment-post-message'>
<a expr:id='data:widget.instanceId + &quot;_comment-editor-toggle-link&quot;' href='javascript:void(0)'><data:postCommentMsg/></a></h4>
<p><data:blogCommentMessage/></p>
<data:blogTeamBlogMessage/>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize blogger-comment-from-post' frameborder='0' height='410' id='comment-editor' name='comment-editor' src='' style='display: none' width='100%'/>
<b:else/>
<h4 id='comment-post-message'><data:postCommentMsg/></h4>
<p><data:blogCommentMessage/></p>
<data:blogTeamBlogMessage/>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize blogger-comment-from-post' frameborder='0' height='410' id='comment-editor' name='comment-editor' src='' width='100%'/>
</b:if>
<data:post.friendConnectJs/>
<data:post.cmtfpIframe/>
<script type='text/javascript'>
BLOG_CMT_createIframe(&#39;<data:post.appRpcRelayPath/>&#39;, &#39;<data:post.communityId/>&#39;);
</script>
</div>
</b:includable>
<b:includable id='backlinks' var='post'>
<a name='links'/><h4><data:post.backlinksLabel/></h4>
<b:if cond='data:post.numBacklinks != 0'>
<dl class='comments-block' id='comments-block'>
<b:loop values='data:post.backlinks' var='backlink'>
<div class='collapsed-backlink backlink-control'>
<dt class='comment-title'>
<span class='backlink-toggle-zippy'>&#160;</span>
<a expr:href='data:backlink.url' rel='nofollow'><data:backlink.title/></a>
<b:include data='backlink' name='backlinkDeleteIcon'/>
</dt>
<dd class='comment-body collapseable'>
<data:backlink.snippet/>
</dd>
<dd class='comment-footer collapseable'>
<span class='comment-author'><data:post.authorLabel/> <data:backlink.author/></span>
<span class='comment-timestamp'><data:post.timestampLabel/> <data:backlink.timestamp/></span>
</dd>
</div>
</b:loop>
</dl>
</b:if>
<p class='comment-footer'>
<a class='comment-link' expr:href='data:post.createLinkUrl' expr:id='data:widget.instanceId + &quot;_backlinks-create-link&quot;' target='_blank'><data:post.createLinkLabel/></a>
</p>
</b:includable>

<b:includable id='threaded_comments' var='post'>
<div class='comments' id='comments'>
<a name='comments'/>
<h4><data:post.commentLabelFull/>:</h4>

<div class='comments-content'>
<b:if cond='data:post.embedCommentForm'>
<b:include data='post' name='threaded_comment_js'/>
</b:if>
<div id='comment-holder'>
<data:post.commentHtml/>
</div>
</div>

<p class='comment-footer'>
<b:if cond='data:post.allowNewComments'>
<b:include data='post' name='threaded-comment-form'/>
<b:else/>
<data:post.noNewCommentsText/>
</b:if>
</p>

<b:if cond='data:showCmtPopup'>
<div id='comment-popup'>
<iframe allowtransparency='true' frameborder='0' id='comment-actions' name='comment-actions' scrolling='no'>
</iframe>
</div>
</b:if>

<div id='backlinks-container'>
<div expr:id='data:widget.instanceId + &quot;_backlinks-container&quot;'>
<b:if cond='data:post.showBacklinks'>
<b:include data='post' name='backlinks'/>
</b:if>
</div>
</div>
</div>
</b:includable>
<b:includable id='threaded-comment-form' var='post'>
<div class='comment-form'>
<a name='comment-form'/>
<p><data:blogCommentMessage/></p>
<data:blogTeamBlogMessage/>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize blogger-comment-from-post' frameborder='0' height='410' id='comment-editor' name='comment-editor' src='' width='100%'/>
<data:post.friendConnectJs/>
<data:post.cmtfpIframe/>
<script type='text/javascript'>
BLOG_CMT_createIframe(&#39;<data:post.appRpcRelayPath/>&#39;, &#39;<data:post.communityId/>&#39;);
</script>
</div>
</b:includable>


<b:includable id='iframe_comments' var='post'><b:if cond='data:post.allowIframeComments'><script expr:src='data:post.iframeCommentSrc' type='text/javascript'/><div class='cmt_iframe_holder' expr:data-href='data:post.canonicalUrl' expr:data-viewtype='data:post.viewType'/><b:if cond='data:post.embedCommentForm == &quot;false&quot;'><a expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><data:postCommentMsg/></a></b:if></b:if></b:includable>
</b:widget>

Previsualizas los cambios y verás que hay sólo unas palabras en donde debería ir cada entrada, si efectivamente consigues este resultado puedes guardar tu plantilla.

Paso 2: Reestructura las entradas de tu blog como gustes:

Lo primero que necesitas es ubicar el siguiente código:

<div class='post'>

<b:if cond='data:blog.pageType == "index"'>
// Acá deberás pegar los códigos de los items que desees mostrar en las entradas del índice.
<b:else/>
// Esto se verá en entradas y páginas estáticas.
</b:if>


</div>

Si te fijas, hay una condicional que nos permite modificar las entradas de manera distintas tanto para el índice como para las entradas. Lo que haremos ahora será añadir todos los elementos que lleva una entrada, como título, cuerpo del artículo, etiquetas, etc. Observa un ejemplo:
<div class='post'>

<b:if cond='data:blog.pageType == "index"'> <!-- EN EL ÍNDICE -->
   <b:include name="titulos-entradas" />
   <b:include name="resumen-entrada" />
   <b:include name="leer-mas" />
   <b:include name="enlace-comentarios" />
   <b:include name="imagen-miniatura" />
<b:else/> <!-- DENTRO DE ENTRADAS Y PÁGINAS -->
   <b:include name="titulos-entradas" />
   <b:include name="cuerpo-entrada" />
   <b:include name="etiquetas-post" />
   <b:include name="autor-entrada" />
   <b:include name="fecha-entrada" />
</b:if>

</div>

Cada elemento <b:include> posee un atributo name el cual lo define como tal. Puedes probar con todos estos:
  • <b:include data='top' name='mensaje-estado'/> (Es el mensaje Mostrando entradas con X etiqueta)
  • <b:include name="autor-entrada" /> (Nombre del autor de la entrada)
  • <b:include name="leer-mas" /> (Inserta el Leer Más)
  • <b:include name="resumen-entrada" /> (Añade un breve sumario de la entrada)
  • <b:include name="cuerpo-entrada" /> (Inserta todo el contenido de la entrada)
  • <b:include name="enlace-comentarios" /> (Muestra el número de comentarios con su enlace)
  • <b:include name="editar-entrada" /> (El quickedit para modificar los posts rápidamente - Puede no funcionar)
  • <b:include name="etiquetas-post" /> (Inserta las etiquetas de la entrada)
  • <b:include name="fecha-entrada" /> (Muestra la fecha de publicación)
  • <b:include name="titulos-entradas" /> (Inserta el título de la entrada)
  • <b:include name="navegacion" /> (Entradas anteriores, Inicio, Entradas Recientes)
  • <b:include name="imagen-miniatura" /> (Imagen en miniatura en 72px)
  • <b:include name="primera-imagen" /> (Primera imagen del post, en tamaño original)

Mensaje del autor: Lamento la ausencia y la falta de atención, dentro de unos cuantos días todo volverá a la normalidad.

Atte. Víctor Calderón

Ultimos comentarios con avatares

Una variante para mostrar los últimos comentarios nos permitiría agregar la imagen con el avatar de cada comentarista.

Siguiendo el mismo criterio del script que se muestra en esta entrada y que no no hace otra cosa que leer los feeds utilizando Json, nos encontramos con que Blogger nos envía un dato que identifica al autor: entry.author y, un dato que es un array que leemos mediante entry.author[0]

Allí, se guardan cuatro valores:

entry.author[0].email.$t no nos sirve para nada ya que siempre dice "noreply@blogger.com"
entry.author[0].name.$t es el nombre del comentarista
entry.author[0].uri.$t es la dirección url del perfil
entry.author[0].gd$image son los datos de la imagen que se estableció en el perfil de Blogger

Esta última tiene un dato que es el importante:

entry.author[0].gd$image.src es la dirección url de la imagen agregada al perfil

y otros que no tienen uso práctico:

entry.author[0].gd$image.rel
entry.author[0].gd$image.width
entry.author[0].gd$image.height

Esto, quiere decir que podemos acceder a esa imagen y mostrarla siempre que exista aunque hay una serie de detalles a tener en cuenta.

Primero, el tamaño de la imagen. Lo que allí se guarda es la imagen original que hayamos utilizado y puede tener diversos tamaños (hay algunas enormes) por lo tanto, deberíamos tratar de usar una miniatura y así, agilizar la carga. Si la imagen está alojada en Blogger como la mayoría de ellas, esto se resuelve con cierta facilidad cambiando la url ya que el servicio nos provee de miniaturas diversas; si la imagen ha sido alojada en otro servidor, no tenemos otro remedio que cargar la original y re-dimensionarla con CSS.

El segundo problema lo generan los perfiles que no tienen una imagen o estas no son accesibles; en ese caso, también usaremos CSS para colocar una por defecto.

El script sería algo así y debería estar agregado antes de </head>:
<script type='text/javascript'>//<![CDATA[

var comsA_cantidad = 10; // definimos la cantidad de comentarios a ser mostrados
var comsA_longitud = 60; // definimos la longitud máxima de esos comentarios
var comsA_dimension = "/s16-c/"; // y establecemos el tamaño de esos avatares (en este caso 16x16)

var comsA_pattern1 = /\/s\d*\//;
var comsA_pattern2 = /\/s\d*-c\//;

function showrecentcomments_avatar(json) {
var entry, comulr, comcontent, comavatar, profile_img, elancho, salida;

// el bucle que leerá los comentarios
for (var i=0; i < comsA_cantidad; i++) {
entry = json.feed.entry[i]; // leo y guardo el dato
if (i==json.feed.entry.length)break; // si no hay suficientes, termino

// busco la dirección URL de comentarios
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == 'alternate') {
comulr=entry.link[k].href;
break;
}
}

// busco el comentario en si mismo
if ("content" in entry){
comcontent = entry.content.$t;
} else if("summary" in entry) {
comcontent = entry.summary.$t;
} else {
comcontent = "";
}
// lo transformo en texto puro y si es necesario, lo corto para que no supere el largo máximo
var re=/<\S[^>]*>/g;
comcontent=comcontent.replace(re,"");
if (comcontent.length>comsA_longitud) {
comcontent = comcontent.substring(0,comsA_longitud) + " &#133;";
}

// esta es la parte nueva, que define la imagen del avatar a utilizar
var profile_img = entry.author[0].gd$image.src; // la imagen del perfil de Blogger

// hay algunas imágenes alojadas en googleusercontent.com que no tienen el protocolo http asi que se lo agregamos
if (!/^http:/.test(profile_img)) {
profile_img = "http:" + profile_img;
}

// buscamos /sxxx/ o /sxxx-c/ en la url de la imagen que indica su tamaño
elancho = profile_img.match(comsA_pattern1) || profile_img.match(comsA_pattern2);
// y si encontramos eso, lo cambiamos por /s16-c/ que es lo que definí previamente
comavatar = profile_img.replace(elancho, comsA_dimension);

// listo, como ya tengo todos los datos, armo el HTML a mostrar
salida = "<li>";
salida += "<img src='"+comavatar+"' />";
salida += "<span>" + entry.author[0].name.$t + "</span>";
salida += "<a target='_blank' rel='nofollow' href='" + comulr + "'>" + comcontent +"</a>";
salida += "</li>";

// y finalmente, lo escribo
document.write(salida );
}
}

//]]>
</script>
¿Cómo uso esto? Agrego un elemento HTML donde quiera mostrarlo (la sidebar, por ejemplo) y allí, coloco la lista y la función donde sólo debo establecer la url de mi blog:
<ul id="ultimosComentariosAvatar">
<script src="http://nombreblog.blogspot.com/feeds/comments/default?alt=json-in-script&callback=showrecentcomments_avatar"></script>
</ul>
El resto es cosa de CSS:
#ultimosComentariosAvatar { /* este el rectángulo contenedor (la etiqueta UL) */
list-style-type:none;
}
#ultimosComentariosAvatar li { /* cada item de la lista */
/* voy a usar una imagen por defecto como fondo por si el perfil no tiene una */
background: transparent url(http://img2.blogblog.com/img/b16-rounded.gif) no-repeat left 5px;
border-bottom: 1px dotted #234;
font-family: Tahoma;
font-size: 12px;
padding: 5px 0 5px 20px;
position: relative;
}
#ultimosComentariosAvatar li span { /* el nombre del autor */
color: #BCD;
font-weight: bold;
padding-left: 5px;
}
#ultimosComentariosAvatar li:hover {background-color: #171E27;}

/* el contendio es un enlace al comentario en si mismo */
#ultimosComentariosAvatar a, #ultimosComentariosAvatar a:link, #ultimosComentariosAvatar a:visited {
color: #BBB;
display: block;
font-weight: normal;
padding-left: 5px;
}

/* la imagen la posiciono para tapar el fondo por defecto y la fuerzo a dimensionarse */
#ultimosComentariosAvatar li img {
height: 16px;
left: 0;
position: absolute;
top: 5px;
width: 16px;
}