Changes that are all gravy are marked with '*'. Changes that break backwards compatibility are marked with 'B'. If upgrading to a version with such changes, please make sure that your configuration and data set are properly converted. Changes to which you should otherwise pay special attention are marked with '!'. Major changes to the code as opposed to the functionality are marked with 'C', 'CB', or 'C!'. These generally go at the end of a release's changelog, since fewer people are likely to be interested. February 13, 2005: 2.6.1, "Kind Of A Penguin" --------------------------------------------- ! Fixed a bug found by Jarno which could allow an unauthenticated user to take actions on comments. * Added per-comment permalinks based on human-readable date. * Fixed a bug that was causing entries to lose their categories when saved as draft. (Fixed for real this time.) December 14, 2004: 2.6, "How Do Ya Like Them Aardvarks?" -------------------------------------------------------- * Added the ability to recieve new comments via email. You won't get your own comments if NewsBruiser can be certain the comment was actually posted by you. (You need to be authenticated when you post the comment, and either your notebook needs to be set up as having only one author or the email address you give when you post the comment needs to be the same one you gave as the notebook contact address.) * You can now import entries from an Atom feed. * Fixed a security bug that allowed posting of comments to entries even after the comment post timeout had passed, for those willing to hack the URLs. * Greatly improved the RSS import functionality by having it use the famous feedparser library when running under a version of Python that can use it. * Streamlined the save-as-draft/post/edit/edit-some-more cycle by displaying the edit form on the same page as the entry rendering. * If you're authenticated, it's now possible to get every entry ever published to your notebook by passing in '*' as the date path to the syndicate screen (eg. nb.cgi/syndicate/*/?version=2.0). This is excellent for backing up or exporting your entire notebook. * Importers will now automatically convert MS smart quotes and other mischevious characters into their HTML equivalents. * If you're authenticated when you post a comment, the comment will always be accepted and will implicitly be marked as non-spam. * It's now possible to specify a directory on the server when importing from a 'file on the server'; NewsBruiser will try to import each file in that directory in a single operation. * Fixed a bug that caused the per-entry comment setting to be lost when you saved an entry as draft. * Greatly improved the attachment interface on the edit screen by using Javascript. * The SummaryList plugin is now faster and can now show comments and trackbacks, courtesy of Dean Kusler (deank at unt dot edu). * Fixed some problems with the attachment manager, found by Phil Schwartz (phil at mailzilla dot net). October 18, 2004: 2.5 "Fox and the Grapes" ------------------------------------------ * Changed the weblog ping mechanism to use Ping-O-Matic, which offloads the work of pinging and keeping track of the myriad weblog pinging services. * In lofi syndication mode, display the first paragraph of text, not the first 50 characters. This makes lofi mode more like the regular mode of other weblog programs. * Added a new syndication mode that gets only the titles of entries. * All NewsBruiser pages for a notebook now provide an "alternate" link with the syndication feed, making it possible to do RSS autodiscovery. * The RSS importer will now import from your blogroll if you don't specify an RSS feed from which to import. * Added a text-based interface for filing entries in categories when posting an entry. * The portal screen will no longer say "Notebook list" when you're looking at one specific notebook (or there is only one notebook); it will instead use the name of that notebook. * Added the ability to associate a URL with each entry, Such a URL is linked to the title. NewsBruiser can also retrieve the title of the page at the other end of the URL, and use that as the entry title. * Perhaps stretching the limits of what plugins should go into core NewsBruiser, you can now mirror your del.icio.us-like NewsBruiser entries to your del.icio.us account. * Rationalized encodings. Imported text will be encoded to UTF-8 if possible. Generated RSS feeds will now (correctly) claim to be UTF-8 instead of ISO-8859-1, and will no longer be mangled to ASCII. * Fixed a redirection bug with the login screen. * Internationalized a lot of NewsBruiser text. Translation into French courtesy of Jean-Pierre Chretien. C! Refactored the importer architecture to avoid the extremely annoying case where you do a recursive import and it takes a million years and doesn't work because of some stupid problem. Errors will now be detected earlier and imports will fail much more quickly if there's a problem. Unfortunately this means that if you wrote an importer, you have to rewrite it to the (slightly different) new API. June 11, 2004: 2.4.1, "Anole Analogy" ------------------------------------- * Added a 'summary list', a sort of mini-entry-list you can put on every page that displays information about the few most recent entries in the notebook. Plugin provided by Timo Virkkala (timo dot virkkala at cs dot helsinki dot fi). B Fixed a bug that was preventing the date range templates from being interpolated by default on the front page. If your custom theme has empty year-span, month-span, or day-span templates (which several of the default themes did), you can't do that any longer. Either get rid of those lines in your theme configuration, or set them to the same as the NewsBruiser defaults (year-span-template=%M, month-span-template=%D, day-span-template=%E). ! NewsBruiser now has an internationalization framework. A translation to French is underway. Note that NewsBruiser is *not* internationalized yet; we're just starting to work on getting it there. * Fixed a bug that was creating invalid RSS 2.0 when you were using a Creative Commons license (the namespace declaration was missing). * Improved the Creative Commons licensing RDF so that it now puts the full RDF as recommended by Creative Commons. * Added template directives for getting the hour, minute, and second an entry was posted. * Hardened the entry deletion screen such that you can now delete even an entry that has serious data format problems or otherwise won't display. * Added a generic Blosxom importer, originally written by Zack Weinberg (zackw at panix dot com). If your Blosxom install uses plugins, you need to hack the importer to make it respect any of the plugins' changes to the dataset. * Added the ability for an importer to import from a file or directory on the server in addition to an uploaded file. * Fixed a bug that, when you ran NewsBruiser on a Mac, was preventing the second and subsequent paragraphs of comments from being loaded. * Fixed a bug in the MetaWeblog XML-RPC API which was breaking the 'add new entry' method. Patch provided by Brice Tebbs (brice at bricetebbs dot com) * Fixed several bugs in the Moveable Type parser library and importer, found by Rachel Chalmers (rachel@goop.org) and Jeremy Fitzhardinge (jeremy@goop.org). * Extended the number of HTML tags that HTMLTidy recognizes, thanks to Anirvan Chatterjee (anirvan at chatterjee dot net). * Improved timezone handling. Day-based themes like Sobelow now work in conjunction with entries not in the notebook timezone. * Improved the error handling of the importers. * Added some minor HTML tweaks for XHTML compliance, courtesy of Timo. Also fixed a bug Timo found that was preventing the '%2' directive from working in some cases. BC The Importer.getFileImportLabel method was renamed to getUploadedFileImportLabel to avoid ambiguity with getLocalFileImportLabel. I changed all the importers that come with NewsBruiser, but you might have to change any importers you wrote. May 27, 2004: Version 2.4, "Creative Cormorant" ----------------------------------------------- * Added rudimentary notebook licensing support, including support for Creative Commons licenses. It is a little preachy about using a CC license, but not pushy. * Fixed a bug that was destroying data in the blogroll control and other TEXTAREA controls. * Fixed a bug that was preventing people from using the 'Security' options screen. * Fixed the MIME types of syndication feeds so that they'll validate. Patch provided by Paul Collins (paul at ondioline dot org). * Fixed several bugs in the calendar CGI, found by Jarno Vitarnen (jajvirta at hole dot fi). * Got rid of more installation edge cases. C Added the ability for plugins to define hooks into the syndication feed renderers. This is used by the license code. May 19, 2004: Version 2.3, "Instant Karma Chameleon" ---------------------------------------------------- ! The internal search engine is greatly improved; you can now search for links, for words found in link titles, and for words right next to HTML tags where sometimes you couldn't before. You can also search an entry's comments and incoming trackbacks. I also fixed a bug in the indexer library which was causing index corruption whenever an entry was deleted or imported. For all these reasons, if you're upgrading, please rebuild your notebook indexes from the 'Util' screen. ! Added the ability to use templates to configure the front page of a notebook, as well as to add a global header and footer. The header, footer, and front page can include many new and newly exposed pieces of display such as a calendar, archive links, blogroll, and NewsBruiser version. See the template documentation for details. * You can now import entries (including comments and incoming trackbacks) from a Movable Type installation. If you import, make sure comments and incoming trackbacks are turned on for your notebook, so that you'll be able to see them. * Added the ability to manage a blogroll or list of links. * Added the ability to display a list of links forming a monthly archive. * NewsBruiser now works fine with Python 2.3 out of the box. * Added the ability to import notebook entries via screen-scraping. * Fixed time zone handling. Time zones are now stored with each entry, so that if the time zone of the notebook changes, the time of previous entries will be preserved. If you go to the other side of the world and post from there, then when you come back those posts will display the timezone of the place you posted from. It's also possible to specify the timezone for an entry you import, and real globetrotters can set things up to specify a timezone when they post an entry. There is a tension between people who travel between time zones whose abbreviations they know (like PST-EST in the US), when you want to see the time zone abbreviation, and people who go from their home time zone to a strange place, when you want to see the GMT offset of the zone. Right now it's possible to see strange (to you) time zone codes when you'd prefer to see GMT offsets. I'm going to address this in a future release. * You can now choose which syndication format to use by default. Instead of a text link on your front page, you now get a nice graphical link using Nick Moffitt's clever CSS styles. * Fixed bad links in the calendar control. * Added the ability to run a notebook that's only a bunch of syndication feeds (eg. of entries imported from elsewhere). The UI side of this is not yet complete. * Imported entries will have categories automatically created for them if they specify categories that don't exist. * In addition to the preexisting robot index granularities, you can now prohibit web robots from indexing your entries at all. * Improved the usability of the importer interface. * For some importers (Moveable Type and RSS feed), you can do an import from a file that you upload, instead of specifying a URL. * Added a dump of the full-text index for debugging purposes. B Disabled the Blogger import API since it doesn't seem to be up anymore. CB Changed from a list to a hash the format containing information about entries to be imported. Entries can now specify their original URLs, which will be mantained and in some cases used in preference to the imported URL. They can also specify comments and trackback pings to be imported--see the Moveable Type importer for an example. CB Moved the command maps from Viewer into their own module, CommandMaps. If you defined plugins that changed the standard command map, you need to change them to change the new command maps. CB Several methods, such as printRobotExclusionTag, have been changed from 'print' methods which print out a string to 'get' methods which return a string. March 23, 2004: Version 2.2, "The Rothe Hits!" ---------------------------------------------- * NewsBruiser now has support for the Atom syndication format. * You can now enable comments for particular entries, instead of having to enable them for every entry on your site if you want them at all. * To further thwart comment spam, you can have entries accept comments only for a certain number of days. * Turning off comments won't hide comments already posted. * In syndication files, times are now always provided in GMT, and the date formats are completely compliant with whatever standards prevail for that syndication format. * Fixed a bug where a suspicious-looking comment didn't show up even if you'd marked it as good. * Made installation procedure more user-friendly. C NewsBruiser now keeps track of when an entry was modified. C NewsBruiser is now even more self-bootstrapping in terms of figuring out where it's been installed. October 28, 2003: 2.1, "Release Early, Release The Hounds" ---------------------------------------------------------- * NewsBruiser now has a simple comment system. * NewsBruiser now uses Baysean classification to try to trap trackback and comment spam. Help it classify trackbacks and comments as spam or non-spam, and eventually it will be able to classify them itself, and even prevent spam from being posted. * New theme: "Nathan". * You can now mirror a NewsBruiser category to a topic on the Internet Topic Exchange (http://topicexchange.com) * Templates can now print the absolute URL to a particular entry. * Fixed a Python 2 incompatibility found by Jens Quade (jq at jquade dot de). * Fixed a bug in which setting the system time zone actually set the time zone to GMT. Bug found by Matt Kraai (kraai at ftbfs dot org). * Fixed a bugs in handling random entries which showed up with probability 1/[number of entries+1]. Also found by Matt Kraii. * Revamped the trackback templates to allow more different types of display. C Moved the category code into a plugin, and made the category template directives more mneumonic. October 6, 2003: 2.0, "Master Planarian" ---------------------------------------- B! Instead of 26 CGIs, there is now 1 CGI which dispatches to the appropriate different piece of code for a request. If you can't set rewrite rules for your site, you can avoid URL breakage by running the script tools/writeCGIs.py from the base NewsBruiser directory. It will write a bunch of old-style wrapper CGIs in the base directory, and all your old URLs will continue working. An easier (if you can do it) way to make all the old URLs work is with the following Apache rewrite rules: RewriteRule ^FOO/nb.cgi/ - [L] RewriteRule ^FOO([^/]*).cgi/?(.*)$ /FOO/nb.cgi/$1/$2 [L] Where "FOO" is the path to your NewsBruiser directory. Many changes were made under the covers to deal with this; among other things, the name of a CGI is now kept in the NAME field of that CGI's class, rather than being kept in the cfg module as a URL fragment. A URL rewriter is now required, and the base URLRewriter class, used by default, adds on the base NewsBruiser URL to every generated URL. There are major changes to cfg.py in this release, so if you changed cfg.py in your installation, watch out. If you wrote a URLRewriter, you need to rewrite it to deal with URLs that don't already have the base URL appended to them (I'm pretty sure only Gary and myself have written URLRewriters, though). The URLRewriter class was moved to plugin/system/rewrite/. B! cfg.py is now completely optional. You should only need to have one if you changed it previously, or if you want to take advantage of URL rewriting, static rendering, or other plugins not configurable from the user interface. Because NewsBruiser no longer ships with a cfg.py, your changes won't be overwritten anymore when you upgrade in the future. If you upgraded and want non-default values for the things controlled by cfg.py, you need to change your current file (mainly by prepending 'self.' to all the variables), but this should be the last time you have to do so. * You can now have NewsBruiser send out email about your entries as you post them. This is configurable through cfg.py. * NewsBruiser now supports outgoing and incoming trackback. * Fixed some corner cases during installation, and created a screen to help the user through creating a config.location file when they specify a nonstandard data directory. Many installation corner cases found and patches provided by Dan Grassi (lexar at grassi dot org). * You can now tell NewsBruiser to automatically link bare URLs found in your entries. This saves you from typing the A tags and from having to copy-and-paste. The code to do this was written mainly by Gary. * You can now tell NewsBruiser to treat your entries as reST-formatted text instead of HTML. Entries will automatically be converted to HTML. This feature will only appear if you have the docutils module installed on your site (which requires Python 2.2 or later). http://docutils.sourceforge.net/ http://docutils.sourceforge.net/rst.html * You can now choose to have the HTML in your entries automatically cleaned up and made into valid XHTML. This is made possible by Gary's HTMLTidy library. * There is now basic functionality for keeping static renderings of entries and groups of entries as files on the filesystem, where web browsers or SSIs can access them. This saves time and CGI invocations. The downside is that it's possible for the static renderings to get out of sync with what the site should look like (this is one of the things that annoys people about Blogger and Movable Type). With NewsBruiser, however, this should only happen if you make changes to the UI settings. This is an experimental feature which requires that you change Python code to enable it. Look in nb/cfg.py.sample and in nb/plugin/entry/export/StaticRendering/. * It's now possible to ping multiple URLs a la weblogs.com. Both weblogs.com and blo.gs are now pinged by default. * Fixed a bug which prevented the user from unsetting a theme. * Fixed yet another bug to do with categories with un-URLable characters in them. * Fixed a few installation corner cases. * You can now turn timing information on and off through the interface on a per-notebook basis, rather than having to hack a global variable. C! NewsBruiser now has a rudimentary plugin system inspired by Vellum's plugin system. Plugins can define new option groups and options, add filters to change the way entry text is displayed or stored, react to various NewsBruiser events like an entry being published, and define new screens. More functionality will be forthcoming in the future. Right now there are several plugins, some implementing new features in this release (such as trackback), some incorporating existing functionality that was moved out of the main code. My goal is to move more of the currently 'core' NewsBruiser functionality (eg. categories and attachments) into plugins. April 8, 2003: 1.13.0, "A Small, Friendly Jackal" ------------------------------------------------- ! NewsBruiser now has a completely web-based setup procedure. There's no longer any need for setup.py. You will be sent into the setup procedure the first time you try to access NewsBruiser. ! You can now create, reorder, and delete notebooks through the user interface. This requires the master NewsBruiser password, which for those upgrading is the default notebook password. The .nbrc file now only needs to contain the encrypted master password. You should visit index.cgi once to move all .nbrc information into the individual notebook configuration files. Then you can remove everything in .nbrc except for the master password, on a line by itself. * Once you get rid of any pre-1.13 configuration file, you can change the master NewsBruiser password from within NewsBruiser. This means that NewsBruiser is now entirely administrable from the web. * You can now change the notebook password from within NewsBruiser. * You can now set a notebook as "private", which either prevents unauthenticated users from so much as looking at it (if you have cookie authentication turned on), or simply hides it from lists (otherwise). Based on Gary Benson code. * There is now a statistic gathering interface and a new CGI (stats.cgi) for displaying statistics. Many statistics are implemented: number of entries, total entry size, longest entry, etc. * Performance improvements of 12%-25% when rendering entries (taking into account the template system slowdown mentioned below). * Added Gary Benson's "Inauspicious" and "Orangery" themes. * The configuration interface will now mantain the values you submitted even if some of them are invalid. This way you don't lose all of your values if one of them has an error. * You can now suppress the stylesheet given with an RSS feed. This is mainly useful for doing a NewsBruiser-to-NewsBruiser import when using Python 1.5 on the destination installation. * Bugfix: you can now import entries from an RSS feed using Python 1.5, unless the RSS feed contains a stylesheet, in which case you'll get an error. This is a problem in the 1.5 xmllib. * By default, the edit CGI now only retrieves entries from the current day (or the last 10 entries if there are no entries for the current day). * Minor improvements to the main screen, especially as regards getting rid of irrelevant UI controls when a notebook has no entries. * Added three new template directives: %url-currentYear, %url-currentMonth, and %url-currentDay. These can be used to create permalinks to the working year, month, or day. Changed the Sobelow theme to use %url-currentDay instead of the horrible hack using parts of the current date. Inauspicious also uses %url-currentDay. * Fixed a problem where the date template options were finding validation errors even when there was nothing wrong with the templates. * You can now pass in a "number" argument to random.cgi to get more than one random entry. B The %, and %c# template directives no longer work; they've been replaced by the %category-commaIfNotFirst and %category-numberOfCategories directive. If you used %, in your category template, you need to change that template. All the themes that used these directives have been changed. B The %c# template directive no longer works; it's been replaced by the %category-numberOfCategories directive. If you used %c# in your category template, you need to change that template. All the themes that used it have been changed. C The space of one- and two-letter template directives was getting crowded, so I rewrote the template system to be able to handle template directives of any length. It's now in a standalone library called Template! The Musical. The upside is that NewsBruiser can now have more and easier-to-remember template directives, and that the template system can be used in other applications. The downside is that the template system is about 5% slower than when it was hard-coded, and two directives (see above) no longer work. C Factored out the option loading code in I Want Options so that you can read in additional option definition stores at runtime. This is not currently used, but it's a nice library addition and hopefully NewsBruiser will soon have cause to use it. I Want Options was recently the subject of a PyCon 2003 presentation on Web-based configuration systems; see: http://www.crummy.com/devel/PyCon2003/Beyond%20The%20Config%20File.htm C Simplified the entry format to take up less space (about 160 fewer bytes per entry). Because of block-allocated storage it's unlikely that this will actually save any space on your system, but there will be less junk in the entry files. C Moved the category CGIs into the CategoryCGIs module. March 4, 2003: 1.12.1, "Rings of the Rattlesnake" ------------------------------------------------- * NewsBruiser can now import entries directly from a mod_virgule site such as Advogato or Badvogato. * NewsBruiser now supports syndication in Epistula Syndication Format (http://www.aquarionics.com/article/name/esf). * Minor importing bugfixes and enhancements. ! The rss.cgi CGI is now deprecated (because it's not just for RSS anymore); you should use syndicate.cgi instead. rss.cgi still works (and it doesn't just do an HTTP redirect to syndicate.cgi, which would break some RSS aggregators), so don't worry too much. All internal NewsBruiser links have been changed. * Major improvements to the configuration interface: * The configuration interface now validates the values you submit. * Configuration options which depend on another configuration checkbox being set won't show up if that checkbox isn't set. This simplifies the configuration screens. * Changed the time zone and syndication language options from freeform text entries to drop-down selection boxes. * Changed the author list option from a text box with confusing instructions to a series of radio buttons plus a text box with non-confusing instructions. * Added an XSL transform (provided by Gary) for RSS 2.0 feeds so that NewsBruiser feeds will show up all purty in Mozilla and other XSL-supporting browsers. (Should this be themeable?) * Changed the default permalink graphic to a more pleasing triangle. * You can now forgo the notebook name in a CGI that takes an entry ID, to mean the default notebook. For example, if your default notebook is named "default", then view.cgi/2003/01/01 is the same as view.cgi/default/2003/01/01, and view.cgi/drafts is the same as view.cgi/default/drafts. Of course, if you have a notebook called "drafts" or one called "2003", this won't work because that notebook will take precedence. * Added a document containing random NewsBruiser tips; please send in your own. * Created a new cfg.py variable called contentBaseURL, which defaults to baseURL. You can set contentBaseURL to something else if baseURL refers to a ScriptAliased directory that prevents you from accessing non-scripts. This lets you get at the NewsBruiser documentation and static files (CSS and images) from within NewsBruiser when you wouldn't otherwise be able to do so. All references in configuration settings to '%R' now refer to this variable instead of to baseURL. B The default export image is now in /resources/img/, not in /img/. * Fixed a bug which made NewsBruiser unusable when cookies were disabled. * Fixed a bug which prohibited users from viewing only a subset of the drafts for a notebook. * More misc. bugfixes and cleanup, much of it from patches sent in by Gary. C Moved much of the option code into a reusable library called I Want Options. C Moved much of the HTML generation code into a reusable library called Leonard's Obsequious Markup Producer. C Moved the XML-RPC handlers out into a separate class, so they're no longer inside the CGI. C Added a validation interface to the configuration option code. It's used by the new IntegerOption, EmailOption, HTMLColorOption, and date template option classes. CB Notebook.config has been replaced with a method called get(), and a __getitem() method has been added, so that the notebook configuration looks more like a dictionary. C Moved all of the SSI code (except for stubs) into a class called CoreSSIs.py so that Python knows to byte-compile it. CB Moved the CoreCGIs.py class into the nb/ directory. CB Moved more CGI logic into the CoreCGIs.py class. CB Moved the CategoryCGI and EntryCGI classes into the NBCGI module. CB Moved the scrawny little NBSSI class into the NBProcess module; it doesn't need its own module. February 20, 2003: 1.12.0, "Remote Control Rhino" ------------------------------------------------- * Added the RPC2.cgi CGI, which implements various XML-RPC interfaces to NewsBruiser. Currently supported are the MetaWeblog interface, the Blogger interface, and the Advogato interface. C Added the ability to define a custom class that rewrites NewsBruiser URLs to fit into your site's scheme. Inspired by and partially contains code from Gary Benson. * Applied a bunch of patches supplied by Gary Benson (gary at inauspicious dot org: * Make the working-dir .nbrc attribute optional, and allow a user to forgo a config.location file with a properly placed .nbrc. If no config.location file is present, NewsBruiser will work its way up the directory tree looking for a file called ".nbrc", and use the first one it finds. setup.py now forgoes the working-dir directive, since the default setup no longer requires it. * Gave Notebook objects the ability to find all entries from the last n days, and introduced a new SSI using this functionality: last_n_days.ssi. * Allowed Manila-style "previous month" and "next month" links on calendars. C Fixed some bad HTML in NotebookCalendar. ! Draft entries were being indexed. If you used drafts, I recommend rebuilding your index using util.cgi. * Fixed a bug which required you to manually delete the .firstEntry file if you imported an entry earlier than the first entry currently in NewsBruiser. NewsBruiser now removes that file automatically. * Entries will no longer have a blank line appended to their text every time the entry is edited (causing entry text to grow without bound). * You can now configure the number of entries displayed for a notebook on the notebook's main page. * The "Show all" link on the notebook's main page only shows up if there is more than one notebook on the site. * You can now import from Manila no matter what version of Python you're running. * Imports that fail now give you appropriate error messages. The RSS importer and the Manila importer both make use of this. * Fixed imports of Manila stories containing embedded ampersands (Manila doesn't escape them, for some reason). January 25, 2003: 1.11.0, "Weasels Bruised My News" --------------------------------------------------- * NewsBruiser should now run on Windows servers. I got it to work on Windows ME running Apache (see caveat below re Windows ME and other DOS-based Windows systems). * NewsBruiser now has a basic email import functionality. By setting up a procmail recipe that feeds into MailImporter email addressed to a certain address, you can create notebook entries via mail. * NewsBruiser also has the capability to import entries from an RSS feed. This is useful if you're migrating to NewsBruiser from another weblog tool. All common versions of RSS are supported, but the best-supported are 2.0 and 3.0. * NewsBruiser can also import entries from blogger.com, subject to limitations imposed by blogger.com (basically, only the 20 most recent entries can be imported). * NewsBruiser can also import entries from Manila. This feature is only available if you are running NewsBruiser on Python 2.0 or above. * Added the ability to get a random entry from the notebook. This is manifested in a CGI and an SSI. * Fixed a bug, found by Mark Fasheh, in rendering a list of attachments. * Fixed a bug in RSS generation found by Andrew Newton . * The default robot tag behavior is now to prohibit both indexing and following links. Only view.cgi, index.cgi, and calendar.cgi behave differently. This is to stop Google from indexing redundant views such as category views, to consolidate the robot logic, and to prevent oversights for future CGIs. * NewsBruiser now includes Carey Evans' implementation of the crypt() function. This improves its portability to Python installations that don't have Python's crypt module (including all Windows installations). ! NewsBruiser now uses Jonathan Feinberg's portalocker module to provide portable locking on POSIX and Windows NT-based systems. Note that DOS-based Windows systems (such as Windows 98 and ME) do no file locking at all, which can screw up your index. Please let me know if you know how to lock a file in Python under DOS. B NBCGI no longer has an init() method. If you need special constructor code, you can just override __init__ and use constructor chaining to call NBCGI.__init__. B In the NBCGI constructor, you no longer need to specify a list of CGI variables your CGI is interested in; there was no real need for this requirement, so I took it out. NBCGI now sticks all of a request's CGI variables into the 'variables' map. B The NBCGI constructor no longer takes a list of variables to scrub of shell metacharacters. As of 1.3, NewsBruiser no longer gave any user-submitted data to a shell program, so this is no longer neccessary. NBCGI.sanitize() and util.sanitize() are gone. November 17, 2002: 1.10.0, "Exquisite Horse" -------------------------------------------- * There are three new templates: year-span, month-span, and day-span. You can use them as separators to group entries by year, month, and day. The "Sobelow" theme (see below) provides an example. * Two more themes: Brendan Adkins' "Laurie", based on his weblog; and my own "Sobelow", based on Kevan Davis' weblog at http://www.kevan.org/blog/. * You can now address rss.cgi just like you can view.cgi, with an entry ID or partial entry ID. For example, rss.cgi/notebook/2002/10/04/0 will give you the second entry for 2002/10/04 in RSS format. This is the export side of NewsBruiser's forthcoming RSS import/export mechanism. * Fixed a couple problems with calculating values like baseURL and exportedHost on systems with different Apache configurations from mine. * Got rid of more Python 2 incompatibilites involving the list of navigation links. To avoid this problem, use NBCGI.addNavLink() instead of directly manipulating the list of navigation links. I'm now doing development on Python 2.0 (but still running my production site on 1.5.2), so there should be no more of this sort of problem going forward. November 10, 2002: 1.9.2, "Crouching Tiger, Hidden Dagon" --------------------------------------------------------- * Fixed an HTML bug in the Default theme's entry template. The default theme now generates valid HTML, assuming the content inside the entries doesn't contain invalid HTML. * Fixed a Python 2.0 incompatibility in setup.py (thanks to Michael Collins for finding this bug) * A value in a theme file can be spread over multiple lines if the first character of the continuation is a space. This enables more convenient layout of templates in theme files. * Added Brendan Adkins' "Timothy" theme. November 9, 2002: 1.9.1, "Reptile Syndicate" -------------------------------------------- * Added support for RSS 2.0 and RSS 3.0. You can get an RSS control panel which will let you get a customized RSS feed by hitting "rss.cgi?content=form". * Notification of external sites is now performed in the background, so add and publish operations that involve a notification ping are now faster. * Integrated Ahoy (http://dev.lophty.com/ahoy/index.htm) into the documentation. Ahoy lets you get a bookmarkable link to any chunk of text in an HTML document. * Fixed a bug in calculating the redirect when you were deleting a published entry (as opposed to a draft). * "content=lofi" in rss.cgi works properly now. November 8, 2002: 1.9.0, "Dancing Elephant Revue" ------------------------------------------------- ! NewsBruiser now has theme support. A theme is a packaged set of templates, configuration settings, and/or auxiliary files (such as images and a CSS file). You can use themes to quickly switch between sets of look-and-feel settings without having to change every single option. If you're upgrading to 1.9.0, then NewsBruiser will initially think you're using the default theme. This will make it look like you've lost all your UI customizations, but all you have to do is go to "Configure" >> "UI Customization" and change your theme selection to "No theme". Themes are stored under the themes/ directory. It's easy to make a NewsBruiser theme from your notebook configuration (see the new theme creation documentation for more details). Please let me know if you have a cool theme that you'd like to see packaged with NewsBruiser. There are currently 2 themes packaged with NewsBruiser. Hopefully the next version will have more. B The nb.css, dayguide.png, and entry.jpg files have been moved from nb/css/ and nb/img/ into themes/Default/. * The 'Default entry sort order' and 'Search engine index granularity' options are now selection boxes, rather than text boxes with valid values spelled out in the description text. * Fixed yet another bug with categories whose names contain special characters. * Finally found and fixed the annoying index corruption bug: when there were pending index updates and two users initiated a search simultaneously, both processes would process the index updates, putting the index into an inconsistent state. The relevant code now locks the file containing the pending index updates so that other processes know to back off and let it handle it. * Sped up searches and adds by not loading the index unless necessary, and (when possible) loading only the necessary bits of it. * The redirect-to-login code will now always redirect you back to the page you were trying to access once you log in, even if you hit the initial page via an external link. * category.cgi now uses the option list template properly (it used to treat every entry in a category as a separate list of one item). * Refactored code in Options.py so that the option types are not hard-coded. B The Notebook.getTheme() method has been renamed to Notebook.getBasicTheme() to avoid confusion with the new 'theme' feature. There's no way to directly access a notebook's theme; it simply overrides other option settings. B The format of the options.conf file changed slightly to make it look more like the .configuration files and theme files: the key-value delimiter is now '=' instead of ':'. This has no effect on you because you didn't change options.conf, right? November 1, 2002: 1.8.0, "Scared Cow" ------------------------------------- * You can now associate images or other files with a notebook entry. The default settings are for a notebook to which you might occasionally add a couple of small images to an entry, but not very many or very often. You can change this around to fit your needs. * You can now import an entry to a date in the past. Other entries on that day will be pushed aside to put the entry in the right place chronologically. The link to import an entry is found on util.cgi. Soon I'll write a command-line script which will import many entries at once, but the functionality is now available if you want to do one at a time. * If you want to manage the NewsBruiser templates through some method other than the configuration templates (like by using an editor or an FTP program), you can tell NewsBruiser to look in a particular file for a template. See the template system documentation for details. * There is now an 'entry list' template which you can use to surround all entry lists with custom HTML. For instance, you could have your entry list template print out opening and closing
    tags and have the entry template print a
  1. tag, to put the entries for any given list of entries in an HTML ordered list. * You can now accept an author's email address in addition to their name. Useful for a site that takes public submissions. * Another unexposed rss.cgi feature: you can now specify "content=lofi" and get a low-fi version of the RSS feed with the entry title (or text sample) as the content. * Category data files now store the relative paths to entries, not the absolute paths. So you can move your NewsBruiser installation without the categories breaking. NewsBruiser will automatically convert categories in the old format over for you. * Single-entry view now displays the titles of the next and previous entries on the control panel. This is just a feature I thought would be cool. It might not be. B The email address feature changed the signature of the Notebook.addEntry() and Entry.edit() methods. B The Entry.render() method now builds and returns a string rather than printing the string out. B The command maps have been moved from Entry into Viewer, where they belong. October 20, 2002: 1.7.0, "Doob Doob A Rama" ------------------------------------------- * NewsBruiser now offers support for entry drafts. Instead of immediately publishing an entry, you can come back to it later and publish it at your convenience. Drafts are accessed just like normal notebook entries except that their entry IDs look like "[notebook]/drafts/[year]/[month]/[day]/[ordinal]" instead of "[notebook]/[year]/[month]/[day]/[ordinal]". You can use a draft entry ID for the three CGIs that take an entry ID (edit.cgi, view.cgi, and delete.cgi). You publish drafts from edit.cgi. When you publish a draft, it gets a new entry ID as though you'd just added it via add.cgi. To use the draft functionality, you must turn on cookie authentication. * You may allow anyone to submit a draft, without entering the notebook password. This lets you use NewsBruiser to run a news site on user submissions. You can also configure the URL to which people are redirected after submitting such a draft. By default, publicly submitted drafts are stripped of Javascript; you can also subject them to a list of allowed tags. * The size of the box used in add.cgi to enter the entry text, and in edit.cgi to edit the entry text, is now configurable. If your entries are usually very long, you can increase this value to see more of the entry without scrolling. * If you have cookie authentication turned on, then the index CGI will show a login box instead of administrative links if you are not logged in to that notebook. Also, certain CGIs will redirect you to the new login.cgi if you try to view them without logging in. These CGIs include configure.cgi any any CGI that views or manipulates a draft entry. B In order to get draft support to work, a lot of methods dealing with EntryIDs had to be changed to take a boolean "draft" so that they would know whether you were talking about a draft with a particular ID or about the published entry with that ID. Chief among these are the constructor to EntryID and the Notebook.getEntries() method. B Entry.add(), .edit(), and .publish() now take a password and verify its correctness; this is to avoid security holes in any command-line scripts and custom CGIs you might write. It doesn't prevent unauthorized access for such CGIs, because you can just manipulate Entry object directly, but it should make it harder to create security holes inadvertently. * A bug was fixed which prevented the use of categories whose names contained spaces or other needing-to-be-quoted-in-URLs characters. * edit.cgi now prints links instead of buttons to go to the entry editor. This is so you can open up multiple editors from a single screen by opening the edit links in new windows or new Mozilla tabs. * You finally get a decent error message when you try to access an entry that doesn't exist. * NewsBruiser will now automatically create a new .firstEntry file if it becomes invalid (because you deleted the first entry, or published or deleted the first draft). * Added an HTML file called ssiTest.shtml which contains examples of all the NewsBruiser SSIs. October 13, 2002: 1.6.0, "Sheep May Safely Graze" ------------------------------------------------- * Fan service for Mark: you can now flip a switch to allow the deletion of notebook entries via the new delete.cgi. When you delete an entry it changes the URLs for all subsequent entries for that day so that there's no gap. Entry deletion is disabled by default. * You can now tell NewsBruiser to summarize long entries. If you check that box, then any entry longer than a paragraph will be summarized in lists. To see the whole entry you'll have to click to view only that entry. This is useful if you want to run a NewsBruiser notebook that frequently has very long entries. * Categories can now have descriptions associated with them. Category descriptions are shown on the category view, and you can set up the category template to display them when rendering an entry. * NewsBruiser now supports a freeform author setting, for setups where the list of authors isn't known in advance. You can upgrade now, Mike. :) * You can now restrict entries so that each can only be in one category. * Old habits die hard; for those used to putting their passwords in the first text box on add.cgi and edit.cgi, now there's hope. NewsBruiser won't allow an add or edit where the title is the same as the notebook password. B You now need a Viewer object to render so much as one notebook entry (before, you only needed one to render multiple notebook entries). The Viewer object contains state information about the entry, and is used in template interpolation. This gets rid of the disgusting practice of setting variables on the entries themselves. Any methods which might be used in a template can take a Viewer object if they need access to its state information, but it's not necessary for such methods to take a Viewer. September 22, 2002: 1.5.0, "Pig In A Blanket" --------------------------------------------- B The NewsBruiser Python classes (but not the CGIs or SSIs) have been moved into the 'nb/' subdirectory. The lib/ directory has also been moved into the nb/ directory. Also, the DateArithmetic class is now in nb/lib/. If you've written new CGIs or SSIs, you'll need to change the import statements appropriately. * NewsBruiser now uses a simple templating system to render entries. Because NewsBruiser only analyzes a template once per HTTP hit and reuses the result of the analysis for every entry it renders, it's about as fast as the old system which just dumped out the entry in a predefined format (I saw no measurable time difference when rendering a page containing ~650 entries). * You can now syndicate a particular category by passing a category path to rss.cgi. There's not yet any Web interface to this. * The authentication cookie will now work with notebook names and passwords that contain cookie special characters (space, semicolon, and comma). * Option groups now have associated text, which go at the top of configure.cgi and describe the entire option group. September 21, 2002: 1.4.2 ------------------------- * NewsBruiser now uses a session cookie for authentication, which frees you from having to enter your password for a notebook no more than once per session. It's on by default, but you can turn it off via configure.cgi. * Yet another new CGI, logout.cgi, which removes your NewsBruiser authentication cookie if you have one. * A navbar at the bottom of pages is starting to take form; in addition to the 'Edit' link provided by view.cgi, there's also a link to index.cgi and (if NewsBruiser is storing a session cookies for the current notebook) a logout link. You can add a link to the nav by appending a [url, linkText] pair to self.navLinks. * There is a new variable set by NBCGI, called preAuth, which is set if the user authenticated for the current notebook via cookie. Do not rely on this to determine whether it's okay to take action; check the provided password instead. But this is useful as a shorthand when printing out controls. September 19, 2002: 1.4.1 ------------------------- * NewsBruiser is now much easier to set up; there's a script in tool/ called setup.py which writes all the configuration for you. You no longer have to change cfg.py, either. Old configurations still work. * util.cgi now has another button, which gives you your entire notebook (entries, configuration, and categories) as a gzipped tarball. This makes it easy to take backups of your notebook, or move to a different site. September 15, 2002: 1.4.0 ------------------------- * NewsBruiser now has category support! You can administer a category tree for each notebook through a web interface, and associate a notebook entry with zero or more of its notebook's categories. ! .nbrc has been gutted and now contains only a very few configuration options. Almost all configuration is now done through the new configure.cgi screen. See the configuration document for details. NewsBruiser will read in values from your .nbrc if they are present and use them to write the configuration file read by configure.cgi. You can then clean those clauses out of your .nbrc. This change maintains backwards compatibility, but I may remove the autoconversion in the next version, which will break upgrades from pre-1.4.0 versions to post-1.4.0 versions. Configuration options are defined in options.conf. You should not change this file unless you have code to back it up. * 4 new screens for manipulating categories: category.cgi, category-add.cgi, category-edit.cgi, and category-delete.cgi. * A new screen for performing administrative activities on a notebook: util.cgi. Currently can only rebuild the index (for use in case it gets corrupted). * index.cgi has been improved in several ways. In particular, you can now initiate a search directly from index.cgi. * You can now pass in a method to NBCGI.__init__ which will be called to manipulate the PATH_INFO variable. The category manipulation CGIs use a method called processPathInfoAsCategoryPath in this capacity. * A new NBCGI variable, 'usedDefaultNotebook', is now set. You can use it to see whether the user specified 'notebook' or whether they didn't specify a notebook and the value of 'notebook' was chosen as the default. B NBCGI.processPathInfo has been renamed to processPathInfoAsEntryID, since there are now multiple methods which process the path info. September 5, 2002: 1.3.2 ------------------------ * Notebooks now have a title feature. If you set entry-titles true in the configuration, you'll get a title field on add and edit. Titles are presented in a separate style from entry text, and are used in syndication and 'today in history'. Titles are always optional. * Single-entry view now has a link to the edit CGI, creating support for a common admin action from single-entry view that doesn't require that you manually change URLs. * The year link of a calendar now links to the calendar for that year rather than to the whole year's worth of entries. Changed the calendar link on index.cgi from a separate link into the new year link of the calendar. * You can now specify in cfg.py a value to which to automatically nice all CGI and SSI processes. This is useful if you're running NewsBruiser on someone else's machine. (Of course, if NewsBruiser starts eating resources there's probably a bug in NewsBruiser which you should file). * A new class, NBSSI, has been created, and all of the SSIs instantiate a subclass of it. This allowed me to factor a lot of code out of the individual SSIs. * NBSSI and NBCGI now share a small common superclass, NBProcess. B Entry.textContains has had its name changed to matchesString, and it now checks both the body of the entry and the title. August 29, 2002: 1.3.1 ---------------------- ! Fixed an aggravating bug in indexer that caused entries, upon being edited, not to be purged from the index before being re-added (this left old copies of the entries in the index, and you could find the same entry multiple times in search results if that entry had been edited). If you installed 1.3, you really should upgrade to this version and run rebuildIndexes.py. I haven't yet decided what the best solution to the underlying problem is, but this works as a stopgap measure. * Indexing operations are now batched to happen immediately before a search, rather than happening after the operation which invalidates the index. This speeds up adds and edits. * Added code from Mark Fasheh (mark at exothermic dot org) to properly chmod created files and directories. * If the aggregation URL is unreachable, will now print out an informative message explaining what it was doing that whole time, instead of crapping out with an error. August 17, 2002: 1.3 -------------------- * The NewsBruiser search system is now backed by a proper index, courtesy of the [indexer] module written by David Mertz (mertz at gnosis dot cx). The first time you do a search, or add or edit an entry for a 1.3 notebook, an index will be created automatically underneath your notebook directory; you can also create the indexes manually for all your notebooks by running the tool/rewriteIndexes script. Every time you add or edit an entry, the index will be updated. Both indexing and searching are very fast, so searching will no longer be a dog and you shouldn't notice any slowdown except when the index is created (and even that will be very fast). * There is now a 'calendar' CGI which displays a linked calendar to days of notebook entries. There's also a cool little graphic which indicates how many entries there were for each day. * index.cgi has been revamped to a tabular format to provide more information and give it more of a 'control panel' feel. * There is a new 'this_month_calendar' SSI for displaying the current month's calendar. * The CGIs now have more informative titles (no longer just "NewsBruiser"). * You can now specify a content-type to self.printHeader(). * You can now call self.printHeader() if you're at all unsure whether the content-type header has been printed. If it has, it won't print the header again. B NewsBruiser will now work only with versions of Python that have zlib support. B The EntryID.asLinkedDescription() method is now named EntryID.asDescription(), and will now print an unlinked description if you pass it an empty 'cgi' variable. This should only affect you if you've hacked NewsBruiser. Just change your asLinkedDescription() calls to asDescription() calls. August 11, 2002: 1.2 -------------------- * NewsBruiser now exports to RSS 0.9.2 and RSS 1.0 formats via the rss.cgi script. (Issue #3) * CGIs will now generate the "robots" meta tag so that only one view of a notebook's entries gets indexed. * HTML entities in forms are now quoted, which fixes the infamous "I wrote a < and editing turned it into a <" bug. (Issue #1) * Got rid of extra newline in textarea fields. (Issue #2) * You can now specify a contact-name and contact-email for your notebook, which will be displayed on index.cgi, view.cgi, search.cgi, and in syndication. * All configuration keys can now be set back to the application default (negating an all-notebooks default) by giving a notebook-specific value of '{NONE}' (previously this only worked with time-zone). B You must now specify an 'exported-host' configuration key, so that NewsBruiser can generate absolute URLs for entries when doing ping notification and syndication. B The 'description' configuration key has been changed to 'title', since that's what it was being used as (and what it's used as in RSS syndication). There is still a 'description' configuration key which is now supposed to contain an actual description of the notebook (which can be as long as you want), and which is used as the description in RSS syndication. If you were taking the 'description' configuration key at its word, then just add a 'title' field key and you'll be fine; otherwise change 'description' to 'title' and add a new, longer 'description'. B The 'notification-site-name' configuration key has been changed to 'exported-site-name', and its get method has been changed to getExportedSiteName(). This change was made to consolidate the site metadata configuration. B The 'notification-site-url' configuration key has been changed to 'exported-site-url', and its get method has been changed to getExportedSiteName(). This change was made to consolidate the site metadata configuration. April 13, 2002: 1.1 ------------------- * Defaults have been provided for most of the configuration options, so that .nbrc files can be less complex and scripts don't crash if an option is missing. * Each notebook can specify a time zone to be used when calculating times for that notebook. This is useful when the person using a notebook is in a different time zone from the time zone in which the hosting computer resides. * Each notebook can specify a URL to a CSS file which will be used to theme that notebook. The old theming code still works, to maintain basic theming for users with non-CSS browsers. Thanks to Rajarshi Guha (rajarshi at presidency dot com) for help with CSS. * Each notebook can specify a piece of text or an image to display when rendering an entry for that notebook, which will be used to create a permalink to that entry. * Each notebook can now specify a default order for view.cgi; either 'chronological' or 'reverse-chronological'. Users who can't use SSIs at all will be able to get weblog-like functionality by setting their default order to 'reverse-chronological'. The default can be overridden by setting the 'order' CGI argument in a request to view.cgi. * The SSIs can now be run with either #exec cgi or #exec cmd, allowing people whose installations prohibit #exec cmd to use some of the SSI functionality (not all of it, since you can't pass in arguments through #exec cgi). January 5, 2002: 1.0 -------------------- * Got sick of not having a 1.0 release so just called the next release 1.0. * Added code from Josh Lucas (josh at stonecottage dot com) to notify weblog aggregators such as weblogs.com upon the creation of a new entry. * Fixes to documentation and sample .nbrc. * Added technical overview. * A few minor bug fixes. July 14, 2001: 1.0 Release candidate 1 -------------------------------------- * Sensible class structure. * Helpful SSIs such as today_in_history and last_n_entries. * Much improved navigation interface. * Search capability. ----------------------------------------------------------------------------- Behold, mortal, the origins of NewsBruiser... In August 1998 Leonard Richardson (leonardr at segfault dot org) wrote "the notebook program" (retroactively named Notebook Of Web-Basedness). This was rewritten in March 1999, again in March 2000 (and named NewsBruiser), and again in July 2001. The first NewsBruiser release candidate was released on July 14, 2001, and the first actual version was released on January 5, 2002.