code: def generate_docs(app):
      
      # Figure out the correct directories to use
      config = app.config
      config_dir = app.env.srcdir
      javascript_root = os.path.join(config_dir, config.jsdoc_source_root)
      if javascript_root[-1] != os.path.sep:
          javascript_root += os.path.sep
      if not javascript_root:
          return
      output_root = os.path.join(config_dir, config.jsdoc_output_root)
      execution_dir = os.path.join(config_dir, '..')
      exclude = config.jsdoc_exclude
  
      # Remove any files generated by earlier builds
      cleanup(output_root)
  
      # Generate the actual reST files
      jsdoc_toolkit_dir = os.path.join(SOURCE_PATH, 'jsdoc-toolkit')
      jsdoc_rst_dir = os.path.join(SOURCE_PATH, 'jsdoc-toolkit-rst-template')
      build_xml_path = os.path.join(jsdoc_rst_dir, 'build.xml')
      command = ['ant', '-f', build_xml_path,
                 '-Djsdoc-toolkit.dir=%s' % jsdoc_toolkit_dir,
                 '-Djs.src.dir=%s' % javascript_root,
                 '-Djs.rst.dir=%s' % output_root]
      if exclude:
          exclude_args = ['--exclude=\\"%s\\"' % path for path in exclude]
          command.append('-Djs.exclude="%s"' % ' '.join(exclude_args))
      try:
          process = Popen(command, cwd=execution_dir)
          process.wait()
      except OSError:
          raise JSDocError('Error running ant; is it installed?')
  
      # Convert the absolute paths in the file listing to relative ones
      path = os.path.join(output_root, 'files.rst')
      with open(path, 'r') as f:
          content = f.read()
      content = content.replace(javascript_root, '')
      with open(path, 'w') as f:
          f.write(content)
docs: Generate the reST documentation files for the JavaScript code