Share This sans-prototype.js

I had a planed to replace the use of Prototype.js in the Share This WordPress plugin, since that was the only plugin using it. Prototype is quite large, and my server isn’t currently set up to gzip javascript files. I started to replace it with jQuery, and add an option to switch between the two. I figured it’d be a good way to help make the blog load more quickly if I make sure all the plugins were using the same (smaller) JavaScript framework.

I found along the way that Share This doesn’t actually use very much of Prototype.js at all. It does a few id based element queries, and uses Prototype’s Position.cumulativeOffset once. So I just converted the dollar sign based id query with DOM standard getElementById, and replaced the cumulativeOffset method call. Then removed the bits that output a prototype.js header link.

That’s it. No more bulky prototype.js dependency!

You can grab the patch from the WP Plugins trac.

While I was at it, I also added gzip support for the js, css and static share-this page, along with a new flag to turn gzip on and off.

Here’s the gzip support patch.

If you’d rather skip all the patching, here is a prepatched share-this.php archive. To use it, download the Share This plugin, and overwrite share-this.php with the new one (patched against the latest from SVN as of this post date).

Case Insensitive Permalinks Plugin for WordPress

For a while I have been creating and sending links to History Keeper to http://www.unfocus.com/projects/HistoryKeeper/. When I moved that page into WordPress the URL became lower case, and case sensitive. This can be a problem for those used to Windows and IIS non-case sensitive URLs. To get around the problem, I added a hack to my 404.php error handler (more on that later) that would detect capitals in the permalink URL, convert it to lowercase, and then forward the user to the new page with a php Location header (http redirect). That seemed like a clunky solution, so I made a WordPress plugin that does pretty much the exact same thing, only it’s in a plugin! So that makes it less clunky. Well whatever.

Here’s the code:

<?php
/*
Plugin Name: unFocus.Insensitivity
Plugin URI: http://www.unfocus.com/projects/
Description: A plugin to make permalinks case insensitive.
Version: 1.0a
Author: Kevin Newman
Author URI: http://www.unfocus.com/projects/
*/

function unFocus_insensitivity() {
    if (preg_match('/[A-Z]/', $_SERVER['REQUEST_URI'])) {
        $_SERVER['REQUEST_URI'] = strtolower($_SERVER['REQUEST_URI']);
        $_SERVER['PATH_INFO']   = strtolower($_SERVER['PATH_INFO']);
    }
}
add_action('init', 'unFocus_insensitivity');
?>

Pretty simple really. Honestly, it doesn’t really even need to use a WordPress hook, just the two lines that convert the $_SERVER variables would do it (assuming those aren’t locked down in the php.ini). But I wanted to learn the plugin API anyway. There is an archive download at the end of this post, just unzip the enclosed file, and put it in your plugin directory, upload it and turn it on. No other configuration necessary.

If there is any interest, I was thinking about adding a config option that would allow you to either forward to the all lowercase URL, or to do what it does now, which is to behave pretty much the way IIS does for any other static files it hosts.

Also, if there’s interest, I may try to figure a way to work this WordPress IIS Permalink 404 handler into the plugin, if it’s possible (IIS users would set their custom 404 handler redirect URLs to redirect to /wordpresslocation/index.php instead of /wordpresslocation/404.php, which is how you do it now):

<?php
$_SERVER['REQUEST_URI'] = substr(
    $_SERVER['QUERY_STRING'],
    strpos(
        $_SERVER['QUERY_STRING'],
        ':80'
    ) +3
);
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];

include('index.php');
?>

The archive – unFocus.Insensitivity

Update: Fixed the download link.

Ajax Calendar – Widgetized

Update: This information applies to Giraffe AJAX Calendar 2.3.1. AJAX Calendar 2.4 was released on September 3, 2007. This information is incompatible with that new version.

Update 2: It seems that this new version is supposed to simply replace the functionality of the old Calendar, without requiring any extra work (so you’d just use the old Calendar Widget, and get the new functionality after the plugin is enabled). So far, I haven’t been able to get the Ajaxy stuff to work, although I can tell that it’s installed, because the calendar is wider in this theme with the new Calendar plugin.

While surfing the web aimlessly, I came across the Urban Giraffe Ajax Calendar plugin for WordPress. It’s not set up to take advantage of WordPress’s built-in Widget support, so I thought I’d add the necessary bits to make it work. Here’s how to do it.

Download the plugin, and add the following code to the bottom of ajax-calendar.php:

function giraffe_ajax_register_widget() {

    if ( !function_exists('register_sidebar_widget') || !function_exists('register_widget_control') )
        return; register_sidebar_widget('Ajax Calendar', 'ajax_calendar');

}add_action('plugins_loaded', 'giraffe_ajax_register_widget');

Additionally, you can avoid a duplicate prototype.js header link, by replacing these lines:

if ($giraffe_ajax_prototype)
  add_action ('wp_head', 'giraffe_ajax_head');

with these:

if (function_exists('wp_enqueue_script'))
 wp_enqueue_script('prototype');
else if ($giraffe_ajax_prototype)
 add_action ('wp_head', 'giraffe_ajax_head');

You can see it working in my sidebar. And I didn’t even have to modify this theme. 🙂