Index: geshifilter.css
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.css,v
retrieving revision 1.10
diff -u -b -u -p -r1.10 geshifilter.css
--- geshifilter.css	17 Aug 2009 21:04:31 -0000	1.10
+++ geshifilter.css	14 Feb 2010 23:34:11 -0000
@@ -56,3 +56,14 @@ div.geshifilter table, div.geshifilter t
   padding: 0;
   border-style: none;
 }
+
+/* Styling for GeSHi filter code blocks tools (partial collapsing toggle) */
+div.geshifilter-tools {
+  margin: -0.5em 0.5em 0.5em 0.5em;
+  background-color: #ccc;
+  padding: 0.5ex 0.5em;
+}
+
+div.geshifilter-collapsed {
+  overflow: hidden;
+}
Index: geshifilter.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.js,v
retrieving revision 1.1
diff -u -b -u -p -r1.1 geshifilter.js
--- geshifilter.js	14 Feb 2010 23:31:09 -0000	1.1
+++ geshifilter.js	14 Feb 2010 23:34:11 -0000
@@ -1 +1,46 @@
 // $Id: geshifilter.js,v 1.1 2010/02/14 23:31:09 soxofaan Exp $
+
+// Define a Drupal behavior for with jQuery magic for
+// partial collapsing/showing GeSHi filter code blocks.
+Drupal.behaviors.geshiFilterCodeCollapsing = function (context) {
+  // The height to collapse to.
+  var geshifilter_collapse_height = 100;
+  var geshifilter_collapse_height_threshold = 150;
+
+  // Add the expand/collapse toggle to geshifilter code blocks.
+  $('div.geshifilter.collapsible').each(function() {
+    // Get code container and its height.
+    var code_container = $(this);
+    var code_container_original_height = code_container.height();
+
+    // Only do the collapsing where it makes sense.
+    if (code_container_original_height > geshifilter_collapse_height_threshold) {
+      // Add more/less link.
+      $(this).after('<div class="geshifilter-tools"><a href="#" class="geshifilter-tools-collapsetoggle">' + Drupal.t('Show all code') + '</a></div>');
+      // Store the original heights of the geshifilter divs.
+      code_container.attr('original_height', code_container_original_height);
+      // Collapse by default.
+      code_container.addClass('geshifilter-collapsed').css("height", geshifilter_collapse_height);
+    }
+  });
+
+  // Add handler to read more/collapse link.
+  $("a.geshifilter-tools-collapsetoggle").click(function() {
+    // Get code container.
+    var code_container = $(this).parent().prev();
+
+    if (code_container.hasClass('geshifilter-collapsed')) {
+      // Show more (use original height).
+      var original_height = code_container.attr('original_height') + 'px';
+      code_container.removeClass('geshifilter-collapsed').animate({height: original_height});
+      $(this).text(Drupal.t('Show less code'));
+    }
+    else {
+      // Collapse.
+      code_container.addClass('geshifilter-collapsed').animate({height: geshifilter_collapse_height});
+      $(this).text(Drupal.t('Show all code'));
+    }
+    // Return false so that the link is no followed.
+    return false;
+  });
+}
Index: geshifilter.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.module,v
retrieving revision 1.48
diff -u -b -u -p -r1.48 geshifilter.module
--- geshifilter.module	12 Jul 2009 15:00:28 -0000	1.48
+++ geshifilter.module	14 Feb 2010 23:34:11 -0000
@@ -21,6 +21,7 @@ define('GESHIFILTER_ATTRIBUTES_LANGUAGE'
 define('GESHIFILTER_ATTRIBUTE_LINE_NUMBERING', 'linenumbers');
 define('GESHIFILTER_ATTRIBUTE_LINE_NUMBERING_START', 'start');
 define('GESHIFILTER_ATTRIBUTE_FANCY_N', 'fancy');
+define('GESHIFILTER_ATTRIBUTE_COLLAPSIBLE', 'collapsible');
 
 define('GESHIFILTER_BRACKETS_ANGLE', 1);
 define('GESHIFILTER_BRACKETS_SQUARE', 2);
@@ -154,6 +155,7 @@ function geshifilter_init() {
     drupal_add_css(file_directory_path() .'/geshifilter-languages.css');
   }
   drupal_add_css(drupal_get_path('module', 'geshifilter') .'/geshifilter.css');
+  drupal_add_js(drupal_get_path('module', 'geshifilter') .'/geshifilter.js');
 }
 
 /**
Index: geshifilter.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.pages.inc,v
retrieving revision 1.14
diff -u -b -u -p -r1.14 geshifilter.pages.inc
--- geshifilter.pages.inc	1 Feb 2010 00:31:45 -0000	1.14
+++ geshifilter.pages.inc	14 Feb 2010 23:34:12 -0000
@@ -25,6 +25,7 @@ function _geshifilter_parse_attributes($
   $lang = NULL;
   $line_numbering = NULL;
   $linenumbers_start = NULL;
+  $collapsible = FALSE;
 
   // Get the possible tags and languages.
   list($generic_code_tags, $language_tags, $tag_to_lang) = _geshifilter_get_tags($format);
@@ -32,7 +33,12 @@ function _geshifilter_parse_attributes($
   $language_attributes = _geshifilter_whitespace_explode(GESHIFILTER_ATTRIBUTES_LANGUAGE);
   $attributes_preg_string = implode('|', array_merge(
     $language_attributes,
-    array(GESHIFILTER_ATTRIBUTE_LINE_NUMBERING, GESHIFILTER_ATTRIBUTE_LINE_NUMBERING_START, GESHIFILTER_ATTRIBUTE_FANCY_N)
+    array(
+      GESHIFILTER_ATTRIBUTE_LINE_NUMBERING,
+      GESHIFILTER_ATTRIBUTE_LINE_NUMBERING_START,
+      GESHIFILTER_ATTRIBUTE_FANCY_N,
+      GESHIFILTER_ATTRIBUTE_COLLAPSIBLE,
+      )
   ));
   $enabled_languages = _geshifilter_get_enabled_languages();
 
@@ -88,9 +94,22 @@ function _geshifilter_parse_attributes($
       }
       $linenumbers_start = (int)($att_value);
     }
+    elseif ($att_name == GESHIFILTER_ATTRIBUTE_COLLAPSIBLE) {
+      if (strtolower($att_value) == 'true') {
+        $collapsible = TRUE;
+      }
+      else {
+        $collapsible = FALSE;
+      }
+    }
   }
   // Return parsed results.
-  return array('language' => $lang, 'line_numbering' => $line_numbering, 'linenumbers_start' => $linenumbers_start);
+  return array(
+    'language' => $lang,
+    'line_numbering' => $line_numbering,
+    'linenumbers_start' => $linenumbers_start,
+    'collapsible' => $collapsible,
+  );
 }
 
 /**
@@ -267,6 +286,7 @@ function _geshifilter_replace_callback($
   if (isset($settings['linenumbers_start'])) {
     $linenumbers_start = $settings['linenumbers_start'];
   }
+  $collapsible = $settings['collapsible'];
 
   if ($lang == GESHIFILTER_DEFAULT_DONOTHING) {
     // Do nothing, and return the original.
@@ -278,7 +298,7 @@ function _geshifilter_replace_callback($
   }
   $inline_mode = (strpos($source_code, "\n") === FALSE);
   // process and return
-  return geshifilter_process($source_code, $lang, $line_numbering, $linenumbers_start, $inline_mode);
+  return geshifilter_process($source_code, $lang, $line_numbering, $linenumbers_start, $inline_mode, $collapsible);
 }
 
 /**
@@ -297,21 +317,21 @@ function _geshifilter_override_geshi_def
 /**
  * General geshifilter processing function
  */
-function geshifilter_process($source_code, $lang, $line_numbering=0, $linenumbers_start=1, $inline_mode=FALSE) {
+function geshifilter_process($source_code, $lang, $line_numbering=0, $linenumbers_start=1, $inline_mode=FALSE, $collapsible=FALSE) {
   // process
   if ($lang == 'php' && variable_get('geshifilter_use_highlight_string_for_php', FALSE)) {
     return geshifilter_highlight_string_process($source_code, $inline_mode);
   }
   else {
     // process with GeSHi
-    return geshifilter_geshi_process($source_code, $lang, $line_numbering, $linenumbers_start, $inline_mode);
+    return geshifilter_geshi_process($source_code, $lang, $line_numbering, $linenumbers_start, $inline_mode, $collapsible);
   }
 }
 
 /**
  * geshifilter wrapper for GeSHi processing.
  */
-function geshifilter_geshi_process($source_code, $lang, $line_numbering=0, $linenumbers_start=1, $inline_mode=FALSE) {
+function geshifilter_geshi_process($source_code, $lang, $line_numbering=0, $linenumbers_start=1, $inline_mode=FALSE, $collapsible=FALSE) {
   // load GeSHi library (if not already)
   $geshi_library = _geshifilter_check_geshi_library();
   if (!$geshi_library['loaded']) {
@@ -361,7 +381,7 @@ function geshifilter_geshi_process($sour
       $geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, $line_numbering);
       $geshi->start_line_numbers_at($linenumbers_start);
     }
-    $source_code = '<div class="geshifilter">'. $geshi->parse_code() .'</div>';
+    $source_code = '<div class="geshifilter'. ($collapsible ? ' collapsible' : '') .'">'. $geshi->parse_code() .'</div>';
   }
 
   // Store in cache with a minimum expiration time of 1 day.
