File: Synopsis/Formatters/SXR.py
  1#
  2# Copyright (C) 2004 Stefan Seefeld
  3# All rights reserved.
  4# Licensed to the public under the terms of the GNU LGPL (>= 2),
  5# see the file COPYING for details.
  6#
  7
  8"""The SXR Facade around the HTML Formatter """
  9
 10from Synopsis import config
 11from Synopsis import IR
 12from Synopsis.Processor import *
 13import HTML
 14from HTML.View import View, Template
 15from HTML.Views import Directory, Source, RawFile
 16import os, os.path
 17from shutil import copyfile
 18
 19class SXRIndex(View):
 20    """Top level Index View. This is the starting point for the SXR browser."""
 21
 22    sxr_cgi = Parameter('sxr.cgi', 'URL to use for sxr.cgi script')
 23
 24    def filename(self):
 25
 26        return self.directory_layout.index()
 27
 28    def title(self):
 29
 30        return 'Index'
 31
 32    def root(self):
 33
 34        return self.filename(), self.title()
 35
 36    def process(self):
 37        """Recursively visit each directory below the base path given in the
 38        config."""
 39
 40        self.start_file()
 41
 42        self.write("""
 43<table class="form">
 44  <tr>
 45    <td>Click here to start browsing at the root of the directory tree:</td>
 46    <td>
 47      <a href="dir.html">/</a>
 48    </td>
 49  </tr>
 50  <tr>
 51    <td>Enter a file name to search:</td>
 52    <td>
 53      <form method="get" action="%(script)s/file">
 54        <input type="text" name="string" value="" size="15"/>
 55        <input type="submit" value="Find"/>
 56      </form>
 57    </td>
 58  </tr>
 59  <tr>
 60    <td>Enter a variable, type, or function name to search:</td>
 61    <td>
 62      <form method="get" action="%(script)s/ident">
 63        <input type="text" name="string" value="" size="15"/>
 64        <input type="submit" value="Find"/>
 65      </form>
 66    </td>
 67  </tr>
 68</table>
 69"""%{'script' : self.sxr_cgi})
 70        self.end_file()
 71
 72class Formatter(Processor):
 73    """This is a facade to the HTML.Formatter. It adds an 'url' parameter and
 74    dispatches it to various 'views'."""
 75
 76    title = Parameter('Synopsis - Cross-Reference', 'title to put into html header')
 77    url = Parameter('/sxr.cgi', 'the base url to use for the sxr cgi')
 78    sxr_prefix = Parameter(None, 'path prefix (directory) to contain sxr info')
 79    src_dir = Parameter('', 'starting point for directory listing')
 80    exclude = Parameter([], 'TODO: define an exclusion mechanism (glob based ?)')
 81    sxr_template = Parameter(os.path.join(config.datadir, 'sxr-template.html'), 'html template to be used by the sxr.cgi script')
 82    stylesheet = Parameter(os.path.join(config.datadir, 'html.css'), 'stylesheet to be used')
 83
 84    def process(self, ir, **kwds):
 85
 86        self.set_parameters(kwds)
 87        if not self.output: raise MissingArgument('output')
 88        if not self.sxr_prefix: raise MissingArgument('sxr_prefix')
 89
 90        self.ir = self.merge_input(ir)
 91
 92        if not os.path.exists(self.output): os.makedirs(self.output)
 93
 94        content = [SXRIndex(sxr_cgi = self.url,
 95                            template = Template(template = self.sxr_template)),
 96                   Directory(src_dir = self.src_dir,
 97                             base_path = self.src_dir,
 98                             exclude = self.exclude,
 99                             template = Template(template = self.sxr_template)),
100                   Source(external_url = '%s/ident?full=1&string='%self.url,
101                          template = Template(template = self.sxr_template)),
102                   RawFile(src_dir = self.src_dir,
103                           base_path = self.src_dir,
104                           exclude = self.exclude,
105                           template = Template(template = self.sxr_template))]
106
107        html = HTML.Formatter(index = [],
108                              detail = [],
109                              content = content,
110                              sxr_prefix = self.sxr_prefix,
111                              stylesheet = self.stylesheet)
112        self.ir = html.process(self.ir, output = self.output)
113
114        if self.sxr_template:
115            copyfile(self.sxr_template,
116                     os.path.join(self.output, 'sxr-template.html'))
117
118        # Store the SXR data only.
119        ir = IR.IR(sxr=self.ir.sxr)
120        ir.save(os.path.join(self.output, 'sxr.syn'))
121
122        return self.ir
123