Sometimes an oldest-to-newest order of blog posts would be better than Blogger's standard newest-to-oldest arrangement. A blog about a project is an example. The posts would proceed from oldest to newest so a visitor to the blog could start reading at the project introduction and proceed from there. Unfortunately, Blogger doesn't provide this as an option.
There are a number of existing approaches to this problem but, for various reasons, none of those exactly fit my needs. So I decided to roll my own.
The resulting drop-in hack is shown below. To use it, copy and paste the entire script into your Blogger template just before the </body> tag and then save the template. View your blog, reloading if needed, and your posts should be displayed in reverse order. Take a look at http://diyreader.blogspot.com to see it in use.
<!-- Start Post Reversal Code -->
<script type='text/javascript'>
//<![CDATA[
// -----------------------------------------------------------------------------------------
// Name : PRS - Post Reversal Script for Blogger - Version 1.0
// Author : David Yockey
// URL : http://techsquirrels.blogspot.com/2012/04/swapping-to-reverse-post-order-on.html
// -----------------------------------------------------------------------------------------
// Temp variable used to shorten classname references
var cn;
// This function is called as needed in the main program below.
function ReversePosts(BlogPostContainer,PostClass) {
// Arguments:
// BlogPostContainer -- The node containing the posts to be reversed.
// PostClass -- The className of each of the posts in the container to be reversed.
// (may be a single name from among names in the class attribute of the posts)
// Flag for checking whether any posts are found
var found=false;
var BlogPosts = BlogPostContainer.childNodes; // May include text-nodes containing
// whitespace in addition to post-nodes
// Set index variables to top and bottom of BlogPosts list
var i=0;
var j=BlogPosts.length-1;
for( ; ; ) { // Start Endless Loop
// Find next Post from the top
while( (i < j) && (!(cn=BlogPosts[i].className) || !(cn.match(PostClass))) )
++i;
// Find next Post from the bottom
while( (i < j) && (!(cn=BlogPosts[j].className) || !(found=cn.match(PostClass))) ) // (see Footnote 1)
--j;
if( found && i < j ) {
// Swap Posts (see Footnote 2)
var tempi = BlogPosts[i].cloneNode(true); // Store a copy of Post i in tempi
var tempj = BlogPosts[j].cloneNode(true); // Store a copy of Post j in tempj
BlogPostContainer.replaceChild(tempi,BlogPosts[j]); // Replace Post j with Post i in tempi
BlogPostContainer.replaceChild(tempj,BlogPosts[i]); // Replace Post i with Post j in tempj
} else {
// Done
break; // Break out of Endless Loop
}
++i; --j;
}
}
// Footnote 1:
// If a post is found from one end, then a post must necessarily be found from the other.
// So, recording and later checking for a post from one end is sufficient to ensure that
// one was found from both.
//
// Footnote 2:
// At least in Firefox 11.0 on Fedora Linux, replacing a child directly with another child
// causes some text-nodes containing whitespace to be deleted. That node deletion messes up
// the positions of the posts in the BlogPosts list. This is avoided by cloning both posts
// rather than just one and replacing both posts from the cloned copies.
// *** MAIN POST REVERSAL PROGRAM ***
// Magic Words
var BlogWidget = 'Blog1';
var BlogPostContainerClass = 'blog-posts';
var BlogPostClass = 'date-outer';
var DatePostContainerClass = 'date-posts';
var DatePostClass = 'post-outer';
var Blog1 = document.getElementById(BlogWidget);
// Find the node containing the blog posts
var BlogPostContainer;
var x=0;
do {
BlogPostContainer = Blog1.childNodes[x++];
} while ( !(cn=BlogPostContainer.className) || !(cn.match(BlogPostContainerClass)) );
// Reverse different day posts
ReversePosts(BlogPostContainer,BlogPostClass);
// Reverse same day posts - Loop thru contents of BlogPostContainer to find each day's posts
var BlogPosts = BlogPostContainer.childNodes;
for ( i = 0; i < BlogPosts.length; ++i ) {
// Check for an actual post-node rather than a text-node or such
if ( (cn=BlogPosts[i].className) && cn.match(BlogPostClass) ) {
var DatePostContainer;
x=0;
// Find the node containing the posts to be reversed for the current day being processed
do {
DatePostContainer = BlogPosts[i].childNodes[x++];
} while ( !(cn=DatePostContainer.className) || !(cn.match(DatePostContainerClass)) );
ReversePosts(DatePostContainer,DatePostClass);
}
}
//]]>
</script>
<!-- End Post Reversal Code -->
Code highlighting (if your browser displays it...) powered by google-code-prettify.
My thanks go to David Merriman and MS-potilas for their prior work on this problem and the guidance it provided.
09/25/2012 -- You may also be interested in: Hiding Blog Post Manipulation