diff -uNr filetree-7.x-1.x-dev-20110601/filetree.module filetree.description/filetree.module
--- filetree.module	2011-05-31 15:12:10.000000000 +0100
+++ filetree.module	2011-06-10 10:56:47.000000000 +0100
@@ -51,7 +51,7 @@
   $output = t('You may use [filetree dir="some-directory"] to display a list of files inline.');
   if ($long) {
     $output = '<p>' . $output . '</p>';
-    $output .= '<p>' . t('Additional options include "multi", "controls", "extensions", "absolute", and "exclude"; for example, [filetree dir="some-directory" multi="false" controls="false" extensions="false" absolute="false" exclude="CVS; directory1; directory2"].') . '</p>';
+    $output .= '<p>' . t('Additional options include "multi", "controls", "extensions", "absolute", "name", "title", "description" and "exclude"; for example, [filetree dir="some-directory" multi="false" controls="false" extensions="false" absolute="false" title="%D" exclude="CVS; directory1; directory2"].') . '</p>';
     $output .= '<p>' . t('You can also read a <a href="http://drupal.org/project/filetree">detailed explanation of these options</a>.'). '</p>';
   }
   return $output;
@@ -74,6 +74,9 @@
     'extensions' => TRUE,
     'absolute' => TRUE,
     'exclude' => array('CVS'),
+    'description' => '.descript.ion',
+    'name' => NULL,
+    'title' => NULL,
   );
 
   // The token might be present multiple times; loop through each instance.
@@ -138,16 +141,28 @@
   $list = array();
   if (is_dir($dir) && $handle = opendir($dir)) {
     $folders = $files = array();
+    if ($params['description'] != '')
+      $metainfo = _filetree_scan_description($dir, $params['description']);
     while (FALSE !== ($file = readdir($handle))) {
       // Exclude certain paths:
       // - those which start with a period (".", "..", and hidden files),
       // - additional paths from the "exclude" param
       if ($file[0] != '.' and !drupal_match_path($file, $params['exclude'])) {
+        if ($params['name'] === NULL) {
+          $name = $file;
+        } else {
+          $name = _filetree_parse_name($file, (isset($metainfo[$file]) ? $metainfo[$file] : NULL), $params['name']);
+        }
+        if ($params['title'] === NULL) {
+          $title = $file;
+        } else {
+          $title = _filetree_parse_name($file, (isset($metainfo[$file]) ? $metainfo[$file] : NULL), $params['title']);
+        }
         if (is_dir("$dir/$file")) {
           $folders[$file] = array(
-            'data' => $file,
+            'data' => $name,
             'children' => _filetree_list_files("$dir/$file", $params),
-            'title' => $file,
+            'title' => $title,
             'class' => array('folder'),
           );
         }
@@ -155,11 +170,17 @@
           $filename = "$dir/$file";
           $pathinfo = pathinfo($file);
           $basename = basename($file);
-          $name = $params['extensions'] ? $pathinfo['basename'] : substr($pathinfo['basename'], 0, strrpos($pathinfo['basename'], '.'));
+          if ($params['name'] === NULL) {
+            $name = $params['extensions'] ? $pathinfo['basename'] : substr($pathinfo['basename'], 0, strrpos($pathinfo['basename'], '.'));
+            if ($params['title'] === NULL) $title = $name;
+          }
+          elseif($params['title'] === NULL) {
+            $title = $params['extensions'] ? $pathinfo['basename'] : substr($pathinfo['basename'], 0, strrpos($pathinfo['basename'], '.'));
+          }
           $url = $params['absolute'] ? file_create_url($filename) : substr(file_create_url($filename), strlen($GLOBALS['base_url'] . '/'));
           $files[$file] = array(
             'data' => l($name, $url),
-            'title' => $file,
+            'title' => $title,
             'class' => array(_filetree_icon($pathinfo['extension'])),
           );
         }
@@ -175,6 +196,64 @@
 }
 
 /**
+ * Parse name/title pattern
+ * %f -> filename, %b -> basename (without extension), %e -> extension
+ * %mf -> metadata or if it empty than filename, %mb -> metadata or basename, %me metadata or extension
+ * %lf, %lb, %le .. -> lowercase filename, basename, extension...
+ * %ul, %ub, %ue .. -> uppercase
+ */
+
+function _filetree_parse_name($file, $meta, $str) {
+  $bas = preg_replace('/\..*?$/', '', $file);
+  $ext = strpos($file, '.') !== FALSE ?  preg_replace('/^.*\./', '', $file) : '';
+  return str_replace(array(
+    '%f',  '%b',  '%e',  '%mf', '%mb', '%m',
+    '%lf', '%lb', '%le', '%mlf', '%mlb',
+    '%uf', '%ub', '%ue', '%muf', '%mub',),
+    array(
+      $file, $bas, $ext, ($meta == '' ? $file : $meta), ($meta == '' ? $bas : $meta), $meta,
+      strtolower($file), strtolower($bas), strtolower($ext), ($meta == '' ? strtolower($file) : $meta),
+        ($meta == '' ? strtolower($bas) : $meta),
+      strtoupper($file), strtoupper($bas), strtoupper($ext), ($meta == '' ? strtoupper($file) : $meta),
+        ($meta == '' ? strtolower($bas) : $meta),
+    ), $str
+  );
+}
+
+/**
+ * Parse .descript.ion file content
+ *
+ */
+
+function _filetree_scan_description($dir) {
+  $metainfo = array();
+  if (is_readable("$dir/.descript.ion") && ($file = file("$dir/.descript.ion"))) {
+    foreach ($file as $line) {
+      $line = trim($line);
+      // Skip empty and commented lines
+      if ($line == '' || strpos($line, '#') === 0) continue;
+      // Use PCRE regular expressions to parse file
+      $matches = array();
+      if (strpos($line, '"') === 0) {
+        preg_match('/^"([^"]+)"\s+(.*)$/', $line, $matches);
+      }
+      else {
+        preg_match('/^(\S+)\s+(.*)$/', $line, $matches);
+      }
+      list(, $name, $description) = $matches;
+      unset($matches);
+      if (isset($metainfo[$name])) {
+        $metainfo[$name] .= ' ' . trim($description);
+      }
+      else {
+        $metainfo[$name] = trim($description);
+      }
+    }
+  }
+  return $metainfo;
+}
+
+/**
  * Determines which icon should be displayed, based on file extension.
  */
 function _filetree_icon($extension) {
