PinIt-button

A cli­ent of mine wan­ted to add PinIt sup­port for parts of their web site, main­ly their user com­mu­ni­ty image gal­le­ri­es.

I made a quick solu­tion for them, copi­ed here in case some­o­ne else needs somet­hing simi­la­re, or just wants to com­plain about my pro­gram­ming tech­ni­ques 🙂 Or pre­fe­rably make sug­ges­tions for impro­ve­ments…

To use it, regis­ter the name­spa­ce in eit­her your web.config, in /configuration/system.web/pages/controls:

<add tagPrefix="Controls" namespace="Paddy.Web.UI.HtmlControls" assembly="name-of-you-dll-file" />

Or, you can regis­ter it at the top of your .aspx file, as follows:

<%@Register TagPrefix="Controls" Namespace="Paddy.Web.UI.HtmlControls" %>

Then use it on the page like this:

<Controls:PinIt ID="ctlPinIt" runat="server" CountLayout="Horizontal" Url="Complete url" Media="Complete url to the image" Description="Optional description" />

Ple­a­se note that the con­tents of the Url and Media pro­per­ti­es needs to be ful­ly qua­li­fi­ed!

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;

namespace Paddy.Web.UI.HtmlControls
{
	public class PinIt : HtmlControl
	{
		private const string PinItscriptinclude = "PinItScriptInclude";

		#region Properties

		public CountLayouts CountLayout { get; set; }
		public string Description { get; set; }
		public string Url { get; set; }
		public string Media { get; set; }

		#endregion

		public PinIt()
			: base("a")
		{
			CountLayout = CountLayouts.Horizontal;
		}

		protected override void Render(HtmlTextWriter writer)
		{
			if (string.IsNullOrWhiteSpace(Url) || string.IsNullOrWhiteSpace(Media))
			{
				return;
			}

			// Register the Pinterest script
			var type = GetType();
			if (!Page.ClientScript.IsStartupScriptRegistered(type, PinItscriptinclude))
			{
				Page.ClientScript.RegisterStartupScript(type, PinItscriptinclude,
					@"<script type=""text/javascript"" src=""//assets.pinterest.com/js/pinit.js""></script>", false);
			}

			// Build the tag.
			writer.WriteBeginTag(base.TagName);
			RenderAttributes(writer);
			writer.Write(HtmlTextWriter.TagRightChar);

			// Render the image
			writer.WriteBeginTag("img");
			writer.WriteAttribute("src", "//assets.pinterest.com/images/PinExt.png");
			writer.WriteAttribute("alt", "Pin it");
			writer.WriteAttribute("title", "Pin it");
			writer.WriteAttribute("border", "0");
			writer.Write(HtmlTextWriter.SelfClosingTagEnd);

			writer.WriteEndTag(base.TagName);
		}

		protected override void RenderAttributes(HtmlTextWriter writer)
		{
			var parameters = new Dictionary<string, string> { { "url", Url }, { "media", Media } };
			if (!string.IsNullOrWhiteSpace(Description))
			{
				parameters.Add("description", Description);
			}

			Attributes.Add("href", "http://pinterest.com/pin/create/button/" + ToQueryString(parameters));
			Attributes.Add("class", "pin-it-button");
			Attributes.Add("count-layout", CountLayout.ToString().ToLower());

			base.RenderAttributes(writer);
		}

		private static string ToQueryString(IEnumerable<KeyValuePair<string, string>> dictionary)
		{
			var result = dictionary.Aggregate(
				new StringBuilder("?"),
				(builder, pair) => builder.AppendFormat("{0}={1}&", pair.Key, HttpUtility.UrlEncode(pair.Value)),
				builder => builder.ToString());

			return result.Substring(0, result.Length - 1);
		}

		public enum CountLayouts
		{
			Horizontal,
			None,
			Vertical
		}
	}
}

Adventskalender, dag ett

Jag råka­de näm­na på Face­Book att jag hade kära min­nen av adventska­len­dern från när jag var liten. Min mam­ma såg det natur­ligt­vis och har, snäll som hon är, gjort en advents­­ka­­len­der till mig i år! Jag är lyck­lig! Och det pig­gar upp en hel i höst­rus­ket och mörk­ret.

Dagens pre­sent: en badan­ka som blin­kar i oli­ka fär­ger när den ham­nar i vat­ten.

Tack, Mam­ma! 🙂

Gågata, gårdsgata eller gångfartsområde?

OK, jag erkän­ner – jag har ald­rig rik­tigt vetat skill­na­den mel­lan en gåga­ta och en gårds­ga­ta. Jag har all­tid utgått från att båda inne­bär att man inte får köra snab­ba­re än vad en genom­snitt­lig per­son går, och bara köra där om man skall till (eller från) en fas­tig­het inom områ­det. Jag har ald­rig rik­tigt fat­tat vad som skilj­de en gåga­ta från en gårds­ga­ta.

Myn­dig­he­ter­na gjor­de det lät­ta­re (och svå­ra­re) för oss för någ­ra år sen, genom att infö­ra ytter­li­ga­re ett begrepp – gång­farts­om­rå­de. Man slu­ta­de använ­da gårds­ga­ta på nya gator, och bör­ja­de använ­da begrep­pet ”gång­farts­om­rå­de” istäl­let, sam­ti­digt som man behöll gårds­ga­tor­na.

För att veta skill­na­den mel­lan dem är det enkla­re om du går till Wikipedia-sidan om gång­farts­om­rå­de.

Stegräknarerfarenheter

Igår bör­ja­de jag använ­da en stegräk­na­re (igen — för­ra året var vi på jobb med i en stegräk­nar­täv­ling som anord­na­des här i Mal­mö (eller det var kanske Skå­ne, jag minns inte rik­tigt).

Jag glöm­de stegräk­na­ren på kon­to­ret i förr­går, så jag kun­de inte bör­ja använ­da den igen för­rän jag kom till­ba­ka till kon­to­ret igår.

Till min besvi­kel­se såg jag när jag kom hem att jag bara gått 1 594 steg. ”WTF!” tänk­te jag. 2,5 km till jobb, gå runt lite på kon­to­ret och på lun­chen, och 2,5 km hem igen. Det mås­te gå mer än 500 steg per 2,5 km!

Idag fäs­te jag stegräk­na­ren på annat sätt (i bäl­tet istäl­let för byx­fic­kans över­kant) och när jag kom till kon­to­ret idag så hade den räk­nat upp näs­tan 2 800 steg! Suc­cess!

Nu skall jag föra lite sta­tistik över hur myc­ket jag går de när­mas­te dagar­na, och i näs­ta vec­ka blir det att sät­ta mål för hur myc­ket mer jag bor­de gå var­je dag.