     if extractor?
       source = fs.readFileSync filePath, "utf8"
       { className: className, comments: comments } = extractor.extract source
-      if className?
+      if className? and comments?
         docs[ className ] = comments
   docs
+
+
+# Return the documenation for all files below the given roots.
+projectsDocs = ( paths ) ->
+  docs = {}
+  for project in projects
+    root = path.resolve project
+    for own key, value of projectDocs root
+      docs[ key ] = value
+  sortByKeys docs
+
+
+# Return the given object with its keys sorted.
+sortByKeys = ( obj ) ->
+  keys = ( key for own key, value of obj )
+  sortedKeys = keys.sort()
+  sorted = {}
+  for key in sortedKeys
+    sorted[ key ] = obj[ key ]
+  sorted
 
 
 printDocs = ( docs ) ->

  ".qui": markupDocsExtractor


# Return the documentation for all CoffeeScript files below the given root.
projectDocs = ( root ) ->
  docs = {}
  walk root, ( filePath ) ->



# Main
projects = process.argv.splice 2 # Ignore "node" and script name args
if projects.length == 0
  projects = [ process.cwd() ] # Handle current folder by default
docs = projectsDocs projects
printDocs docs