<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Thoughts From Eric</title>
	<atom:link href="http://meyerweb.com/eric/thoughts/rss2/summary?&#038;feed=rss2&#038;scope=" rel="self" type="application/rss+xml" />
	<link>http://meyerweb.com</link>
	<description>Things that Eric A. Meyer, CSS expert, writes about on his personal Web site; it's largely Web standards and Web technology, but also various bits of culture, politics, personal observations, and other miscellaneous stuff</description>
	<pubDate>Sun, 22 Jun 2008 15:51:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Welcome</title>
		<link>http://meyerweb.com/eric/thoughts/2008/06/18/welcome-2/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/06/18/welcome-2/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 19:05:56 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Rebecca]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=916</guid>
		<description><![CDATA[Earlier this week, we welcomed Rebecca Alison Meyer into our home and our hearts.]]></description>
			<content:encoded><![CDATA[<p>
Kat and I are now doubly parents.  Earlier this week, we welcomed Rebecca Alison Meyer into our home and our hearts.
</p>
<p>
We chose Rebecca in honor of Kat&#8217;s late grandmother, a grand old lady of enormous <i>chutzpah</i> who taught Kat her near-legendary bargaining skills.  The middle name, Alison, honors Kat&#8217;s mother, who we&#8217;re grateful has lived long enough to receive the honor.
</p>
<p>
I&#8217;m behind on posting this because not only do we have a newborn to handle, but there&#8217;s also Carolyn to consider.  Carolyn is an amazing big sister and more than eager to help us, but she has a schedule to keep and needs help with some things, as all children do.  That makes free time almost totally nonexistent, which means time to write posts is similarly at a premium.
</p>
<p>
As we gradually settle into a routine, I expect to get back to the things I had cooking, but for now it&#8217;s pretty much all in abeyance while I concentrate on our newly enriched family.
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/06/18/welcome-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linking Up</title>
		<link>http://meyerweb.com/eric/thoughts/2008/06/12/linking-up/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/06/12/linking-up/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 19:37:10 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[(X)HTML]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=914</guid>
		<description><![CDATA[The <a href="http://meyerweb.com/eric/html-xhtml/html5-linking.html">"<code>href</code> everywhere" document</a> (which is officially titled "HTML5: More Flexibile Linking") has been updated, so kindly give it another look and challenge my assertions, use cases (or lack thereof), and any weak points.]]></description>
			<content:encoded><![CDATA[<p>
The <a href="http://meyerweb.com/eric/html-xhtml/html5-linking.html">&#8220;<code>href</code> everywhere&#8221; document</a> (which is officially titled &#8220;HTML5: More Flexibile Linking&#8221;) has been updated, so kindly give it another look and challenge my assertions, use cases (or lack thereof), and any weak points.  Unless you consider the whole idea of extending linkability to be a weak point, in which case, never mind.  You may or may not be right, but attacking the whole premise isn&#8217;t going to get much traction.  I&#8217;m convinced the general idea is a good one.  Now it&#8217;s up to me to make the best case for it and convince implementors that I&#8217;m right.
</p>
<p>
Thanks to comments on <a href="http://meyerweb.com/eric/thoughts/2008/06/05/strengthening-links/">the previous post in the series</a>, a few elements were added to the list of those which have plausible use cases, and I added some documentation of the elements that either aren&#8217;t on the list or don&#8217;t need to be on it at the end.  Eventually, the &#8220;Possible Additions&#8221; section will disappear entirely, and at that point I&#8217;ll be ready to submit it for consideration to the Working Group.
</p>
<p>
There are a few outstanding questions raised by commenters on the previous post:
</p>

<ol>
<li>
<p>Is there a reasonable case for linking any of <code>ul</code>, <code>ol</code>, or <code>dl</code>?  In cases where they represent quotations of other documents, they&#8217;re be wrapped in a <code>blockquote</code> anyway, and I&#8217;ve already got a use case for that one.  Linking <code>li</code> makes sense, but the whole list?  There are also questions about <code>dd</code>&#8212;would it make sense to allow linking to the paired <code>dd</code>?&#8212;but I don&#8217;t see a use case for <code>dd</code>.  The whole point there is it&#8217;s supposed to be the definition, not a shortened reference to a longer definition.
</p>
</li>
<li>
<p>I was persuaded of the utility of linking <code>video</code>, my previous uncertainty having been based in a misunderstanding of how click-this-video worked now, but what about <code>audio</code>?  I haven&#8217;t noticed it being common to link embedded audio clips to other sources, but maybe I&#8217;m missing something.</p>
</li>
<li>
<p>Can a table have multiple <code>thead</code>, <code>tbody</code>, or <code>tfoot</code> elements?  If so, linking them starts to make more sense.  I only wish I could find the part of the HTML5 draft that answers this one way or the other. In a like vein, I can&#8217;t decide if it makes more sense to add linking to <code>caption</code> or <code>table</code>.  I&#8217;m kind of tending toward the former.  Anyone have good arguments either way?</p>
</li>
<li>
<p>Should <code>embed</code> and <code>object</code> have direct linking, or is that better handled with already-extant markup patterns?  (If so, using <code>param</code>, I would imagine.)</p>
</li>
<li>
<p>Is there a reason to link a whole <code>pre</code> to some other resource, <em>other than</em> linking part of a program to a codebase?  Because in those cases, I&#8217;d probably use the <code>&lt;pre&gt;&lt;code&gt;...&lt;/code&gt;&lt;/pre&gt;</code> pattern, and link the <code>code</code> element.  <code>pre</code> is a presentational element, really, and you&#8217;ll note that I haven&#8217;t proposed adding linking to just about any of the presentation elements, <code>sup</code> and <code>sub</code> being the exceptions.</p>
</li>
<li>
<p>There&#8217;s a list of &#8220;(Possibly) Unsuitable Elements&#8221; near the end of the document that might bear some review in case I&#8217;m missing some obvious use cases.  Obvious to someone other than me, I mean.</p>
</li>
</ol>

<p>
Let me know what you think!  I&#8217;m definitely moving forward with this, as I&#8217;ve received encouragement from a member of the HTML WG,  but I&#8217;d like the proposal to be as solid as possible before I do so.  Thanks for everyone&#8217;s help!
</p>

]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/06/12/linking-up/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Excerpts Exacted; Shielding the Admin</title>
		<link>http://meyerweb.com/eric/thoughts/2008/06/12/excerpts-exacted-shielding-the-admin/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/06/12/excerpts-exacted-shielding-the-admin/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 13:43:51 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Tools]]></category>

		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=911</guid>
		<description><![CDATA[The excerpt-exacting plugin I requested has been created and released!  Also, a request for help with a plugin I've written but would like very much to improve.]]></description>
			<content:encoded><![CDATA[<p>
In response to <a href="http://meyerweb.com/eric/thoughts/2008/06/10/wanted-excerpt-exacter/">my request</a>, the indomitable <a href="http://hamstu.com/">Hamish Macpherson</a> has created <a href="http://hamstu.com/uploads/NeverForgetcerpt.zip">NeverForgetcerpt</a>, a plugin for WordPress 2.5+ that will warn you if you&#8217;re about to publish a post that lacks an excerpt.  I&#8217;m already using it on meyerweb and it&#8217;s working like a charm.  He&#8217;s also expressed interest in the idea of a plugin that does that and also warns you if you forgot to add tags or categories, so stay tuned.  Meantime, all hail Hamish!
</p>
<p>
I have another plugin request, but in this case I&#8217;m looking for help in modifying something I&#8217;ve already done.  Or half-done, maybe.
</p>
<p>
I don&#8217;t know about you, but I get a <strong>lot</strong> of comment spam.  As I type this sentence, <a href="http://akismet.com/">Akismet</a> has stopped 837,806 spam attempts in total.  A false positive makes it past Akismet and my other defenses to land in the moderation queue about once every four days, on average.
</p>
<p>
Some of those false positives are really, really, <em>really</em> easy to spot, and they get marked as spam in order to help improve the recognition algorithms.  Others are hard to evaluate just by looking at the comment.  Many are trackbacks from sites in langauges I can&#8217;t read, and others that I can read look legit enough.  In such cases, I usually go visit the author&#8217;s URL to see if it looks spammy or not.
</p>
<p>
Now, the way I used to do this was to right-click on the blog link, copy the URL of the target, open a new browser tab, and paste the URL into the address bar.  Why?  To prevent my WP admin URL from landing in the referer logs of a potentially unscrupulous site owner.  But sometimes I forget to do all that, and just click.  I figured, well, why not stop fighting the tendency to just click and write a plugin that routes all outbound links through a redirect service?
</p>
<p>
So I did.  You can <a href="http://meyerweb.com/eric/tools/wordpress/mw_url_obscurify.php.zip">grab it for yourself</a> if you want, but if you do, understand that it&#8217;s pretty clunky right now.  Which is the part I&#8217;d like help fixing.
</p>
<p>
The heart of the plugin is simplicity itself:
</p>

<pre>
if (is_admin_page()) {
	add_filter('get_comment_author_url','_mw_obscurify',5);
}

function _mw_obscurify($url) {
	if ($url) return 'http://google.com/url?q=' . $url;
}
</pre>

<p>
There&#8217;s a little more to it than that (specifically, the routine <code>is_admin_page()</code>, which I got from someone else&#8217;s plugin and wish now I could remember whose it was) but that&#8217;s the core.  So any time the URL of a comment author is fetched, it&#8217;s prepended to turn it into a Google redirect.
</p>
<p>
That&#8217;s true for both <code>href</code> values and displayed URLs, though, which is the clunky part.  The end result is that on comments from the aforementioned mighty Hamish, for example, I get the following markup on the &#8220;Comments&#8221; page:
</p>

<pre>
&lt;a href="http://google.com/url?q=http://hamstu.com"&gt;
http://google.com/url?q=http://hamstu.com&lt;/a&gt;
</pre>

<p>
What I&#8217;d very much prefer is:
</p>

<pre>
&lt;a href="http://google.com/url?q=http://hamstu.com"&gt;
http://hamstu.com&lt;/a&gt;
</pre>

<p>
Or even:
</p>

<pre>
&lt;a href="http://google.com/url?q=http://hamstu.com"&gt;
hamstu.com&lt;/a&gt;
</pre>

<p>
So what I&#8217;d like to know is if there&#8217;s any way to make that happen short of rewriting and replacing <code>get_comment_author_url</code>, which I&#8217;d prefer not to do since it could change in future versions of WordPress and I&#8217;m not particularly interested in turning a basic plugin into a continuing maintenance headache.  I mean, I will if absolutely necessary, but I&#8217;d like to find a better way if there is one.  Thus the request for help.
</p>
<p>
Also, are there better redirect strategies than using Google the way I have?  It&#8217;s very slightly annoying that I have to click through the Google redirect page, and though I absolutely understand why they do that, I&#8217;d love to find an automatic redirect that wouldn&#8217;t expose my referer to the target site.  Anyone know of one, or have a related sharp idea?
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/06/12/excerpts-exacted-shielding-the-admin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Wanted: Excerpt Exacter</title>
		<link>http://meyerweb.com/eric/thoughts/2008/06/10/wanted-excerpt-exacter/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/06/10/wanted-excerpt-exacter/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 02:23:01 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Tools]]></category>

		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=910</guid>
		<description><![CDATA[I keep forgetting to write excerpts for my posts, so I'm looking for someone to write a WordPress plugin that watches my back.]]></description>
			<content:encoded><![CDATA[<p>
So after I once again published <a href="http://meyerweb.com/eric/thoughts/2008/06/10/caught-in-the-camera-eye/">a post</a> without filling in the excerpt, thus forcing me to go back to fill it in later, I <a href="http://twitter.com/meyerweb/statuses/831561584">tweeted</a> in a fit of pique:
</p>

<blockquote cite="http://twitter.com/meyerweb/statuses/831561584">
<p>
I need a WordPress plugin that won&#8217;t let me publish a post until I&#8217;ve filled in the excerpt field. Anyone got one?
</p>
</blockquote>

<p>
To which I got a whole lot of responses saying, in effect, &#8220;Oooo!  Good idea!  I need that too!  Let me know when you find one!&#8221;  Some of them came from people running fairly high-profile blogs.  The need clearly exists.  A couple of responses were of the &#8220;I could do that!&#8221; variety, so I thought I&#8217;d post here so as to describe how I think it ought to work from the user&#8217;s perspective, and then we can hash things out in comments and someone can code it up and make everyone happy.
</p>
<p>
So really what I want is, when I push the &#8220;Publish&#8221; button in WordPress, the plugin checks to see if there&#8217;s an excerpt.  If not, one of two things happens:
</p>

<ol>
<li><p>The plugin throws up a warning dialog telling me that I&#8217;m about to post without an excerpt (<em>again</em>).  If I say &#8220;Okay&#8221;, it goes ahead with publishing.  If I say &#8220;Cancel&#8221;, it returns me right back to where I was, which is the &#8220;Write Post&#8221; page, with all the data intact and unaltered.</p></li>
<li><p>The plugin returns me to the &#8220;Write Post&#8221; page with all data intact and unaltered, and puts an error box at the top of the page telling me I forgot to write an excerpt (<em>again</em>) and that it won&#8217;t let me publish until I fix the problem.</p></li>
</ol>

<p>
One or the other.  I think I like #1 a little better, but I&#8217;d be good either way.  I&#8217;m open to other approaches as well, but I don&#8217;t think the plugin should rely on JavaScript, as that means leaving out people who don&#8217;t enable JavaScript or post from JS-incapable devices.
</p>
<p>
I would do this myself, but I&#8217;m a little wary of the &#8220;return to the page with all data intact and unaltered&#8221; bit, which I would imagine is pretty easy to mess up.  Thus I&#8217;m putting it up here as a semi-Lazyweb post so that someone else, someone with more experience with WordPress and plugin authoring, can do it right and quickly.
</p>
<p>
Okay, who&#8217;s on it?
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/06/10/wanted-excerpt-exacter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Caught In The Camera Eye</title>
		<link>http://meyerweb.com/eric/thoughts/2008/06/10/caught-in-the-camera-eye/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/06/10/caught-in-the-camera-eye/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 18:40:22 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[An Event Apart]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Speaking]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=909</guid>
		<description><![CDATA[Just when you thought the whole embedded-video thing couldn't get any worse, here I come with videos featuring, well, me.]]></description>
			<content:encoded><![CDATA[<p>
Just when you thought the whole embedded-video thing couldn&#8217;t get any worse, here I come with videos featuring, well, me.
</p>
<p>
The most recent is <a href="http://www.aneventapart.com/news/2008/06/video_live_at_aea_eric_meyer_on_generated_content.php">a short clip from one of my presentations</a> at <a href="http://aneventapart.com/">An Event Apart</a> back in April, <a href="http://aneventapart.com/events/2008/neworleans/#schedule">debug / reboot</a>, where I comment at my usual pace on the suppression of quotation marks in <a href="http://meyerweb.com/eric/tools/css/reset/index.html">my reset styles</a> and why I think relying on browser-generated quotation marks is a bad idea.  You also get to see my hair before it got to be the length it is now, which is even longer.  There&#8217;s a complete transcription on that page, by the way, courtesy <a href="http://zeldman.com/" rel="friend colleague co-worker met">Mr. Z</a>.
</p>
<p>
Then there&#8217;s <a href="http://youtube.com/watch?v=VrmbrnXTNzY">the vaguely silly one</a>, in which I attempt to debug my clothing while sitting in my living room.  The main takeaway here, I think, is that my speech patterns on stage are just about the same as those in &#8220;regular life&#8221;.  Pity my family.
</p>
<p>
So there&#8217;s me in the movies.  It&#8217;s nowhere near as epic-ly m&euml;t&auml;l as <a href="http://www.robweychert.com/editorials/2008/06/09/something_in_the_air/">some other folks&#8217; videos</a>, but I suppose we all do what we can.
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/06/10/caught-in-the-camera-eye/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Strengthening Links</title>
		<link>http://meyerweb.com/eric/thoughts/2008/06/05/strengthening-links/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/06/05/strengthening-links/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 16:50:17 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[(X)HTML]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=908</guid>
		<description><![CDATA[As a follow-up to "<a href="http://meyerweb.com/eric/thoughts/2008/06/02/the-missing-link/">The Missing Link</a>", I've written <a href="http://meyerweb.com/eric/html-xhtml/html5-linking.html">a fairly lengthy document</a> that presents a number of alternatives for creating a more flexible and robust linking mechanism, and am looking for feedback and improvements.  (Updated 11 Jun 08.)]]></description>
			<content:encoded><![CDATA[<p>
As a follow-up to &#8220;<a href="http://meyerweb.com/eric/thoughts/2008/06/02/the-missing-link/">The Missing Link</a>&#8220;, I&#8217;ve written <a href="http://meyerweb.com/eric/html-xhtml/html5-linking.html">a fairly lengthy document</a> that presents a number of alternatives for creating a more flexible and robust linking mechanism.  The important core of the piece comes first, identifying a generic problem and covering some pros and cons of various ways to address the problem.
</p>
<p>
After that comes a much longer section which presents reasons to add linkability to various elements in the HTML5 specification.  I did <em>not</em> consider WebForms elements, but instead the list of 91 elements found in the primary list in Simon Pieters&#8217; excellent <a href="http://simon.html5.org/html5-elements">HTML5 Elements and Attributes</a> guide.
</p>
<p>
The important thing in that long list is not the exact mechanism I propose, but that I was able to find use cases for 30 HTML5 elements.  Each one is described briefly and accompanied by one or two markup examples.  Another 18 (listed at the end of the document) seemed initially to be good candidates, but I failed to find reasonable use cases for them.  The remaining 43 elements weren&#8217;t even considered, since they all seemed to be obviously poor choices.  One example is <code>video</code>, which would likely suffer if it were a hyperlink&#8211; resolving what to do when a user clicks on the video controls was completely unclear to me.
</p>
<p>
Now, as to why I&#8217;m blogging this instead of taking it to one or another of the relevant mailing lists: I&#8217;m looking for community input in order to strengthen <a href="http://meyerweb.com/eric/html-xhtml/html5-linking.html">the document</a>.  Did I miss any alternative solutions in that first section?  Are there more pros and cons for the various alternatives?  What use cases did I miss in that last list of 18; or, for that matter, what are some strong use cases for the list of 30 that I didn&#8217;t include?  Are there any elements among the 43 I omitted that do, in fact, have strong use cases for being linkable?
</p>
<p>
I&#8217;ll do my best to keep up with comments.  Have at it, folks!
</p>
<p>
<strong>Update 11 Jun 08:</strong> I&#8217;ve updated the document to incorporate ideas from commenters, and added a few extra bits of information at the end of the document.  It&#8217;s worth another look, especially since I&#8217;ve gotten some semi-official encouragement to submit the proposal to the HTML Working Group.
</p>]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/06/05/strengthening-links/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Missing Link</title>
		<link>http://meyerweb.com/eric/thoughts/2008/06/02/the-missing-link/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/06/02/the-missing-link/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 12:53:25 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[(X)HTML]]></category>

		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=907</guid>
		<description><![CDATA[
One of the few things I think XHTML2 got absolutely, totally, 125% right was freeing the href attribute from the few elements that accepted it and spreading it all over the language.  It saddens me that this isn&#8217;t happening in HTML5, especially since at least 1.5 of the four reasons given seem off base [...]]]></description>
			<content:encoded><![CDATA[<p>
One of the few things I think <a href="http://www.w3.org/TR/xhtml2/">XHTML2</a> got absolutely, totally, 125% right was freeing the <code>href</code> attribute from the few elements that accepted it and spreading it all over the language.  It saddens me that <a href="http://wiki.whatwg.org/wiki/FAQ#Does_HTML5_support_href_on_any_element_like_XHTML_2.0.3F">this isn&#8217;t happening in HTML5</a>, especially since at least 1.5 of the four reasons given seem off base or flat-out incorrect.  From where I stand, at any rate.
</p>
<p>
Here, let me explain by having a pseudo-dialogue with the four reasons.
</p>

<blockquote cite="http://wiki.whatwg.org/wiki/FAQ#Does_HTML5_support_href_on_any_element_like_XHTML_2.0.3F"><p>It isn&#8217;t backwards compatible with existing browsers.</p></blockquote>

<p>
Neither was CSS, table markup, PNG support, or any number of other worthwhile advancements in the web.  And yes, table markup was an absolutely worthwhile advancement: previous to that, the only way to have a table of data that lined up in any fashion was to space-format it and throw the whole thing into a <code>pre</code> element.  Ugly nonsemantic fun!
</p>
<p>
For that matter, if lack of backwards compatibility is an accepted reason to exclude something from HTML5, then a whole bracket of new elements&#8212;like, say, <code>nav</code>, <code>article</code>, <code>aside</code>, <code>dialog</code>, <code>section</code>, <code>time</code>, <code>progress</code>, <code>meter</code>, <code>figure</code>, <code>video</code>, <code>datagrid</code>, <code>header</code>, <code>footer</code>, need I go on?&#8212;need to come out of the specification <em>right now</em>.  They&#8217;re totally unsupported, and may not even be stylable, by older browsers.
</p>
<p>
(Yes, I just proposed that the term for a group of elements be a &#8220;bracket&#8221;.  A pod of whales, a flock of seagulls, a bracket of elements.  Try it out, see how it feels on the tongue.  A little angular, perhaps?  Don&#8217;t worry, you&#8217;ll get used to it.)
</p>

<blockquote cite="http://wiki.whatwg.org/wiki/FAQ#Does_HTML5_support_href_on_any_element_like_XHTML_2.0.3F"><p>It adds no new functionality that can&#8217;t already be achieved using the <code>a</code> element.</p></blockquote>

<p>
What?  <em>What?!?</em>
</p>
<p>
Given a table where each row contains several cells of of summary data, and there is a desire to be able to click on a row to get more detailed information via a search keyed off that summary information, please explain to me how being able to use <code>&lt;tr href="..."&gt;</code> on each row as opposed to writing a whole bunch of JavaScript to associate a click event listener and delegation code and handler functions and target assembly logic just to simulate what <code>&lt;tr href="..."&gt;</code> would do, were it permitted, constitutes &#8220;no new functionality&#8221;.  Please.  I would <em>love</em> to hear that one.
</p>
<p>
Unless of course HTML5 is going to let us wrap <code>a</code> elements around whatever arbitrary collection of elements we like, in which case, never mind.  I&#8217;ll just wrap all my <code>tr</code>s in <code>a</code>s and be done with it.  That&#8217;d be keen.  Will that be possible?  Will the HTML5 syntax be so flexible as to permit that?
</p>
<p>
<a href="http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody">Yeah, that&#8217;s what I thought.</a>
</p>
<p>
Not that I spent half the week banging my head against this problem and <a href="http://meyerweb.com/eric/thoughts/2008/05/29/need-help-with-table-row-events/">getting a bunch of hand-holding in the arcana of JavaScript and inconsistent browser event handling</a> just to address what twenty-five seconds or so would have sufficed to resolve in an <code>href</code>-everywhere world or anything.
</p>
<p>
And for the flip side of this, see Wilson Miner&#8217;s &#8220;<a href="http://alistapart.com/articles/accessibledatavisualization">Accessible Data Visualization with Web Standards</a>&#8220;, where a bar graph is built out of <code>span</code>s so that they can all be wrapped in an <code>a</code> element in order to let you click on any &#8220;row&#8221;&#8212;that is, what would have been a row had he been able to use table markup&#8212;and get more information.  Yes, absolutely, all that stuff should be in a <code>table</code>, but it was a case of have a table with a bunch of not-that-easy JS forced onto it, or have the contents of every cell in a row be a separate hyperlink to the same destination, or do simple markup with savaged semantics.  <em>We shouldn&#8217;t be forced into that choice.</em>
</p>

<blockquote cite="http://wiki.whatwg.org/wiki/FAQ#Does_HTML5_support_href_on_any_element_like_XHTML_2.0.3F"><p>It doesn&#8217;t make sense for all elements, such as interactive elements like <code>input</code> and <code>button</code>, where the use of <code>href</code> would interfere with their normal function.</p></blockquote>

<p>
True enough.  So don&#8217;t add it to those elements which would suffer, like <code>input</code> and <code>button</code>.  Or, alternatively, define behavior conflict resolution in those cases.  There might actually be good reasons to have <code>button</code> accept an <code>href</code> value as a fallback in cases where the normal function of the button fails in some manner.
</p>
<p>
Either way, the fact that adding <code>href</code> doesn&#8217;t work in <em>some</em> cases is no reason to forgo its addition in <em>all</em> cases.
</p>

<blockquote cite="http://wiki.whatwg.org/wiki/FAQ#Does_HTML5_support_href_on_any_element_like_XHTML_2.0.3F"><p>Browser vendors have reported that implementing it would be extremely complex.</p></blockquote>

<p>
I&#8217;m always willing to hear why implementors think something is complex to implement, as they&#8217;re often subtle and fascinating insights into web browser development.  Still, it seems to me that everything ubiquitous <code>href</code> attribution would imply can be recreated with a heavy dose of JavaScript event handlers and related code&#8212;<code>(on)click</code> for the sending you off to the target (and any <code>:active</code>-style effects you wanted to bring in), <code>(on)mouseover</code> or plain old <code>:hover</code> for the interactive effects, et cetera, et cetera.  Are they really saying that it&#8217;s more complex to support this sort of thing in markup than it is to support all the scripting and DOMiness that permits people to laboriously recreate it on their own?  If so, why?  I&#8217;m really curious to know what would make this &#8220;extremely complex&#8221;, which sounds a good deal more dire than &#8220;complex&#8221; or just plain old &#8220;difficult&#8221;.
</p>
<p>
I&#8217;m open to having my mind changed by strong evidence that this would be borderline impossible to implement, even though it can apparently be simulated via existing DOM/JS implementations.  Anything short of that, however, isn&#8217;t going to convince me that this should be dropped.  It was a good idea when it was in XHTML2, and it shouldn&#8217;t be abandoned if there&#8217;s any chance to save it.
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/06/02/the-missing-link/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Need Help With Table Row Events</title>
		<link>http://meyerweb.com/eric/thoughts/2008/05/29/need-help-with-table-row-events/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/05/29/need-help-with-table-row-events/#comments</comments>
		<pubDate>Thu, 29 May 2008 21:06:01 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=906</guid>
		<description><![CDATA[A late-week call for assistance in the JavaScript realm, specifically in making IE do what I need and can make happen in other browsers.]]></description>
			<content:encoded><![CDATA[<p>
Here&#8217;s a late-week call for assistance in the JavaScript realm, specifically in making IE do what I need and can make happen in other browsers.  I&#8217;d call this a LazyWeb request except I&#8217;ve been trying to figure out how to do it all <em>[censored]</em> afternoon, and it doesn&#8217;t <em>[censored]</em> work no matter how many <em>[censored]</em> semi-related examples I find online that work just <em>[censored]</em> fine, but still don&#8217;t <em>[censored]</em> help me <em>[censored]</em> fix this <em>[censored]</em> problem.  <em>[doubly censored]</em>!
</p>
<p>
I have a table.  (Yes, for data.)  In the table are rows, of course, and each row has a number of cells.  I want to walk through the rows and dynamically add an &#8216;onclick&#8217; event to every row.  The actual event is slightly different for each row, but in every case, it&#8217;s supposed to call a function and pass some parameters (which are the things that change).  Here&#8217;s how I&#8217;m doing it:
</p>
<pre>
var event = '5'; // in the real code this is passed into the surrounding function
var mapStates = getElementsByClassName('map','tr');
for (x = 0; x < mapStates.length; x++) {
	var el = mapStates[x];
	var id = el.getAttribute('id');
	var val = "goto('" + id + "','" + event + "');";
	el.setAttribute('onclick',val);
}
</pre>
<p>
Okay, so that works fine in Gecko.  It doesn&#8217;t work at all in IE.  I changed <code>el.setAttribute('onclick',val);
</code> to <code>el.onclick = val;</code> per some advice I found online and that completely failed in everything.  Firebug told me &#8220;el.onclick is not a function&#8221;.  Explorer just silently did nothing, like always.
</p>
<p>
So how am I supposed to make this work in IE, let alone in IE and Gecko-based and WebKit-based and all other modern browsers?
</p>
<p>
Oh, and do <strong>not</strong> tell me that framework X or library Q does this so easily, because I&#8217;m trying to <em>learn</em> here, not have someone else&#8217;s code hand-wave the problem away.  Pointing me directly to the actual code block inside a framework or library that makes this sort of thing possible:  that&#8217;s totally fine.  I may not understand it, but at least there will be JS for me to study and ask questions about.  Ditto for pointing me to online examples of doing the exact same thing, which I tried to find in Google but could not: much appreciated.
</p>
<p>
Help, please?
</p>
<p><strong>Update:</strong> many, many commenters helped me see what I was missing and therefore doing wrong&#8212;thank you all!  For those wondering what I was wondering, check out the comments.  There are a lot of good examples and quick explanations there.</p></pre>]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/05/29/need-help-with-table-row-events/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WordPress Adminimize and Latest Tweet Plugins</title>
		<link>http://meyerweb.com/eric/thoughts/2008/05/27/wordpress-adminimize-and-latest-tweet-plugins/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/05/27/wordpress-adminimize-and-latest-tweet-plugins/#comments</comments>
		<pubDate>Tue, 27 May 2008 18:37:20 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Tools]]></category>

		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=904</guid>
		<description><![CDATA[Just because the world hasn't suffered enough bad PHP coding, I released two WordPress plugins today.  One pares down some of the admin UI, and the other is a Twitter plugin.]]></description>
			<content:encoded><![CDATA[<p>
Just because the world hasn&#8217;t suffered enough bad PHP coding, I released two WordPress plugins today.  One pares down some of the admin UI, and the other is a Twitter plugin.  Because the world doesn&#8217;t have enough of <em>those</em>, either.  You can find links to them on my <a href="http://meyerweb.com/eric/tools/wordpress/">WordPress Plugins and Hacks</a> (but I repeat myself) page, or if you can go straight to their respective pages, which I&#8217;ll link here in just a second.
</p>
<p>
Okay, second&#8217;s up!
</p>

<dl>

<dt><a href="http://meyerweb.com/eric/tools/wordpress/mw_adminimize.html">MW Adminimize</a> (currently v0.5)</dt>
<dd>
<p>
This plugin pares down the page-topping links interface that shows up on every WordPress administration page.  I got tired of seeing my blog name in Big Huge Letters all the time, and I kept forgetting that the &#8220;Dashboard&#8221; link was hidden up in that black bar.  So I fiddled with some arrays and wrote some CSS, and got something that chews up less screen real estate while also being easier for me to use.  Maybe you&#8217;ll feel the same, in which case, enjoy the plugin.
</p>
<p>
In addition to that, I pared down some of the elements of the &#8220;Write Post&#8221; page so that they took up a bit less space, and compressed the stuff around the post title&#8217;s input field.  Those styles are marginally less stable and may cause weirdness for you.  If so, sorry.  Let me know what goes south and I&#8217;ll try to get it fixed in a future version.
</p>
<p>
Oh, and I also included a CSS rule that makes the background shading of moderated comments more obvious, though not in my usual eye-scarring fashion.  It&#8217;s just a little darker and notably redder.  That doesn&#8217;t have much of anything to do with minimizing the admin UI, but I thought it was a huge improvement.  I might take it out in a future version if the crowd shouts otherwise.
</p>
</dd>

<dt><a href="http://meyerweb.com/eric/tools/wordpress/mw_latest_tweet.html">MW Latest Tweet</a> (currently v1.0)</dt>
<dd>
<p>
This one does what you&#8217;d probably guess: shows the latest tweet.  Why not just use something like <a href="http://wordpress.org/extend/plugins/twitter-tools/">Twitter Tools</a>?  Actually, <a href="http://twitter.com/meyerweb/statuses/817596203">I tweeted about that</a>.  A further survey of the options available turned up nothing that was quite what I wanted.  So of course I started hacking away.
</p>
<p>
The basic mechanism is that any time a page that calls this plugin is loaded, it either returns the last-cached tweet or asks Twitter for the latest tweets so it can cache the latest of them.  If Twitter fails to respond (I know, what are the odds?), you still get the cached tweet.  This is similar to <a href="http://www.sleepydisco.co.uk/plugins/simpletwitter/">SimpleTwitter</a>, from which I took much inspiration, but is more advanced in a number of ways.  Among the options I wanted to have and thus created was having &#8220;human time&#8221; intervals as an option, and also the ability to filter out @replies (because I personally wanted to display my latest broadcast tweet, not my latest reply).  While I was at it, I decided I&#8217;d throw in the ability to define your own XHTML output, so that if the plugin failed there wouldn&#8217;t be partial or mangled markup shoved into your pages.  Also, since I cache the whole of the latest tweet, you have all kinds of stuff you can output should you so desire.  It&#8217;s all documented on <a href="http://meyerweb.com/eric/tools/wordpress/mw_latest_tweet.html">the plugin&#8217;s page</a>.
</p>
<p>
This is <em>not</em> a widget, because I&#8217;ve never written one and didn&#8217;t have time to learn (due to all the time I was burning just trying to write the plugin).  You have to edit your template/web page PHP in order to call it.  That&#8217;s just the kind of <acronym title="Do It Yourself">DIY</acronym> guy I fly.  Er, I am.
</p>
<p>
Also, I&#8217;m a wee tiny bit proud of how I styled the <code>label</code>s on the plugin&#8217;s Settings page.  I&#8217;ll probably write that up in a separate post.
</p>
</dd>

</dl>

<p>
That&#8217;s about it.  If anything goes wrong or is unclear, please do let me know in the comments.  Share and enjoy!
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/05/27/wordpress-adminimize-and-latest-tweet-plugins/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Characteristic Confusion</title>
		<link>http://meyerweb.com/eric/thoughts/2008/05/22/characteristic-confusion/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/05/22/characteristic-confusion/#comments</comments>
		<pubDate>Thu, 22 May 2008 14:00:29 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://meyerweb.com/?p=903</guid>
		<description><![CDATA[When Unicode attacks!]]></description>
			<content:encoded><![CDATA[<p>
In the course of building my <a href="http://meyerweb.com/eric/css/tests/line-height/inspect-multi.html"><code>line-height: normal</code> test page</a>, I settled on defaulting to an unusual but still pervasive font family: Webdings.  The idea was that if you picked a font family in the dropdown and you didn&#8217;t have it installed, you&#8217;d fall back to Webdings and it would be really obvious that it had happened.
</p>
<img src="http://meyerweb.com/pix/2008/ear-etcetera.png" alt="(A screenshot of the symbols expected from Webdings: an ear, a circle with a line through the middle, and a spider.)" class="pic border" />
<p>
Except in Firefox 3b5, there were no dings, web or otherwise.  Instead, some serif-family font (probably my default serif, Times) was being used to display the text &#8220;Oy!&#8221;.
</p>
<p>
<i>It&#8217;s a beta</i>, I thought with a mental shrug, and moved on.  When I made mention of it in <a href="http://meyerweb.com/eric/thoughts/2008/05/06/line-height-abnormal/">my post on the subject</a>, I did so mainly so I didn&#8217;t get sixteen people commenting &#8220;No Webdings in Firefox 3 betas!&#8221; when I already knew that.
</p>
<p>
So I didn&#8217;t get any of those comments.  Instead, <a href="http://meyerweb.com/eric/thoughts/2008/05/06/line-height-abnormal/#comment-375051">Smokey Ardisson posted</a> that what Firefox 3 was doing with my text was correct.  Even though the declared fallback font was Webdings, I shouldn&#8217;t expect to see it being used, because Firefox was doing the proper Unicode thing and finding me a font that had the character glyphs I&#8217;d requested.
</p>
<p>
Wow.  Ignoring a <code>font-family</code> declaration is kosher?  Really?
</p>
<p>
Well, yes.  It&#8217;s been happening ever since the CSS font rules were first implemented.  In fact, it&#8217;s the basis of the whole list-of-alternatives syntax for <code>font-family</code>.  You might&#8217;ve thought that CSS says browsers should look to see if a requested family is available and then if not look at the next one on the list, and then goes to render text.  And it does, but it says they should do that on <em>a per-character basis</em>.
</p>
<p>
That is, if you ask for a character and the primary font face doesn&#8217;t have it, the browser goes to the next family in your list looking for a substitute.  It keeps doing that until it finds the character you wanted, either in your list of preferred families or else in the browser&#8217;s default fonts.  And if the browser just can&#8217;t find the needed symbol anywhere at all, you get an empty box or a question mark or some other symbol that means &#8220;FAIL&#8221; in font-rendering terms.
</p>
<p>
A commonly-cited case for this is specifying a <acronym title="Chinese, Japanese, Korean, and Vietnamese">CJKV</acronym> character in a page and then trying to display it on a computer that doesn&#8217;t have non-Romance language fonts installed.  The same would hold true for any page with any characters that the installed fonts can&#8217;t support.  But think about it: if you browse to a page written in, say, Arabic, and your user style sheet says that all elements&#8217; text should be rendered in New Century Schoolbook, what will happen?  If you have fonts that support Arabic text, you&#8217;re going to see Arabic, not New Century Schoolbook.  If you don&#8217;t, then you&#8217;re going to see a whole lot of &#8220;I can&#8217;t render that&#8221; symbols.  (Though I don&#8217;t know what font those symbols will be in.  Maybe New Century Schoolbook?  Man, I miss that font.)
</p>
<p>
So: when I built my test, I typed &#8220;Oy!&#8221; for the example text, and then wrote styles to use Webdings to display that text.  Here&#8217;s how I represented that, mentally: the same as if I&#8217;d opened up a text editor like, oh, MS Word 5.1a; typed &#8220;Oy!&#8221;; selected that text; and then dropped down the &#8220;Font&#8221; menu and picked &#8220;Webdings&#8221;.
</p>
<p>
But here&#8217;s how Firefox 3 dealt with it: I asked for the character glpyhs &#8220;O&#8221;, &#8220;y&#8221;, and &#8220;!&#8221;; I asked for a specific font family to display that text; the requested font family doesn&#8217;t contain those glyphs or anything like them; the CSS font substitution rules kicked in and the browser picked those glyphs out of the best alternative.  (In this case, the browser&#8217;s default fonts.)
</p>
<p>
In other words, Firefox 3 will not show me the ear-Death Star-spider combo unless I put those exact symbols into my document source, or at least Unicode references that call for those symbols.  Because that&#8217;s what happens in a Unicode world: you get the glyphs you requested, even if you thought you were requesting something else.
</p>
<p>
The problem, of course, is that we <em>don&#8217;t</em> live in a Unicode world&#8212;not yet.  If we did, I wouldn&#8217;t keep seeing line noise on every web page where someone wrote their post in Word with smart quotes turned on and then just did a straight copy-and-paste into their CMS.  <img src="http://meyerweb.com/pix/2008/wallace.png" alt="(Here we have a screenshot of text where a bullet symbol has been mangled into an a-rhone and an American cents sign, thus visually turning 'Wall-E' into 'Wallace'.)" title="Ah, Wallace..." class="pic border" />  Ged knows I would love to be in a Unicode world, or indeed any world where such character-incompatibility idiocy was a thing of the past.  The fact that we still have those problems in 2008 almost smacks of willful malignance on the part of <em>somebody</em>.
</p>
<p>
Furthermore, in most (but not all) of the text editors I have available and tested, I can type &#8220;Oy!&#8221; with the font set to Webdings and get the ear, Death Star, and spider symbols.  So mentally, it&#8217;s very hard to separate those glyphs from the keyboard characters I type, which makes it very hard to just accept that what Firefox 3 is doing is correct.  Instinctively, it feels flat-out <em>wrong</em>.  I can trace the process intellectually, sure, but that doesn&#8217;t mean it has to make sense to me.  I expect a lot of people are going to have similar reactions.
</p>
<p>
Having gone through all that, it&#8217;s worth asking: which is less correct?  Text editors for letting me turn &#8220;Oy!&#8221; into the ear-Death Star-spider combo, or Firefox for its rigid glyph substitution?  I&#8217;m guessing that the answer depends entirely on which side of the Unicode fence you happen to stand.  For those of us who didn&#8217;t know there was a fence, there&#8217;s a bit of a feeling of a slip-and-fall right smack onto it, and that&#8217;s going to hurt no matter who you are.
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/05/22/characteristic-confusion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tour de Frantic</title>
		<link>http://meyerweb.com/eric/thoughts/2008/05/20/tour-de-frantic/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/05/20/tour-de-frantic/#comments</comments>
		<pubDate>Tue, 20 May 2008 13:48:29 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[An Event Apart]]></category>

		<category><![CDATA[Speaking]]></category>

		<guid isPermaLink="false">http://meyerweb.com/eric/thoughts/2008/05/20/tour-de-frantic/</guid>
		<description><![CDATA[Various bits of conference news from the next few months.]]></description>
			<content:encoded><![CDATA[<p>
I am, as ever, woefully behind on posting.  (Then again, maybe it&#8217;s not just me: Greg Hoy <a href="http://twitter.com/hoyboy/statuses/815293389">recently tweeted</a> that it&#8217;s happening all over.)  I still want to follow up on <code>line-height: normal</code> and also on a closely related topic that emerged in the comments.  And I will.  Eventually.
</p>
<p>
Right now, though, I want to mention a few pieces of news from the conference world.  After that, it&#8217;s back to steeling myself to upgrade WordPress while stomping out the problems I have with my current install and also, I hope, finally getting it set up to do version-controlled upgrading henceforth.
</p>
<p>
Right.  The news.
</p>

<ul>
<li>
<p>
The early bird deadline for <a href="http://aneventapart.com/events/2008/boston/">An Event Apart Boston 2008</a> is next Monday, so don&#8217;t wait much longer <a href="https://store.aneventapart.com/#boston-2008">to register</a> if you&#8217;re a fan of discounts.  If not, that&#8217;s cool too.  Maybe you like to pay more.  We&#8217;re not here to judge.
</p>
</li>
<li>
<p>
If you&#8217;re on the opposite coast, there&#8217;s also <a href="http://aneventapart.com/events/2008/sanfrancisco/">An Event Apart San Francisco 2008</a>, whose <a href="http://aneventapart.com/events/2008/sanfrancisco/#schedule">detailed schedule</a> was announced this morning.  It will be two days jam packed with greatness from Heather Champ, Kelly Goto, Jeremy Keith, Luke Wroblewski, Dan Cederholm, Tantek &Ccedil;elik, Jeffrey Veen, Derek Featherstone, Liz Danzico, Jason Santa Maria, Jeffrey Zeldman, and your humble servant.  You&#8217;ve still got some time <a href="https://store.aneventapart.com/#san-francisco-2008">to register</a> with the early bird discount, but I wouldn&#8217;t put it off forever, because there&#8217;s no way to know when the last seat will be sold.
</p>
<p>
(And if you aren&#8217;t <a href="http://aneventapart.com/subscribe/">subscribed to our mailing list</a>, then you&#8217;re already behind the times:  subscribers got word of the detailed San Francisco schedule yesterday, ahead of everyone else.  Because they&#8217;re <em>on the ins</em>, as the kids are known to say.  Don&#8217;t let them have all the fun.  Sign up today!)
</p>
</li>
<li>
<p>
At the beginning of June, I&#8217;ll be giving a keynote plus a bonus session to be named later at <a href="http://www.sbconference.com/2008/">the Spring &lt;br/&gt; Conference</a> in Athens, Ohio.  For years they&#8217;ve been trying to get me to come down there, and every year I had some insurmountable scheduling conflict.  It almost happened again this year, but they were really fantastic and actually worked the schedule to accommodate me, for which I can&#8217;t thank them enough.  Come on down and take a <code>&lt;br/&gt;</code> with us!
</p>
</li>
<li>
<p>
Come mid-July, I&#8217;ll be in sunny Philadelphia for the <a href="http://www.med.upenn.edu/uiconf/">Higher Education Web Symposium</a> co-teaching <a href="http://www.med.upenn.edu/uiconf/agenda.shtml#css">a full-day workshop on &#8220;CSS Tips &amp; Techniques&#8221;</a> with the incomparable <a href="http://w3conversions.com/">Stephanie Sullivan</a>.
</p>
</li>
<li>
<p>
And in the realm of the not-absolutely-guaranteed-and-therefore-underspecified:  come late September, it looks like I&#8217;ll be back in Destin, Florida; and I just might be making my way to Japan in early November.
</p>
</li>
</ul>

<p>
Plus of course there&#8217;s <a href="http://aneventapart.com/events/2008/chicago/">An Event Apart Chicago 2008</a> in October, but you already knew about that.  The detailed schedule will be published in mid-July, and with that lineup of speakers, I&#8217;m already shivering with anticipation.
</p>
<p>
Okay, that&#8217;s all I have for the moment.  Hopefully that upgrade/fix/control thing will go less bumpily than I fear, and I can get another post out before all those shows have passed into memory.
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/05/20/tour-de-frantic/feed/</wfw:commentRss>
		</item>
		<item>
		<title>line-height: abnormal</title>
		<link>http://meyerweb.com/eric/thoughts/2008/05/06/line-height-abnormal/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/05/06/line-height-abnormal/#comments</comments>
		<pubDate>Tue, 06 May 2008 15:13:56 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://meyerweb.com/eric/thoughts/2008/05/06/line-height-abnormal/</guid>
		<description><![CDATA[I wrote the first edition of CSS:TDG back in 1999.  Almost a decade later, line layout and line heights continue to hurt me.]]></description>
			<content:encoded><![CDATA[<p>
When I first wrote <a href="http://meyerweb.com/eric/books/css-tdg/"><cite>Cascading Style Sheets: The Definitive Guide</cite></a>, the part that caused me the most difficulty and headaches was the line layout material.  Several times I was sure I had it all figured out and accurately described, only to find out I was wrong.  For two weeks I corresponded with <a href="http://hixie.ch/" rel="acquaintance colleague met">Ian Hickson</a> and <a href="http://dbaron.org/" rel="acquaintance colleague met">David Baron</a>, arguing for my understanding of things and having them show me, in merciless detail, how I was wrong.  I doubt that I will ever stop owing them for their dedication to getting me through the wilderness of my own misunderstandings.
</p>
<p>
Later on, I produced <a href="http://meyerweb.com/eric/css/inline-format.html">a terse description of line layout</a> which went through a protracted vetting process with the CSS Working Group and the members of <a href="http://lists.w3.org/Archives/Public/www-style/">www-style</a>.  At the time it was published, there was no more detailed and accurate description of line layout available.  Even at that, corrections trickled in over the years, which made me think of it as my own tiny little <a href="http://en.wikipedia.org/wiki/The_Art_of_Computer_Programming"><cite>The Art of Computer Programming</cite></a>.  Only without the small monetary reward for finding errors.
</p>
<p>
The point here is that line layout is very difficult to truly understand&#8212;even given everything I just said, I&#8217;m still not convinced that I do&#8212;and that there are often surprises lurking for anyone who goes looking into the far corners of how it happens.  As I&#8217;ve said before, my knowledge of what goes into the layout of lines of text imparts a sense of astonishment that any page can be successfully displayed in less than the projected age of the universe.
</p>
<p>
Why bring all this up?  Because I went and poked <code>line-height: normal</code> with a stick, and found it to be both squamous and rugose.  As with all driven to such madness, I now seek, grinning wildly, to infect others.
</p>
<p>
Here&#8217;s the punchline: the effects of declaring <code>line-height: normal</code> not only vary from browser to browser, which I had expected&#8212;in fact, quantifying those differences was the whole point&#8212;<em>but they also vary from one font face to another, and can also vary within a given face</em>.
</p>
<p>
I did not expect that.  At least, not consciously.
</p>
<p>
My work, let me show it to you: <a href="http://meyerweb.com/eric/css/tests/line-height/inspect-multi.html">a JavaScript-driven test file</a> where you can pick from a list of fonts and see what happens at a variety of sizes.  (Yes, the JS is completely obtrusive; and yes, the JS is the square of amateur hour.  Let&#8217;s move on, please.  I&#8217;m perfectly happy to replace what&#8217;s there with unobtrusive and sharper JS, as long as the basic point of the page, which is testing <code>line-height: normal</code>, is not compromised.  Again, moving on.)
</p>
<p>
When you first go to the test, you should (I hope) see a bunch of rulered boxes containing text using the very common font face Webdings, set at a bunch of different font sizes.  The table shows you how tall the simple line boxes are at each size, and therefore the numeric equivalent for <code>line-height: normal</code> at those sizes.  So if a line box is using <code>font-size: 50px</code> and the line box is 55 pixels tall, the numeric equivalent for <code>line-height: normal</code> is 1.1 (55 divided by 50).
</p>
<p>
On my PowerBook, Webdings always yields a 1:1 ratio between the <code>font-size</code> and line box height.  The ten-pixel font size yields a ten-pixel-tall line box, and so on.
</p>
<p>
This is actually a little surprising by itself.  <a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height">The CSS 2.1 specification says</a>:
</p>

<blockquote cite="http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height">
<dl>
<dt><strong>normal</strong></dt>
<dd>Tells user agents to set the used value to a &#8220;reasonable&#8221; value based on the font of the element. The value has the same meaning as <a name="x23" href="http://www.w3.org/TR/CSS21/syndata.html#value-def-number" class="noxref">&lt;number&gt;</a>. We recommend a used value for &#8216;normal&#8217; between 1.0 to 1.2. The <a href="http://www.w3.org/TR/CSS21/cascade.html#computed-value">computed value</a> is &#8216;normal&#8217;.
</dd>
</dl>
</blockquote>

<p>
This is basically what CSS has said since its first days (see the equivalent text <a href="http://www.w3.org/TR/CSS1#line-height">in CSS1</a> or <a href="http://www.w3.org/TR/CSS2/visudet.html#propdef-line-height">in CSS2</a> for confirmation) and there&#8217;s always been a widespread assumption that, since 1.0 is probably too crowded, something around 1.2 is much more likely.
</p>
<p>
So finding a value of 1 was a surprise.  It was an even bigger surprise to me that this held true in Camino 1.5.2, Firefox 2.0.0.14, and Safari 2.0.4, all on OS X.  Firefox 3b5 didn&#8217;t render Webdings at all, so I don&#8217;t know if it would do the same.  I actually suspect not, for reasons best left for another time (and, possibly, a final release of Firefox 3).
</p>
<p>
Various browsers doing the same thing in an under-specified area of the spec?  That can&#8217;t be right.  It&#8217;s pretty much an article of faith that given the chance to do <em>anything</em> differently, browsers will.  The sailing was so unexpectedly smooth that I immediately assumed was that a storm lurked just over the horizon.
</p>
<p>
Well, I was right.  All I had to do was start picking other font faces.
</p>
<p>
To start, I picked the next font on the list, Times New Roman, and the equivalent values for <code>normal</code> immediately changed.  In other words, <em>the numeric equivalents for Times New Roman are different than those for Webdings</em>.  The browsers weren&#8217;t maintaining a specific value for <code>normal</code>, but were altering it on a per-face basis.
</p>
<p>
Now, this is legal, given the way <code>normal</code> is under-specified.  There&#8217;s room to allow for this behavior.  It&#8217;s actually, once you think about it, a fairly good thing from a visual point of view: the best default line height for Times New Roman is probably not the best default line height for Courier New.  So while I was initially surprised, I got over it quickly.  The seemingly obvious conclusion was that browsers were actually respecting the fonts&#8217; built-in metrics.  This was reinforced when I found that the results were exactly the same from browser to browser.
</p>
<p>
Then I looked more closely at the numbers, and confusion set back in.  For Times New Roman, I was getting values of 1.1, 1.12, 1.16, 1.15, 1.149, and 1.1499.  If you were to round all of those numbers to two decimal points, you&#8217;d get 1.10, 1.12, 1.16, 1.15, 1.15, 1.15.  If you round them all to one decimal place, you&#8217;d get 1.1, 1.1, 1.2, 1.2, 1.1, 1.1.  They&#8217;re inconsistent.
</p>
<p>
But wait, I thought, I&#8217;m trying to compare numbers I derived by dividing pixels by pixels.  Let&#8217;s turn it around.  If I multiply the most precise measurement I&#8217;ve gotten by the various font sizes, I get&#8230; carry the two&#8230; 11.499, 28.7475, 57.495, 114.99, 1149.9, 11499.  As compared to the actual values I got, which were 11, 28, 58, 115, 1149, and 11499.
</p>
<p>
Which means the results were inappropriately rounded up in some cases and down in others.  28.7475 became 28 and 1149.9 became 1149, whereas 57.495 became 58.  Even though 11.499 became 11 and 114.99 became 115.
</p>
<p>
This was consistent across all the browsers I was testing.  So again, I was suspecting the fonts themselves.
</p>
<p>
And then I switched from Times New Roman to just plain old Times, and the storm was full upon me.  I&#8217;ll give you the results in a table.
</p>

<table class="chart">
<caption>Derived <code>normal</code> equivalents for Times in OS X browsers</caption>
<tr>
<th><code>font-size</code></th>
<th scope="col">Camino 1.5.2</th>
<th scope="col">Firefox 2.0.0.14</th>
<th scope="col">Safari 2.0.4</th>
</tr>
<tr>
<th scope="row">10
<td>1</td>
<td>1.2</td>
<td>1.3</td>
</th></tr>
<tr>
<th scope="row">25
<td>1</td>
<td>1</td>
<td>1.16</td>
</th></tr>
<tr>
<th scope="row">50
<td>1</td>
<td>1</td>
<td>1.18</td>
</th></tr>
<tr>
<th scope="row">100
<td>1</td>
<td>1</td>
<td>1.15</td>
</th></tr>
<tr>
<th scope="row">1000
<td>1</td>
<td>1</td>
<td>1.15</td>
</th></tr>
<tr>
<th scope="row">10000
<td>1</td>
<td>1</td>
<td>1.15</td>
</th></tr>
</table>

<p>
Much the same happened when comparing Courier New with plain old Courier: full consistency on Courier New between browsers, albeit with the same strange (non-)rounding effects as seen with Times New Roman; but inconsistency between browsers on plain Courier&#8212;with Camino yielding a flat 1 down the line, Firefox going from 1.2 to 1, and Safari having a range of values above the others&#8217; values.
</p>
<p>
Squamous!  Not to mention rugose!
</p>
<p>
Now it&#8217;s time for the stunning conclusion that derives from all this information, which is: not here.  Sorry.  So far all I have are observations.  I may turn all this into a summary page which shows the results for all the font faces across multiple browsers and platforms, but first I&#8217;ll need to get those numbers.
</p>
<p>
I do have a few speculations, though:
</p>

<ol>
<li>
<p>
Firefox&#8217;s inconsistency within font faces (see Times and Courier, above) may come from face substitution.  That&#8217;s when a browser doesn&#8217;t have a given character in a given face, so it looks for a substitute in another face.  If Firefox thinks it doesn&#8217;t have 10-pixel Times, it might substitute 10-pixel something else serif-ish, and that face has different line height characteristics than Times.  I don&#8217;t know what that other face might be, since it&#8217;s not Times New Roman or Georgia, but this is one possibility.  It is <strong>not</strong> the minimum font size setting in the preferences, as I&#8217;ve triple-checked to make sure I have that set to &#8220;None&#8221;.
</p>
</li>
<li>
<p>
Another possibility for Firefox&#8217;s line height weirdness is a shift from subpixel font rendering to pixelly font rendering.  10-pixel text in Firefox is distinctly pixelly compared to the other browsers I tested, while sizes above there are nice and smooth.  Why this would drive up the line height by two pixels (20%), though, is not clear to me.
</p>
</li>
<li>
<p>
Much of what I&#8217;ve observed will likely be laid to rest at the doorsteps of the font faces themselves.  I&#8217;d like to know how it is that the rounding behaviors are so (mathematically) messed up within faces, though.  Perhaps ideal line heights are described as an equation rather than a simple ratio?
</p>
</li>
</ol>

<p>
Again, this was all done in OS X; I&#8217;ll be very interested to find out what happens on Windows, Linux, and other operating systems.  Side note for the Mac Opera fans warming up their flamethrowers: I&#8217;ve left Opera 9.27 for OS X out of this because it seems to cap font sizes at a size well below 1000, although this limit varied from one face to another.  Webdings and Courier capped at 507 pixels, whereas Courier capped at 574 pixels and Comic Sans MS stopped at 707 pixels.  I have no explanation, though doubtless someone will, but the upshot is that direct comparisons between Opera and the other browsers are impossible.  For sizes up to 100 pixels, the results were exactly consistent with Camino, if that means anything.
</p>
<p>
The one tentative conclusion I did reach is this: <code>line-height: normal</code> is a jumbled terrain of inconsistent behaviors, and it&#8217;s best avoided in any sort of precision layout work.  I&#8217;d already had that feeling, but at least now there&#8217;s some evidence to back up the feeling.
</p>
<p>
In any case, I doubt this is the last I&#8217;ll have to say on this particular topic.
</p>
<p>
<strong>Update 7 May 08:</strong> I&#8217;ve updated <a href="http://meyerweb.com/eric/css/tests/line-height/inspect-multi.html">the test page</a> with <a href="http://meyerweb.com/eric/thoughts/2008/05/06/line-height-abnormal/#comment-372941">a fix</a> from <a href="http://blowery.org/">Ben Lowery</a> so that it works in IE.  Thanks, Ben!  Now all I need is to add a way to type in any arbitrary font-family&#8217;s name, and we&#8217;ll have something everyone can use.  (Or else a way to use JavaScript to suck up the names of all the fonts installed on a machine and put them into the dropdown.  That would be cool, too.)
</p>]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/05/06/line-height-abnormal/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Really Perfect Ringtone</title>
		<link>http://meyerweb.com/eric/thoughts/2008/05/05/the-really-perfect-ringtone/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/05/05/the-really-perfect-ringtone/#comments</comments>
		<pubDate>Mon, 05 May 2008 16:33:15 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Humor]]></category>

		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://meyerweb.com/eric/thoughts/2008/05/05/the-really-perfect-ringtone/</guid>
		<description><![CDATA[iPhone, Blackberry, whatever: I present to you what is without doubt the most prefect ringtone ever.]]></description>
			<content:encoded><![CDATA[<p>
When I saw a couple of people link to &#8220;<a href="http://helderluis.net/297">the perfect iPhone ringtone</a>&#8221; last week, I had that sinking feeling that comes from being beaten to the punch.  I <em>knew</em> I should have stayed up an extra hour that one night and just gotten it done!
</p>
<p>
But wait, hold it, never mind, cancel the panic parade: it was <em>not</em>, in fact, the perfect ringtone.  Crisis averted!  Still, the sinking feeling lingered, reminding me of what could have been, so last night I sat down and got it done.  Now I bring to you <a href="http://meyerweb.com/sounds/yy-ringtone.mp3">the absolutely most perfect ringtone ever</a>.
</p>
<p>
Feel free to preview it using that link, if you really feel that&#8217;s necessary, but frankly you should just charge ahead and download the <a href="http://meyerweb.com/sounds/yy-ringtone.m4r"><tt>.m4r</tt> AAC</a> for instant ringtoniness.  If for some reason you&#8217;d rather have the audio source and do your own ringtone conversions, you can get the same file as a <a href="http://meyerweb.com/sounds/yy-ringtone.m4a"><tt>.m4a</tt> AAC</a> or a <a href="http://meyerweb.com/sounds/yy-ringtone.mp3">comfy old <tt>.mp3</tt></a>.  And for all you completists, there&#8217;s a <a href="http://meyerweb.com/sounds/yy-ringtone.zip"><tt>.zip</tt> archive of all three formats</a>.
</p>
<p>
Go.  Ring.  Enjoy.
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/05/05/the-really-perfect-ringtone/feed/</wfw:commentRss>
<enclosure url="http://meyerweb.com/sounds/yy-ringtone.mp3" length="663023" type="audio/mpeg" />
<enclosure url="http://meyerweb.com/sounds/yy-ringtone.m4a" length="881098" type="audio/mp4" />
		</item>
		<item>
		<title>Five Years</title>
		<link>http://meyerweb.com/eric/thoughts/2008/04/17/five-years/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/04/17/five-years/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 03:23:42 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://meyerweb.com/eric/thoughts/2008/04/17/five-years/</guid>
		<description><![CDATA[Five years ago, the phone rang and my life was forever altered.  It was the first of two utterly transforming phone calls we would get that year, and by far the worse.]]></description>
			<content:encoded><![CDATA[<p>
Five years ago, the phone rang and my life was forever altered.  It was the first of two utterly transforming phone calls we would get that year, and by far the worse.
</p>
<p>
Shortly after hanging up, I put in place <a href="http://meyerweb.com/other/mom/memorial.html">the temporary home page I&#8217;d prepared ahead of time</a>, complete with errors of fact which had grown out of my inability to think clearly about what I knew beyond any doubt was going to happen.  The next day, I noticed and corrected the errors, and then realized after a while that my corrections were incorrect and corrected them.  Correctly, at last.
</p>
<p>
When I appended the block of text a day or two later, it was a straight copy-and-paste job, and I was able to avoid introducing errors.  I was able to find a perverse solace in that.
</p>
<p>
To mark this anniversary, I&#8217;m publishing <a href="http://meyerweb.com/other/mom/coincidences.html">the piece I read on stage at Vox Nox 2005</a>, which was the only time it was shared publicly in the last five years.  The stunning part, even to me, is that every bit of that piece is the raw, unedited, unaltered truth.
</p>
<p>
In some ways, I still can&#8217;t believe that it&#8217;s been five years and that she&#8217;s really forever gone, that she&#8217;s missed everything that&#8217;s happened in my life.  In some ways, I can&#8217;t accept that she will never know her granddaughter, and that her granddaughter will never know her.  And in little ways, I do my best to bridge that yawning chasm with myself and what I learned, what I was taught, over all the years of my life&#8230; minus just a bit less than five.
</p>
<p>
Five years.  Five very busy years.  Five awful, wonderful, stressful, liberating, irreplaceable years.
</p>
<p>
I miss you, Mom.
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/04/17/five-years/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Crafting Ourselves</title>
		<link>http://meyerweb.com/eric/thoughts/2008/04/17/crafting-ourselves/</link>
		<comments>http://meyerweb.com/eric/thoughts/2008/04/17/crafting-ourselves/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 16:47:41 +0000</pubDate>
		<dc:creator>Eric Meyer</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Commentary]]></category>

		<category><![CDATA[Culture]]></category>

		<category><![CDATA[Standards]]></category>

		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://meyerweb.com/eric/thoughts/2008/04/17/crafting-ourselves/</guid>
		<description><![CDATA[In which I directly respond to the people who dislike my reset styles.]]></description>
			<content:encoded><![CDATA[<p>
My referrers lit up recently due to <a href="http://snook.ca/archives/html_and_css/no_css_reset/">Jonathan Snook&#8217;s article about CSS resets and how he doesn&#8217;t use them</a>.  To Jonathan and all the doubters and nay-sayers out there, I have only one thing to say:
</p>
<p>
<strong>Good for you.</strong>
</p>
<p>
Seriously; no sarcasm or passive-aggressiveness intended.  If I thought my reset styles, or really anything I&#8217;ve ever published or advocated, was a be-all end-all ultimate solution for every designer and design that&#8217;s ever been and could ever be, I&#8217;d be long past due for six rounds on the receiving end of a clue-by-four.
</p>
<p>
Reset styles clearly work for a lot of people, whether as-is or in a modified form.  As I say on <a href="http://meyerweb.com/eric/tools/css/reset/">the reset page</a>, those styles aren&#8217;t supposed to be left alone by anyone.  They&#8217;re a starting point.  If a thousand people took them and created a thousand different personalized style sheets, that would be right on the money.  But there&#8217;s also nothing wrong with taking them and writing your own overrides.  If that works for you, then awesome.
</p>
<p>
For others, reset styles are more of an impediment.  That&#8217;s only to be expected; we all work in different ways.  The key here, and the reason I made the approving comment above, is that you evaluate various tools by thinking about how they relate to the ways you do what you do&#8212;and then choose what tools to use, and how, and when.  That&#8217;s the mark of someone who thinks seriously about their craft and strives to do it better.
</p>
<p>
I&#8217;m not saying that craftsmen/craftswomen are those people who reject the use of common tools, of course.  I&#8217;m saying that they use the tools that fit them best and modify (or create) tools to best fit them, applying their skills and knowledge of their craft to make those decisions.  It&#8217;s much the same in the world of programming.  You can&#8217;t identify a code craftsman by whether or not they use this framework or that language.  You can identify them by how they decide which framework or language to use, or not use, in a given situation.
</p>
<p>
Craftsmanship is something I&#8217;ve been thinking about quite a bit recently, <a href="http://bokardo.com/archives/markup-style-society-talk/">as has Joshua Porter</a>.  I delivered a keynote address on that very topic just <a href="http://minnewebcon.umn.edu/">a few days ago in Minneapolis</a>, and my thinking infuses both of the talks I&#8217;m giving next week at <a href="http://aneventapart.com/events/2008/neworleans/">An Event Apart New Orleans</a>.  I&#8217;ve started looking harder for evidence of it, both in myself and in what I see online, and I believe striving toward being a craftsman/craftswoman is an important process for anyone who chooses to work in this field.
</p>
<p>
Because this isn&#8217;t a field of straightforward answers and universal solutions.  We are often faced with problems that have multiple solutions, none of them perfect.  To understand what makes each solution imperfect and to know which of them is the best choice in the situation&#8212;that&#8217;s knowing your craft.  That&#8217;s being a craftsman/craftswoman.  It&#8217;s a never-ending process that is all the more critical precisely because it is never-ending.
</p>
<p>
So it&#8217;s no surprise that we, as a community, keep building and sharing solutions to problems we encounter.  Discussions about the merits of those solutions in various situations are also no surprise.  Indeed, they&#8217;re exactly the opposite: the surest and, to me, most hopeful sign that web design/development continues to mature as a profession, a discipline, and a craft.  It&#8217;s evidence that we continue to challenge ourselves and each other to advance our skills, to keep learning better and better how better to do what we love so much.
</p>
<p>
I wouldn&#8217;t have it any other way.
</p>
]]></content:encoded>
			<wfw:commentRss>http://meyerweb.com/eric/thoughts/2008/04/17/crafting-ourselves/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
