LnBlog 2.3.2 - No Need for Ports

A new patch release is up.  You can get it from the download page.

This one fixes a small but significant bug, reported by atomGit via Github.  There was an issue with the CSRF protection code where it did not properly account for URLs with a port in them.  So if you tried to run LnBlog with a PHP test server on a non-standard port, the initial setup page would return a 400 Bad Request error.  Sadly, there was nothing particularly subtle or interesting about this bug - it's just something I didn't account for.  The CSRF code was blissfully unaware that a URL or hostname could contain a port.  This led to trying to compare an HTTP_HOST header with a port in it, e.g. localhost:8081 to a call to parse_url($_SERVER['HTTP_ORIGIN'], PHP_URL_HOST), which explicitly discards the port.

While I was at it, I also updated the defaults for the userdata path when the LnBlog directory is the server's document root.  This is because the normal default is to have userdata and LnBlog in the same directory, but right now LnBlog assumes that the userdata directory will be web-accessible.  So in that case, the default is now to put userdata inside of LnBlog, like in the "good ol' days".

LnBlog 2.3.1 - No need for pagination

Welp, it's time for a patch release.  This is a minor one, though.  It only fixes two small, but highly visible and annoying bugs:

  1. The internal version number was wrong.  This was version 2.3.0, but internally, LnBlog thought it was still 2.2.0.  That's because I forgot to update the version number in the config file.  This is not the first time I've done this, sadly, so I added a step to the build script to check that the build version matches the config file, which should keep this from happening again.
  2. The move of the entry-fetching code from the main Blog domain object to a repository object broke pagination because of the way the "has more entries" check worked.  That meant that the next/previous links never showed up at the bottom of the page, which was annoying.

That's it - nothing earth shattering here.  You can grab the new version from the download page.

LnBlog 2.3.0 - No Need for RSS

It's that time again - time for a new LnBlog release!  I'm averaging about one a year at this point, which isn't too bad considering how little time I get to work on it.  As usual, you can grab it from the download page or from the GitHub page.

Anyway, this release comes with several new features and some caveats.  While perhaps not earth-shattering, some of the changes are fairly substantial.  

But first, a compatibility warning: PHP versions prior to 7.4 are no longer supported.  That's right, we're moving into the "modern" era and making PHP 7.4 or greater a hard dependency.  So if you're still on 7.3, sorry, but the new release won't work.  But on the other hand, 7.3 has also reached end-of-life and no longer even gets security updates, so you probably shouldn't be running it anyway.  Also, updating to 7.4 means I can start using more fancy new language features.

As a side-note, the above also means that if you installed from source, or want to do an in-place upgrade by pulling from the Git repo, you'll need to do a "composer install --no-dev" to update the dependencies.

Anyway, on to the changes. One of the big ones is that the RSS support has been completely revamped.  The old plugins were, frankly, crappy and half-baked, and had lain mostly untouched for over a decade.  So I ripped them out and replaced them with a new, unified RssManagement plugin.  In the process, I pulled all the actual feed generation logic out of plugins and into the core.  This allows us to leverage that to support additional export formats.  So in addition to the WordPress export that we added in the last release, we can now do all the formats that we generate feeds in.  This also made it much easier to add new feed formats, so in addition to RSS 1.0 and RSS 2.0, we can now create Atom feeds as well!

The new RssManagement plugin settings.

Note that because we now have a new RSS plugin, you'll probably need to reconfigure the RssManagement plugin to match any customizations you had previously.  However, this time the config is all in one place.  So as you can above, there is now one config screen to choose what feed types to generate, where they appear, and what the sidebar panel looks like.  There are also some links to manually purge and recreate feed files (caveat: the UI needs a little work...).  These are useful if you decide to disable a particular format or want to migrate from RSS to Atom.

In addition to this, there are also some improvements to the post editor.  Instead of just supplying a couple of presets, you now have the ability to specify a full config object for TinyMCE.  That means you can customize the menus, toolbars, etc. to your liking.  (Of course, you'll need to look at the TinyMCE documentation to figure out the settings you want, but at least you can change them.)

We've also got some new changes to make dealing with post attachments easier.  The first is that you can now upload an attachment from the clipboard.  So you can copy an image from the web and paste it into the editor page with ctrl+V (or cmd+V if you're one of those people).  This will now actually upload the clipboard data and create an image attachment (note: you'll have to click outside of the actual editor box, otherwise TinyMCE will intercept the past).  We've also added controls next to the listed attachments that will insert links directly in the editor.  So once the attachment is uploaded, all you need to do to insert it at the cursor location is click the icon next to it in the attachment list.  When combined with the auto-scaling feature, I find that this takes nearly all of the friction out of adding image to your posts.  But that's just me.

Anyway, here's the official list of issues resolved in this release.  Enjoy!

  • #47 Improve RSS support (enhancement)
  • #44 Make TinyMCE editor configurable (enhancement)
  • #43 Better display of publication queue (enhancement)
  • #42 Support for "paste to upload" (enhancement)
  • #39 Encapsulation for controller logic (enhancement)
  • #38 Improve image quality for auto-scaling (enhancement)
  • #37 Move LBCode editor markup to a plugin (enhancement)
  • #36 Insert attachment links in editor (enhancement)
  • #35 Add cache busting for JS/CSS files (bug)
  • #33 Manage files for profiles (enhancement)
  • #32 TinyMCE not loading on generic file editor (bug)

LnBlog 2.2.0 - No Need to Start Over

It's here!  We have a new LnBlog release, not quite a year after the last one.  By current standards, that's fast and furious.

Anyway, this release actually has some new and interesting (at least to me) features.   You can grab a copy from the download page or the GitHub release page.    Note that this release will require an upgrade of any existing blogs.  Also note that this release changes the way URLs are calculated, so you'll need to visit the admin page to go through the initial setup again.  If your blogs don't show up after that, you may need to re-register them from the admin page.

Now, on to the changes in this version.  And there's actually quite a few of them - and some pretty substantial ones, too.  Not bad for one guy developing it on an extremely-part-time basis.  In fact, the app is starting to look and work fairly well, if I do say so myself.  But anyway, here's what you need to know:

  • First, I finally fixed the stupid, ugly layout of the various forms.  They now use a standard vertical layout rather than the old, uneven, "I'm too lazy to style this" one.  I know this doesn't sound like a big deal, and it really isn't (I mean, I did it in like an hour), but it's been a long-standing issue and it made the entire app look crappy.
  • Another small but noteworthy change, the "DisableComments" plugin is now configured to disable TrackBacks on all entries by default.  Related to this, disabling TrackBacks on an entry will now disable all TrackBack-related UI elements.  Of course, you can still change that setting in the plugin configuration, but I don't even remember the last time I saw mention of TrackBacks on a blog, so I figured it was time to turn that stuff off.
  • Now the big one - import from WordPress!  This feature allows you to take a WordPress extended RSS export file and import it into LnBlog.  You can either import the data into an existing blog, or create a new one based on the export file.  This is the first iteration, and it has some limitations, but it works.  The biggest limitations are that the import process will not import media items and it will not touch the contents of the posts - everything is treated as raw HTML, so you're on your own as far as any WordPress markup magic.  (Note that if you keep the media files for your WordPress installation at the old URL, they should still work.  Alternatively, you can set up a mapping on your web server or just edit the URLs in the export file before you do the import.)  However, the process will import pages as LnBlog articles, published posts, draft posts, comments, and pingbacks.  You also have the option to import user accounts for any username in the export that doesn't already exist in LnBlog.  The import will attempt to map the WordPress usernames to LnBlog usernames and default to the blog owner if the username can't be found.
  • Here's one you'll definitely notice - the addition of the Tag-It widget.  This is now used in a couple of places, but the most obvious is the entry editor.  So instead of the text-box with the ghetto JS drop-down for selecting tags, we have an actual decent-looking widget.
  • Another noticeable feature is an auto-scaler for uploaded images.  In the collapsible file list for the upload box, we now have a little icon next to images that you can click to auto-generate a scaled version.  There are only a few pre-set choices for size, but it's a convenient way to create thumbnails or scale down high-def pictures.
  • Now the under-the-hood changes.  First, blog data upgrades can now be done from the command line.  Just run php cli.php --upgrade to upgrade all your blogs in one shot, or supply a blog ID to do just one.
  • Second, third-party JavaScript libraries have moved from whatever random CDN I could find to local files.  These are collected and put in the "third-party" directory by the build process.  Part of the blog upgrade process now includes making sure each blog has a references to these files.  (By this, I just mean that the upgrade gets around cross-domain JS issues by copying or symlinking this directory into any blog that's on a different domain than the LnBlog directory.)
  • Lastly, and most importantly, I completely changed the way LnBlog tries to deal with path and URL mapping.  The old version used some hair-brained and convoluted rules to try to auto-detect what path mapped to what URL.  This was fine...when it worked.  The problem was that it didn't work often enough, and when it failed, the failures were opaque and hard to diagnose.  So instead of that, LnBlog now requires you to explicitly tell it what path and URL each blog will have.  It also requires you to explicitly tell it the path and URL of the LnBlog installation and your userdata folder.  Of course, the UI will present you with reasonable defaults that you can edit if desired.  For blogs, it will even update these when you change the blog ID you enter (note: the "blog ID" is just a string identifying the blog - usually, it's just the name of the blog's folder).  I know this is a little bit of a pain, in that it adds some extra boxes to think about, but it shouldn't be too bad.  And it makes the URL resolution much more reliable.
  • One last note: Because of the above change to the URL and directory mapping, LnBlog will now generate a pathconfig.php file inside the LnBlog install directory.  So when upgrading, you may have to copy this file to the new version.  (Yes, I know this violates the whole "put everything in userdata" rule I had, but since it now stores the path to userdata, that obviously wasn't going to work.)  This file now stores the paths and URLs to your LnBlog install, your userdata folder, and each of your blogs.  However, that's all it stores.  So this file is critical to LnBlog working, but if anything happens to this file, there's nothing in it that can't be recreated through the admin page UI.  Just delete the broken file, go to the admin page to regenerate the basics, and then re-register each of your blogs.

Here's the list of GitHub issues closed in this release:

  • Cannot edit URL of current blog (#14)
  • Better subdomain resolution (#15)
  • Auto sitemap broken for subdomains (#17)
  • RSS links shown when plugin disabled (#18)
  • Add tag widget (#19)
  • Include files for third-party JavaScript (#20)
  • Import from WordPress (#25)
  • Comment delete link broken (#26)
  • Auto-scale feature (#27)
  • Upgrade from command-line (#29)

LnBlog 2.1.0 - No Need for a Crappy Mobile Experience

Hot on the heels of LnBlog 2.0.0 a mere year and five months ago, release 2.1.0 is here!  This one includes a bunch of quality-of-life and usability improvements, including some basic support for responsive layout, editor improvements, and a less crappy interface to change plugin load order (which tool me like half an hour, so I'm not sure why I didn't do that years ago).  This release also includes entry pagination for the main blog page which, again, didn't take that much work and is a basic feature I should have implemented years ago.

Another new feature is the introduction of a task queue.  This is a glorified way of referring to a command-line script that reads a JSON file and does stuff based on what it contains.  The idea is that you can just run this via a cron job or similar task scheduling system.  Right now it's only used for scheduled publication, but it will be useful in the future for other things.  Configuring it as a cron job is currently optional, but highly recommended (if you don't, the back-end of the script will just run on every request to the main page).  To set up the "cron" functionality, create an entry in your crontab (or wherever you create your cron entries) that runs: php /path/to/lnblog/cli.php --cron.  Then add the line USE_CRON_SCRIPT = true to your userdata/userconfig.cfg file.  (Note: if you prefer to use userconfig.php, you can add the constant definition there instead.)

We also have several security enhancements in this release, including login attempt throttling and CSRF protection.  Again, both long overdue.  The list of tickets with Github links is included below.  There's probably a bunch of other undocumented stuff I fixed and forgot about too.

You can grab the zip file from the download page.  As usual, the upgrade process is to just to move the old directory, extract the zip file, and copy your userdata (and any other custom files) into the new directory.  Or, if you moved userdata up one level (which you should), just move the old directory and extract the new one.  I think we're close to the point where nothing that you should care about is stored in the actual application directory, but I can't swear to it.

Also, you'll need to run a "blog upgrade" for each of your blogs from the admin page.  As always, it's wise to backup all your data before upgrading.  Remember, there's no warranty on this - if it breaks, you get to keep both parts.

Anywho, here's the ticket list.

LnBlog 2.0.0 - No Need for Regularity

Wow, three and a half years since the last release.  That's kind of a long time.  But on the other hand, seeing how this was my very first PHP project (back in the PHP 4 days), and I've now been writing PHP professionally for over a decade, it's a small miracle that it still works at all.

Anyway, there have actually been quite a few changes since the last release, although many of them have been under the hood.  Basically, I've been using LnBlog as a test bed to practice refactoring legacy code.  So I've done a bunch of restructuring, adding unit tests, fixing bugs, and generally trying to simplify things.  Among the bigger updates were removing most of the wrapper pages and reworking the post publication process.  There's a lot still to do, but the code is gradually getting better.

Since this is a major version, there are some feature additions as well.  Here's the full list of items in the milestone, but the big ones are support for sending and receiving Webmentions (they show up as Pingbacks, which are essentially the same thing anyway) and support for listing and deleting files attached to blogs and entries.

Note that my justification for calling this version 2 is that I'm requiring a data upgrade for older blogs, like this one.  So if you have entries with the old "current.htm" data files, the blog needs to be upgraded.  (Note: I am probably the only person in the world to whom this applies.)  This release adds support to the "blog upgrade" process on the admin page to migrate those files to the newer XML format.  The next release will remove support for the old file formats.

So feel free to check it out.  As usual, you can get the zip archive from the download page.  If you're so inclined, you can also grab the source directly from Mercurial.  You should be able to just drop it on your server, run composer install, and point a browser to the URL.

LnBlog 1.3.0 - No Need For Tenchi Muyo References

Hey, look at that - another release!  And just a little over a year since the previous one. 

There's not really much to this.  It's mostly under-the-hood improvements and cleanup, along with a few bug fixes.  I also played around with the edit form and added support for writing posts in Markdown.  But honestly, I just wanted to get a release out before trying to make bigger under-the-hood changes.  I know, not very exciting, but I just didn't want too many changes piling up.

Anywho, the installable ZIP archive is on the download page and the list of changes is on the isue tracker.  The full source is available from the Mercurial repository linked from the project page.  Please report any bugs.

Have fun!

LnBlog 1.2.0 - No Need to Give Up

Hey, look!  It's another LnBlog release!  And only two years since the last one!  Boy, Pete sure knows how to keep those improvements coming, doesn't he?

So...yeah.  Here's another release.  Development isn't anywhere close to what I'd call "active", but I'm still using this thing for my own site and I'm still maintaining it.  In fact, I'm still adding the occasional feature.

The most visible change is probably that the HTML editor plugin is now inclued and enabled by default.  So instead of writing posts in a dialect of BBCode, you can just use the TinyMCE WYSIWYG HTML editor.  Note that the editor is implemented as an update to the old TinyMCE plugin, served via the free CDN.  So if you want to write your HTML in a text area, you can just disable the plugin.  And if you want to write your posts in LBCode, you can still set the markup mode as normal and the editor will be disabled.  There are also a bunch of other fixes in this release - the list of tickets is available here.

You can grab a copy of the latest version from the traditional download page (complete with checksums and GPG signature).  The recent releases are also linked to from the project issue tracker, which has been switched from MantisBT to The Bug Genie and includes things like a "releases" page, planning pages, and so forth.  You can also use the tracker to file reports for any bugs you happen to see.  Anonymous reports are disabled due to spam, so you'll need to either create an account or log in via OpenID.


LnBlog 1.1 - No Need for Users

Wow, it happened again! Another release!

This version has a few minor feature additions. Mostly just small stuff that I wanted. Honestly, it's not like I have any users, so at this point it's really just releasing the source to code I'm writing for myself.

Anyway, this release includes things like the ability to schedule a draft for future publication, the ability to set the main page of a blog to be an article (rather than having the list of articles as the main page), a new "author bio" sidebar plugin, and some various bug fixes. You can see the changelog here and download the code here.

LnBlog 1.0: Resurrection

Hey, whaddaya know? I finally released version 1 of LnBlog! Yay!

OK, so it's not really that big a deal. Just a few bug fixes and some minor features. But still, it works a little better and is slightly more modern. It's also a relatively stable state, as opposed to the random set of semi-tested changes that have been hanging around in my working copy for God knows how long.

You can find the change log for this version here. The only real new features are in the entry editor - an AJAX-based preview and dynamic addition of file upload fields. Other than that, it's mostly various bug fixes.

Anyway, feel free to mess around with it. You can get it from the download page. If, by any chance, you want to upgrade an existing installation, just copy the new files into place and run the "upgrade blog" from the admin page. Please report any bugs using the issue tracker.

LnBlog 0.9.0 is finalized

Well, I'm done. LnBlog 0.9.0 is now officially available. You can grab the zip archive here or go to the download page to get it.

There are a lot of new features in this version. You read a somewhat more thoughtful discussion of them in the beta 1 announcement. In this post, I'll just give the quickie list.

  • Most data files are now XML. Old formats are still supported (no need to convert).
  • Support for running blogs on multiple subdomains from a single installation.
  • Consolidated the per-blog PHP wrapper scripts.
  • Support for saving draft entries to be published later.
  • New Linksleeve anti-spam plugin.
  • Improved support for blogging APIs, including support for the MoveableType API.
  • Reply management pages for bulk listing/deleting of replies.
  • Improvements (?) to file writing configuration.

To upgrade from a previous release, follow the usual procedure:

  1. Make backup copies of each of your blogs, just to be safe.
  2. Rename your old LnBlog directory on the server.
  3. Upload the new LnBlog in its place.
  4. Copy your old LnBlog/userdata directory into the new LnBlog directory, overwriting the existing files.
  5. Log into the administration page and run an upgrade on each of your blogs.

As an additional note, the URLs for XMLRPC-based services has changed. LnBlog has adopted the Wordpress style and just consolidated them all (APIs, Pingbacks, etc.) in a single xmlrpc.php script located in the root LnBlog directory. If you want to use a blogging client that supports the Blogger 1.0, MetaWeblog, or MovableType API, you should point it to that file.

It's late and that's about all I can think of for now. As usual, feel free to pass on any comments, suggestions, feature requests, or bug reports. You can e-mail me, leave a comment, or use the SourceForge issue tracker or forums.

Last beta for 0.9.0

Time for the last beta release: LnBlog-0.9.0b3.zip. No new innovations here, just some bug fixes for draft updating, JavaScript on subdomains, and a few other things. Barring any more bug discoveries, this will become the final release before too long.

Version 0.9.0 beta 2

Well, here's the next beta: LnBlog 0.9.0 beta 2.  There's nothing really new in this release - just big fixes from the last beta.  Mostly they're related to the URL changes from getting rid of the zillion wrapper scripts.

So far, this beta seems to be working pretty well.  I'm going to let it bake for a week or so, and if all goes well, make it final.  In the mean time, I'm going to try to work on the end-user documentation a bit.

LnBlog 0.9.0 beta 1

It's finally that time again. LnBlog 0.9.0 beta 1 is ready for those adventurous souls who feel like taking it for a spin. You can download it here. I actually hadn't intended to get to version 0.9.0 quite yet, but on the way to 0.8.3, I accumulated so many features and under-the-hood changes that a higher version number seemed justified.

If you want to upgrade to the beta version on a live web server, I strongly recommend backing up everything related to your existing LnBlog installation. That means your entire LnBlog directory and each one of your blog directories. I don't expect that anything will go wrong (it didn't for me), but there are a lot of changes in this version and I'd hate to see anyone lose data because of it.

In addition, if you are upgrading from a previous release, please note that you will need to run an upgrade on each of your blogs. You probably won't forget this because there is now a helpful reminder in the sidebar under you logout link.

As for the changes and new features, here's the quick list:

  1. Entry, reply, and user data files have all been converted to XML format. Old files will still be read, so there is no need to convert.
  2. Support for running blogs on multiple subdomains from a single installation.
  3. Lots of those annoying wrapper scripts in the blog, entry, etc. directories have been removed. For existing blogs, the unused wrappers will be deleted when you run an upgrade.
  4. Support for saving draft entries to be published later.
  5. New Linksleeve anti-spam plugin.
  6. Lots of fixes to the blogging APIs. Note that the Blogger, MetaWeblog, and Pingback implementations are now combined in a single xmlrpc.php file, so adjust the URIs in your blogging client accordingly.
  7. Added a "manage replies" feature to view all replies for various levels of archives.

I'm not planning to add any more significant features to this release, otherwise it will drag on forever. However, I am a bit unsure about some of the user interface elements, and I would love any feedback people have on them.

My two big UI questions are the new feature in the entry editor to automatically add a link when you add a file to be uploaded. There is a checkbox in the entry options to turn that off, but I'm generally not satisfied with this. It would probably be better to pop up a prompt window, but that will wait for another release....

The other thing I'm unsure about is the new file writing setup page. It's significantly longer and more verbose than the previous version. That's partially because I added the subdomain options to it, and partially because I added file permission settings and some option buttons to help guide the choice. I'm not really happy with the final product, though. I'm thinking it would be better to break the different sections out into a multi-step wizard kind of interface. I'm also not sure I'm doing a good job explaining the options and issues with configuring file writing. I guess I'm just not sure how to explain the technical details of the the various possible permission, ownership, and safe mode configurations in a non-technical way.

As usual, any feedback is greatly appreciated - suggestions, bug reports, whatever. Leave a comment, send an e-mail, or use the SourceForge tracker. Unfortunately, I am currently unable to accept feedback via telepathy.

LnBlog 0.8.2 finally released

Well, it's finally release time again. I've put up LnBlog 0.8.2. As usual, you can find it on the download page or just grab the release archive.

I'll be honest with you: it's been so long since the last stable release, I don't really remember all the changes. I just know there have been quite a few of them. I'll try to highlight the big ones, but if you're really curious, just read the last few blog entries and/or the changelog.

  • Change organization of theme style sheets.
  • Added option in system.ini to group all replies (comments, Pingbacks, and TrackBacks) into a single list.
  • Added mass deletion of replies.
  • Improved the sidebar calendar and made it AJAX-powered.
  • Added interface on admin page for administrators to modify user accounts.
  • Converted entry data files to XML format (don't worry - it'll still read the old format).

Thanks to everyone who contacted me with problems, suggestions, and other feedback for this release. Please keep it up - I really appreciate it! And if you find anything wrong in this release, you know what to do. Thanks!

The next beta and XML

Here's the next one: LnBlog 0.8.2 beta 2. I think I'm done adding things for this release, so I'm going to let this beta cook for a few days or so and then release it. I would have done the release today, but I added some fairly major things in the last couple of days and wanted to test them out a little more.

If you've been keeping score so far, this release contains changes to the theme stylesheets, mass comment/TrackBack/Pingback deletion, reply ungrouping, and a new AJAX calendar. The last big change, and the reason I want to let it cook, is the entry file format.

I finally got with the program and decided to start storing entry, article, and comment data in XML format. The ad hoc format I was using before worked well enough, but it was, well, very hacky. Basically the only reason I was using it was because I didn't want to depend on any optional XML libraries and I couldn't find a good one that I could just drop into the package. However, I finally broke down and wrote my own.

All I really wanted was a little library that did two things:
1) Read an XML file and put the contents in a DOM tree type data structure.
2) Take such a structure and serialize it to an XML file, automatically escaping angle braces and entities.
Unfortunately, PHP 4 doesn't come with anything like that. At least, not as a standard module. All it has is a thin wrapper around expat, an event-based XML parser. Expat is OK, but it doesn't output a DOM tree structure and it doesn't do anything related to serializing such a structure. So I basically just wrote a couple of classes: SimpleXMLReader and SimpleXMLWriter. They're found in the new lib/xml.php file.

The SimpleXMLReader is a wrapper around expat that builds a sloppy DOM tree. It also has the ability to convert that tree into an object. The SimpleXMLWriter takes an object and serializes it as XML. The way it works is that each element under the base node is treated as a field of the same name in a PHP class. This allows me to add fields to classes without having to account for them in the serialization routine. Anything that's new will automatically be written to the file and old files will simply not set the new fields.

Of course, the new classes are still pretty simplistic, but they're working pretty well so far. However, I strongly suspect they'll choke on text that's not encoded in UTF-8 or something compatible. Thus I added an option to turn it off. Just set the following in your userconfig.cfg to revert to writing old-style files:
ENTRY_DEFAULT_FILE = current.htm

The last three lines just change back all the settings back to the old values.

Note that support for the old file formats has been maintained, so there's no need to convert old data. New and edited posts will be written in XML format, but old entries and comments will be read normally.

New beta

Here's a quick beta release for anyone who's feeling adventurous. This is LnBlog 0.8.2 beta 1, which includes bug fixes, theme reworking, and some new features. I'm going to let this bake for a couple of weeks before releasing the final version.

This includes some reworking of the theme system, so there may be problems with some themes. Basically, I added some documentation to the default templates and consolidated the stylesheets. Refer to the default theme for an example of how things are organized now.

On the feature addition side, I added a facility for bulk reply deletion. Basically, I got sick of deleting comment spams one at a time, so now you can click a check box and mark any number of comments for deletion. I also added a system.ini variable called GroupReplies, which is turned on by default. When turned off, this will cause all replies on an entry (comments, TrackBacks, and Pingbacks) to be displayed in a single list, like many other blogging systems do. When turned on, it will keep the old behaviour of seperating by type of reply.

As usual, let me know if you find any bugs and I'll get them fixed for the final release.

LnBlog 0.8.1

LnBlog 0.8.1 is now available. As usual, you can grab it from the download page.

This release is for bug fixes and some minor feature enhancements. The bug fixes include Unicode issues with editing posts and pretty permalinks, as well as a very annoying issue where newlines were not properly translated to HTML <br /> tags in LBCode. Many thanks to MoonMind for pointing these out.

The feature enhancements are all small. There is now an LBCode color tag. I also changed the LBCode editor to remove the quote buttons (which I never used) and add a color button with drop-down selector and an alignment selector for the image button. For entries with an enclosure, I also added an HTML link tag to the enclosure file. Lastly, I included the new BotBlock plugin in this release.

That pretty much sums it up. As usual, please let me know if you have any thoughts, ideas, or bugs to reports.

LnBlog 0.8.0, "No Need for TrackBack"

Well, it's finally here: LnBlog 0.8.0 is now available. You can grab it here or go to the download page.

Several files have been removed in this release, so to upgrade, you should upload the new directory to your server and then copy/move your old userdata folder into it. Before that, though, you might want to take a look at the new system.ini file, just to see what the new options are. That part is optional, though.

Lots of changes and lots of bug fixes in this release. I won't bore you with all (or even most) of the specifics. That's what the changelog is for. However, for this version, I did do some extra testing and even documented the outstanding problems in this release. Fortunately, most of them are relatively small.

There are bunches of new features. First, LnBlog now has support for Pingbacks. You can turn on and off both the sending and receiving of Pingbacks on a per-entry basis. Note that there is an AllowLocalPingback setting in the entryconfig section of the system.ini file. If you set this to 0, then LnBlog will not send Pingback pings to enrties on your

Second, there's a new standard plugin: the TrackbackValidator. Basically, this checks the URLs of incoming TrackBack pings to see if they link to your blog. This works on the principle that legitimate TrackBacks almost always link to you, but TrackBack spam almost never does. So far, it seems to have completely eliminated my TrackBack spam problem.

Third, there's now a standard profile.ini file. This adds a custom "contact me" link field for your profile. This field takes an HTML link as its input. If this is given, then your e-mail address will not be displayed in your profile. You can use this with the ContactForm plugin.

Fourth, LnBlog now has simple Podcast support. Basically, this means you can add an enclosure URL to your entries and it will be included as an RSS enclosure in the RSS 2.0 feed (if you have one). You can either enter the RSS attributes directly, specifying url="http://somehost/file" length="12345" type="audio/mpeg", or, if the file in on the same server as LnBlog, you can give the URL and let LnBlog compute the file size and MIME type. Note that you can also use LBCode-style relative URIs, giving only the name for files in the entry directory, or a path relative to the blog root.

Last, I've reworked the post editor, including a lot more JavaScript. I've condensed the LBCode editor buttons, added a drop-down menu to add topics, and hidden the extra settings in an expandable box. I think it's much easier to use now. Also note that there's an EditorOnBottom setting to the entryconfig section of the system.ini file. Although it's not acutally in the default file, the default value is 0, which puts the editor buttons above the text area. Add this setting with the value of 1 to put them below.

I think that pretty much sums up the big things for this release. As usual, all forms of feedback are welcome. If you have any comments, find any bugs, or whatever, feel free to leave a comment, e-mail me, or whatever.

Release preview

It's time for a preview release. We'll call this one LnBlog 0.8.0-pre1. I don't really want to call it a beta release, because that would imply that the feature set is at least close to finalized. I'm actually still not sure if I want to release after a little more testing or add a few more features and call it version 1.0.0.

Since this is a testing release, I of course recommend keeping a backup copy of the previous version around. No blog upgrades are required, so just upload the new version and rename it after your old installation. Note a few old plugins are now redundant and have been removed and a file has been added in the userdata folder, so I the recommended starting with the fresh installation directory and copying over your old userdata folder rather than trying to upload the new files into your existing directory.

This is going to be a major feature addition release. The big one in this release is support for sending and receiving Pingbacks. If you're not already aware, Pingbacks are very similar to TrackBacks, in that they are used to send a notification to another blog that you've linked to them. The main differences are that 1) Pingbacks are significantly more complicated to implement and 2) Pingbacks don't suffer from the same spam problems as TrackBacks, due to the fact that the server, rather than the client, determines what data goes into them.

The second bigish feature is support for enclosures. Basically, this means podcasting support. An enclosure is just a hint to an RSS reader that a post is related to a particular file so that it can be downloaded in the background. All you need to do is enter the URL of the file in the box and, provided it's on the same server, LnBlog will calculate the MIME type and file size to insert into the RSS feed. I also added a default profile.ini file that allows you to enter a "contact me" URL. Basically, you enter the HTML for the link you want and this will be displayed in your profile instead of your e-mail address. You can use that in ContactForm plugin.

There's a bunch of smaller stuff in this release too. Check the change log for the details. For starters, I did some cleanup to various plugins. For example, I added a "ban and delete" option to the IPBan plugin, added the "new standard" RSS icons to the sidebar, made the calendar look slightly less crappy, added a stylesheet to the RSS 2 feeds (so they look like something in a browser), and created RSS feeds for comments even when there are no comments yet.

There are also a number of small bug fixes. For example, TrackBacks finally work regardless of whether or not you have CURL. I also found a bug with receiving the response code when sending TrackBacks. I also fixed a few small display issues that were weird or didn't make sense.

Last, there's a bit of code cleanup and consolidation. For instance, the TrackbackNotifier and CommentNotifier plugins are now gone, replaced by a generic ReplyNotifier plugin that handles comments, TrackBacks, and Pingbacks. I also consolidated some functions in the utility library and a few things in the entry subclasses.

I'm debating whether to hold off on the next release, add some features, and go straight to version 1.0. Before that, I want to at least add a simple theme editor. My plan is to do something very simple and hacky: a stylesheet editor. Basically, just a GUI to automatically generate a stylesheet based on settings entered by the user. The idea is that this stylesheet will just be inserted into the page last, thus overriding the default settings for the theme.

Other possibile features include more granular security, support for draft entries, and Atom feeds, among other cleanup. If I'm going to go straight to version 1.0, then I'll probably try to do some of these first. Anyone have any thoughts on other features for 1.0 or opinions on the release schedule?

LnBlog 0.7.3

Well, I finally got around to finishing up LnBlog 0.7.3. You can grab the archive here or get it from the download page.

This release contains mainly minor bug fixes. You can find the details in the change log. It also adds support for per-category RSS feeds to the standard RSS plugins and MetaWeblog API. Note that these are statically generated, just as the regular RSS feeds. Also, I've moved the Archive and GoogleSearch out of the main distribution and onto the plugins page.

That's about it for now. I'll be putting up a couple new plugins up in the next day or two, so stay tuned. In the mean time, please leave a comment or e-mail me if you have any problems, bugs, or suggestions.

LnBlog 0.7.2 is up

I've uploaded LnBlog 0.7.2. You can get it from the download page or just grab the archive here.

This is a bug fix release. The specific fixes are:

  • Fixed errors when trying to edit the sitemap.
  • Fixed the plugin configuration not showing when using PHP5.
  • Added delete links for articles.
  • Added a checkbox on the article edit screen to set the "sticky" state.

Many thanks to MoonMind for pointing out these errors.

As usual, please let me know about any problems, ideas, or feedback by e-mail or by leaving a comment.

LnBlog 0.7.1 "No Need for Web Browsers"

It's release time again! You can now get LnBlog 0.7.1, "No Need for Web Browsers" here or from the download page. Unlike the last release, upgrading from version 0.7.0 to the new version is as simple as usual. Just rename the old folder, upload the new one in its place, and move over your old userdata folder.

This is a feature enhancement release, including some small features and a big feature. The big feature, which turned out to be surprisingly easy to implement, is support for the MetaWeblog API. This is like the Blogger API, in that it allows you to add and edit posts, but better, because it also allows you to add post metadata and upload files to a blog. Note that, like with LnBlog's implementation of the Blogger API, blog and entry IDs are based on the URL, so that the ID of this weblog would be "lnblog", while the ID of this entry would be "lnblog/entries/2006/05/22_1811".

To go along with this, I've also written a small Python program that I call CLIblog-MW, which is bundled with this release. It's a simple script written for Python 2.3 that allows you to make MetaWeblog API calls from the command line and print out the response from the server. This will allow you, with a little scripting, to automate postings and file uploads. For documentation, run the script with the -h option. Among the more useful features are the ability to store authentication information in a profile file and the ability to create new posts based on the contents of a text file.

The other significant feature is a change to the entry add/edit page. You can now upload files when you initially create a post or edit it. You can set the number of possible file uploads in the system.ini file by setting the AllowInitUpload value in the entryconfig section. By way of example, the following code will give you four upload boxes on the page: [entryconfig] AllowInitUpload=4 The default number of boxes, if no value is specified, is one. To disable the upload boxes on the entry add/edit pages, set this to zero.

The last little changes include a compression of the entry input type selection. Now you select the markup type from a drop-down box rather than three radio buttons. You will also find links on the admin page to edit the system.ini and groups.ini files. This is a poor substitute for a proper configuration interface, but it's better than nothing. And last, there are fixes to the return values for some Blogger API methods. In particular, the newPost method was returning a URL when it should have been a unique ID.

As usual, please let me know about any bugs or ideas for improvement. I've put up a support page that lists the various methods for getting support, including my e-mail, the SourceForge forums, and the SourceForge issue tracker. Or you can just leave a comment on this post. Whatever works for you.

LnBlog 0.7.0 Released

Well, I've found all the bugs I'm going to find and added all the features I feel like for now, so it's time for a release. You can now get LnBlog 0.7.0, dubbed "No Need for Speed" (because this is the longest release cycle yet, if I'm not mistaken), from the download page or just grab the archive. Please note that this is a major upgrade, so if you're a current user of LnBlog, please read below for upgrade instructions.

Upgrade Instructions

There are lots of changes to this version, so upgrading is not quite as easy as it normally is. Sorry about that, but the changes had to be made, and it's better to do them sooner than later. This section is only applies to people who are already using LnBlog 0.6.x, so if you are a new user, you can just skip down to the new feature list.

The first thing you'll have to do after uploading the new version and copying over the contents of your userdata folder is to go to the admin page and register your existing blogs. Just type the path in the text box and hit the register button, just like how upgrades used to work.

Second, after you've registered all your blogs, you'll be able to select each of them in the drop-down menu for upgrades. You must upgrade each blog you have. Several of the pages previously used for working with articles have been removed (they were merged with the ones for entries), so if you don't upgrade a blog, the artilces for it simply will not work.

Third, if you've defined a custom sitemap, you will notice that your sitemap shows the links you defined plus a link to each blog you registered. To fix this, from the admin page click the "configure site-wide plugins" link and from there, click the "sitemap" link. Uncheck the "Automatically list all blogs in sitemap" box to go back to just your custom sitemap.

Lastly, consider if you want to make another user an administrator. It is now possible to have more than one administrator account. There is not yet a graphical interface for this, but you can add administrators by editing the new userdata/groups.ini by hand. Just add the username to the "Members" line in the "[administrators]" section. This line is a comma-separated list of usernames, with no spaces between them.

One last thing to note. If you look at your blog settings and check the "edit blog paths" link, you'll notice that the box for the blog root URL is gone. Yeah, I know I just added it last release, but the truth is that it was an ill-conceived hack and it caused more problems than it solved. Currently, all URL computation is done using the host and domain from which the page was requested and by getting the path relative to the document root. In other words, the blog URL is no longer hard-coded anywhere. If somebody needs the ability to set a particular blog URL, we can aded that later in a way that actually works.

New Features

This release includes massive code cleanup and a number of new features. A number of files have been removed and a whole lot of unused or ill-conceived functions and methods have been removed. The security system has been revamped and lots of logic has been moved from the back-end (where it was getting in the way of things like API support) to the front end.

As far as new, user-noticable features go, here's the list.

  • Blog tracking. The system now tracks what blogs you create and keeps a list of them in your LnBlog/userdata/system.ini file. This list is used by the admin page and is also used by the sitemap plugin to build a default sitemap.
  • Partial support for group-based security. Basically, it is now possible to have more than one administrator. More fine-grained group security, and a graphical interface for it, will appear in future releases. The group list and membership data is kept in the new LnBlog/userdata/group.ini file.
  • Another path for plugins and themes. You can now create LnBlog/userdata/themes and LnBlog/userdata/plugins directories for your non-standard themes and plugins. This is just to make upgrades slightly easier if you install non-standard plugins or themes.
  • Support for the Blogger 1.0 API. Check the documentation for details on using and configuring Blogger API support with LnBlog. The XML-RPC support for this feature is provided by an included copy of XML-RPC for PHP 1.2.1.
  • Support for post editor plugins. Basically, you can now use selected JavaScript rich text editors to compose your posts. You can currently download plugins for TinyMCE and FCKEditor from the new plugins page. Note that no such editor is included in the default installation, because the editors take up as much disk space as LnBlog itself.

As usual, if you have any problems or find any bugs, please report them to me by e-mail or by leaving a comment. I have set up a SourceForge project for LnBlog and plan to add things like support forums and mailing lists before too long. I will post an announcement here when that happens.

LnBlog 0.7.0 beta 1

Well, it's finally here: the first beta release of LnBlog 0.7.0. You can download it here if you're feeling adventurous. Note that this version requires that you run an upgrade on each of your blogs in order for it to work correctly, so I strongly recommend that you make backup copies of all your blog directories as well as you LnBlog directory.  Also note that you'll need to register your blogs before you can do this.  It's not hard - just type the path in the box and hit the button, just like running an upgrade.  This is just so that the system knows about them. New blogs are registered when they are created.

This release includes massive code cleanup and a number of new features. On the cleanup side, if you look in the LnBlog/pages directory, you'll notice that the article handling pages are gone. That's because they've been folded into the blog entry pages. This is also the reason that you need to upgrade your blog wrappers: if you don't, articles simply won't work. I've also moved a lot of the logic out of the back-end classes and into the page files, where it belongs. The classes were simply getting too smart. While this was fine for normal operation, and made for really small pages, it got me into serious trouble when I started adding support for the Blogger API, because the classes all assumed they were interacting with a client browser.

But enough of that. You probably want to know about the new features. Well, here's an incomplete list for you, in no particular order:

  • Blog tracking. The system now tracks what blogs you create and keeps a list of them. So now, instead of typing in the blog path on the administration page, you can just select it from a drop-down list. Note that if you are upgrading from an old installation, you will have to type the same old path in the "register blog" box on the admin page to get it in the list. Or you can just add the blogs to the BlogList line (comma-separated, no spaces) in your LnBlog/userdata/system.ini file.
  • Partial support for group-based security. Basically, it is now possible to have more than one administrator. More meaningful group security will come later. There is no graphical interface for this yet, but you can set users in groups by adding their name to the appropriate comma-delimited list in your LnBlog/userdata/group.ini file.
  • Another path for plugins and themes. You can now create LnBlog/userdata/themes and LnBlog/userdata/plugins directories for your non-standard themes and plugins. This just makes it a little easier to upgrade, as you don't have to individually sort out and copy any extra stuff you've installed.
  • Support for the Blogger 1.0 API. Use your LnBlog/blogger.php file as the URL for the requests. One thing to note abou the API is that the blogger.getTemplate and blogger.setTemplate methods are not implemented. This is because they don't really apply to the way LnBlog works.
  • Support for post editor plugins. That's right, now that the pre-releases of Opera 9 have support for edit mode, I've finally added the ability to use a JavaScript rich text editor. There is no such editor included in the standard release (as the editor would take up more space than the rest of LnBlog), but you can download plugins for TinyMCE and FCKEditor from the new plugins page. Of course, you can only enable one such plugin at a time, but that shouldn't be surprising.

That's about it for now. If you have any problems or find any bugs, please report them to me by e-mail or by leaving a comment. I'm thinking that I'll finish off the Blogger API support, fix any more bugs I find, and call that the final release. There are a number of other things to add, but I'd like to stick a little more to the "release early and often" philosophy.

LnBlog 0.6.5 "No need for config.php"

Well, I've finally done my lst-minute cleanup and my highly irresponsible testing, resulting in LnBlog 0.6.5 now being available for download. You can grab the ZIP archive here, or get the documentation, checksums, and all that good stuff from the download page.

Before I list the changes, I'd like to thank MoonMind for providing lots of feedback and bug reports.. Thanks also to Ben Schorr for the bug reports. Improving software is always easier when you get helpful feedback.

There are a number of noteworthy changes in this release. First, it is important to note that the config.php file format has changed. This means that you must upgrade your blogs immediately after uploading the new version. To do this, login to your LnBlog administration page, enter the path of the blog (the same one you gave when you created it) in the "upgrade to current version" box, and click the upgrade button. You must do this for each blog you have.

The reason for this change is to facilitate changing the LnBlog installation path/URL and the blog URL. In older versions, these paths and URLs were stored in the config.php file in each directory. However, since these paths were computed automatically, there was no easy way to change them. Now, the config.php files simply include a pathconfig.php file which is located in the blog root. The blog root is calculated at run-time based on the type of directory, i.e. how far it is from the blog root. This allows you to more easily adjust these paths and URLs. Of course, most users won't need to do this, but for those who do, it is now easy. There's even a graphical interface for it. You can find the link on the weblog settings page.

The other noticable changes have to do with plugins. The new version of DisableComments is standard in this release. This version includes a feature to automatically disable comments and trackbacks on posts more than a certain number of days old.

I've also added two new plugins. The first, which is disabled by default, is the PrivateBlog plugin. When loaded, this allows you to set a list of users who are allowed to read the blog. Any user who is not on this list (and can't post to the blog) will simply be redirected to the blog login page. Not an idea solution, but it's more of a proof of concept than anything else.

The second new plugin is ContentBan. This plugin allows you to create files which contain lists of regular expressions to ban. You simply specify the regular expressions, one per line and complete with delimiters and options (using PHP's PCRE syntax), and any comment or trackback that matches one of those expressions in any of its fields will be refused. Of course, you should use this with care, as it is easy to be overzealous in your banning. Also, an ill-formed regular expression can cause errors that prevent anyone from posting.

Lastly, there's also a small interface change. I thought the administration sidebar panel was getting crowded, so I created a new event for sidebar plugins to capture. There is now a separate sidebar panel for plugin configuration and configuration links generated by plugins. Hopefully, that will make things slightly cleaner.

That's pretty much it for the interesting changes. The rest are mostly small bug fixes and expanded documentation. See the change log for full details. As usual, if you find any problems, please e-mail me or leave a comment.

LnBlog 0.6.4 released

Time for yet another maintenance release. LnBlog 0.6.4 is now available. This release includes a critical security fix for users who have AUTH_USE_SESSION set to false. If that's you, consider this a required upgrade. Users who are using the default authentication configuration are not affected by this bug.

In other news, this release also fixes several minor bugs and annoyances. For starters, the broken "back to plugin list" links in the plugin configuration now works. I've also removed the broken default code when the pageheader plugin is disabled and fixed the trailing newline bug in LBCode that's been annoying me for some time.

By way of small "features," I added a warning when trying to create a blog in your LnBlog installation directory, because that just won't work. I also added a little feature to the LBCode URL auto-translation to allow absolutizing to the blog root. Previously, any URL given in a url or img tag that didn't contain slashes had the URL of the entry it was stored in prepended to it, so that it would display correctly on the front page or in RSS feeds. Now, however, you give links relative to the blog root by including a slash in them and links relative to the root of your site by starting them with a slash. So, for example, when I post a link to the LnBlog download page in this blog, I can give content/download/, whereas if I want to link to my computing blog, I can give /linlog/. Just a little extra convenience.

As usual, you can grab the new archive here or go to the download page itself and grab the signature, checksums, and documentation. If you find any problems or have any questions, you can e-mail me or post a comment.

LnBlog 0.6.3 is up

Well, I finally got around to uploading the next maintenance release. You can grab the archive here or get all the associated goodies from the download page.

This release fixes the previously mentioned sitemap problem, sorts blacklisted IP addresses for easier management, and adds out of the box support for running from /home/user/public_html (which it could do before, but required setting a configuration regex). The one big "feature" is a redesign of the ever-so-crappy plugin loading configuration page. Now, instead of three crappy text areas, it uses a table with text boxes to enter the load order and check boxes to disable loading a file.

As usual, please e-mail me or leave a comment if you have any problems or questions.

LnBlog 0.6.2, "No Need to delete"

I've uploaded release 0.6.2 of LnBlog. This is another bug-fix release. Thanks to R. Damon for reporting several of the issues. Here's the list of fixes:

  1. Fixes bug that broke support for PHP 5.
  2. Fixes warning messages about DOCUMENT_ROOT in initial setup.
  3. Fixes broken links in terminal theme.
  4. Fixes problem with deleting entries when history is disabled (which is the default since version 0.6.0).

You can get the new version here or from the download page. As usual, please mail me or leave a comment if you have any questions or find any bugs.

LnBlog 0.6.1 is up

I finally got around to uploading the first maintenance release for LnBlog 0.6. You can get it from the download page. My apologies for not getting it out there sooner, but I've been pretty busy lately and just haven't had time to work on this project.

This fixes several bugs in the 0.6.0 release. These bugs include:

  • Bad user profile links in comments.
  • Comments not being added when posting from pretty permalink page.
  • The "post a comment" link not showing up in tuxice theme.
  • The "remember me" feature for comments not working.

As usual, please e-mail me or leave a comment if you have any questions, feedback, or if you find any other bugs.

LnBlog 0.6.0 - No Need for passwd.php

LnBlog 0.6.0, "No Need for passwd.php," is now available. You can just grab the archive here or get it from the download page along with checksums and signature. The current documentation is available online or for download. The upgrade procedure is simply the usual process of uploading the new version and copying your existing userdata directory into it.

This release includes a number of new features as well as some file format changes. I'll start with the new features, since they're the point of interest for most people. For the full list of changes, please consult the change log.

The most obvious change is the addition of a native search plugin in the sidebar. The old search plugin (which is still included, but disabled by default) just ran your query through Google, which obviously didn't work if your site hadn't been indexed by Google. The new search utility will simply scan all blog entries for the strings in the search box. You can simply separate all your search terms by spaces and it will return a list of all entries that contain all the terms. Alternatively, you can search using a regular expression by enclosing the expression in slashes (e.g. /micro.*/ would find references to Microsoft.). Note that all searches are case-insensitive.

The next big user-visible change is that the JavaScript post editor has been reworked. First, the controls are smaller and look nicer, plus you can click the (+) and (-) links to hide them. Second, the dual text and attribute boxes for entering the markup are now gone. When you click an editor button, a JavaScript popup will prompt you for the text, just as in most other JavaScript editors. (Anybody who actually liked the text box approach can re-enable it by adding EDITOR_SHOW_INLINE_BOXES=1 in your userconfig.cfg file.) Also, if you select some text and then click an editor button, it will simply apply the markup to that text, e.g. select a word and click the bold button to apply bold tags. Last, you'll notice a section, hidden by default, which contains buttons that add HTML entities for various mathematical symbols. I added these because I wanted them, so feel free to ignore them. You can even turn them off by adding EDITOR_SHOW_SYMBOLS=0 in your userconfig.cfg file.

The last big new feature is the addition of user profiles. When you click on the name of a post owner, it will now take you to that person's user profile. This is just a page that displays the person's name, e-mail address, homepage, etc. You can also upload files to your profile and add custom HTML markup to the end of it. All this is done through the "Edit user information" page linked in the sidebar.

In addition to the basic profile information mentioned above, you also have the ability to add custom fields to be displayed in profiles. This is done by creating a profile.ini file, which has the format:
[profile fields]
fieldname=Description of the field
secondfield=Another field description

You can put this either in your userdata folder, in which case the custom fields will apply to all users, or in a single user profile directory, which will make them apply to only that user.

Note that the addition of user profiles also means a change in the files used to store user information. In other words, the LnBlog/userdata/passwd.php file is no longer needed. New account information will be stored under the user's profile directory. The password information will be in a passwd.php file and the other profile information in a user.ini file. Note that reading the old passwd.php file is still supported, so there is no need to run any kind of update utility. When you edit a user's profile, it will be automatically converted to the new format.

There is also another file format change. The blog data is now stored in a blogdata.ini file. This probably seems pretty pointless, but the general idea here is to try to gradually move away from the plethora of ad hoc file formats that I started with. As with the user information, reading the old blogdata.txt file is still supported, so there's no need to do anything special. The next time you edit your blog settings, the file will be automatically converted to the new format.

Before I forget, I should probably mention the other noticeable changes in this version. First, there's now a blog setting for the default markup mode (auto, LBCode, or HTML) to use for entries. Second, there are now separate options for turning off comments and trackbacks on individual entries. Third, the setting to turn on comments and trackbacks for articles now actually works. Forth, the articles sidebar plugin has a few new options, including the ability to add custom links. The edit link is in the articles section of the sidebar and it uses the same type of format as the sitemap, i.e. a list of hyperlinks separated by newlines.

I think that pretty much covers it for this release. If you have any questions, comments, or find any bugs, please feel free to e-mail me or leave a comment. On the off chance that anyone is interested, I also welcome contributions of code, themes, plugins, or pretty much anything else.

LnBlog 0.5.4 - "No Need for Testing"

This always happens to me - come out with a nice new release with lots of cool features and discover that it has a huge, glaring bug in it that makes it completely unusable for some people. Well, at least I found the bug and squashed it. At work, I occasionally have to fix bugs that have been lurking in software and messing up reports for years before anyone noticed them.

This is a critical bug fix release. This particular bug appears to have been introduced in version 0.5.1 and affects users who are running on web servers without the gettext extension enabled. Users who have gettext enabled (i.e. people who could actually use the software) are not affected by this issue and, hence, do not need to upgrade. Many thanks to Brandon for reporting this problem.

If you are affected by this bug and have PHP's error reporting turned on, you will see a message that says something like:
Fatal error: Call to undefined function: _() in /path/to/lnblog/blogconfig.php on line 133
This is due to an error in the blogconfig.php script. I mistakenly tried to mark a string for internationalization before loading the lib/i18n.php file, which contains the _() ad hoc internationalization function. Users with gettext enabled are not affected because LnBlog only uses the custom version of _() defined in lib/i18n.php if the gettext extension is not loaded. When it is present, the _() function is provided by gettext itself.

If you are affected by this bug, you can download the new release from the download page. Alternatively, you can get the same effect by downloading the fixed blogconfig.php file and apply it as described on this page.

Bug fix for 0.5.3

Oops! I messed up!

Apparently I introduced a bug into the last few releases for people who don't have the gettext extension enabled. I forgot to turn gettext support back off on one of my test systems, so I didn't catch this. My apologies to anyone affected.

Bascially, this bug causes an "undefined function _()" error in the blogconfig.php file. This is caused by an attempt to mark a string for translation before the ad hoc translation code is loaded. This only affects users running on servers without the gettext extension enabled. If gettext is enabled, then it will supply the _() function and there is no problem.

I will upload a new version and update the Freshmeat page later today or tomorrow. In the mean time, you can download the fix here. Just rename this file to "blogconfig.php" and copy it into the root of your LnBlog folder, overwriting the old one.

LnBlog 0.5.3 - "No Need for Spam"

It's release time again! LnBlog 0.5.3, also known as "No Need for Spam," is now available for download. You can get it from the download page as usual. You may also want to note that I've decided to join the 21st century and am now cryptographically signing the release archives with GnuPG. If you don't know what that means, don't worry about it. If you do know, then you can find my public key here.

This release adds a number of significant features. The biggest features are actually all implemented as standard plugins, meaning you can customize them and/or turn them off. The first of these is a plugin to blacklist IP addresses from submitting comments or trackbacks. This has several features. First, when you are logged in, it displays the IP address from which a comment or trackback was posted along with a link to ban it. If you are logged in as the administrator, there is also a "global ban" link. Basically, the idea is that you can ban apply a ban for just the current blog or globally for all blogs managed by LnBlog. The two files are merged when the plugin loads, so the blocking rules from both will be applied. If an IP address is found in one of those files, any comments or trackbacks it submits will just be discarded. And just as side note, if you want to make your regular account the administrator in order to make global banning more convenient, you can do that by creating a userconfig.cfg file in your LnBlog userdata directory and adding the following line to it:
ADMIN_USER = your_username_here
Note that this will make the administrator account into a regular user. Of course, that probably isn't a problem for most people.

As for the IP ban lists themselves, they are actually a list of regular expressions, one per line. When you click one of the ban links, the actual IP address is added to the appropriate ban file. However, you can edit the file from a sidebar link and actually change those lines to use PREG (Perl-compatible regular expression) syntax. So, for example, if you're getting spammed by the whole range of IP addresses between and, you could block that entire subnet by simply adding 123.45.67.* to the ban file. If you're a real regular expression wizard, you could get really fancy, but this should be sufficient for most people.

The next spam-related feature in this release is another plugin, this time to just turn off comment and/or trackback posting for your whole blog. This plugin has settings that allow you to turn off trackbacks and to turn off comments either for everybody or just for people who are not logged in. This is for those who would rather just not deal with comment or trackback spam at all.

The third semi-spam-related feature is a plugin to notify you by e-mail when a trackback ping is received by an entry. Basically, this is exactly the same as the comment notification plugin, except for trackbacks. This way, you'll actually know when you get trackback spam.

The last spam-related feature is just the ability to handle trackback pings. You can now delete received trackbacks and turning off comments for an entry will also turn off trackbacks. Note that currently, the confirmation for trackback deletion is only in JavaScript, so if you have JavaScript disabled, clicking the delete link will delete the trackback ping immediately. Just an FYI.

One more option on the plugin front, it is now possible to add your own custom links to the articles section of the sidebar. When you log in, you will now see a link for that at the bottom of the articles section. The file format and interface is the same as for modifying the sitemap.

The last big feature is pretty permalinks for entries. Rather than the date and time, the last component of permalinks will now be a sanitized version of the subject line. Of course, the old-style permalinks will still work, even for new entries, so there is no need to convert anything. I've just added some code to create a wrapper PHP script with a nice name whenever an entry is added or modified. The other nice thing about this is that if you change the subject of an entry, the link with the old subject will still work.

That about covers the major changes for this release. I also made the plugin configuration page a little easier to use, added JavaScript confirmation for comment deletion, added a redirect to prevent duplicating comments, and fixed several bugs, such as tags being lost during post previews. Check the change log for details.

As always, leave a comment or e-mail me if you have any problems, questions, or comments. Enjoy!

LnBlog 0.5.2 is out

As promised, version 0.5.2 is now available. You can get it from the download page.

As I mentioned in the last post, new features include support for tags and an interface for configuring which plugins are loaded and in what order. You will have to log in to the administration pages and run an update on each blog for this.

In addition, I've added a bunch of options to various plugins. For instance, the title text for each sidebar section is now configurable and the title will be suppressed completely if you set it to the empty string. I also fixed up the "smooth" theme to the point where people might actually consider using it. It's a fixed-width layout with rounded corners that uses the same color scheme as the default theme. There were also a few other changes, including a bug fix for comment deletion. You can check the change log for details.

As usual, report any bugs, feature requests, or other questions by e-mailing me or leaving a comment. Merry X-mas!