summaryrefslogtreecommitdiffstats
path: root/languages/python/kde_pydoc.py
blob: 0516f172cd46ad15f65b3bb799c85f761bed46e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env python
"""
"""

__author__ = "David Nolden<david.kde@art-master.de>,  Ka-Ping Yee <ping@lfw.org>"
__version__ = "6 April 2006"

import sys, imp, os, stat, re, types, cgi
from repr import Repr
from string import expandtabs, find, join, lower, split, strip, rstrip
import pydoc




def cleanlinks(string):
    """Changes the links to work with the pydoc:-notation"""
    finalstring = ""
    string = str(string).replace(".html","")
    pos = 0
    mark = "<a href=\""
    l = len(mark)
    while(pos != -1):
        opos = pos
        pos = string.find(mark, pos)
        if(pos == -1):
            finalstring += string[opos:]
            break
        finalstring += string[opos:pos+l]
        pos+=l
        if(string[pos] == '#' or string.find(":/",pos, pos+10) != -1):  #leave local jumps or external references untouched
            continue
        finalstring += "pydoc:"
        if(string[pos] == "." and string[pos+1] == "\""):
            pos += 1
            finalstring += "modules"
        
    return finalstring
    

#This maximum depth was introduced because the program needs a very long time to
#complete the task in big file-system-trees(like my home), and can be invoked by a simple pydoc:.
#and cannot be stopped through the browser(just by killing python)
__maxdepth = 4

def writedocs(path, pkgpath='', depth=0, notprocessed=[]):
    if(path == "/."): 
        writedoc(path)
        return
    depth+=1
    
    if os.path.isdir(path):
        if(depth > __maxdepth):
            notprocessed.append(path)
            return
        dir = path
        for file in os.listdir(dir):
            path = os.path.join(dir, file)
            if os.path.isdir(path):
                writedocs(path, file + '.' + pkgpath, depth)
            if os.path.isfile(path):
                writedocs(path, pkgpath, depth)
    if os.path.isfile(path):
        modname = pydoc.inspect.getmodulename(path)
        if modname:
            writedoc(pkgpath + modname)
            
    if(depth == 1):
        if(len(notprocessed) != 0):
            print "<br> the following paths were not processed because they are deeper than the maximum depth of " + str(__maxdepth) + ":<br>"
            for x in notprocessed:
                print cgi.escape(x) + "    <br>"

def writedoc(key,top=False):
    """Write HTML documentation to a file in the current directory."""
    if(type(key) == str and (key == "modules" or key == "/.")):
        heading = pydoc.html.heading(
            '<br><big><big><strong>&nbsp;'
            'Python: Index of Modules'
            '</strong></big></big>',
            '#ffffff', '#7799ee')
        builtins = []
        for name in sys.builtin_module_names:
            builtins.append('<a href="%s">%s</a>' % (cgi.escape(name,quote=True), cgi.escape(name)))
        indices = ['<p>Built-in modules: ' + cgi.escape(join(builtins, ', '))]
        seen = {}
        for dir in pydoc.pathdirs():
            indices.append(pydoc.html.index(dir, seen))
        print cleanlinks(heading + join(indices))
        return

    if(type(key) != types.ModuleType):
        object = pydoc.locate(key)
        if(object == None and top):
            print "could not locate module/object for key " + \
                   cgi.escape(key) + "<br><a href=\"pydoc:modules\">go to index</a>";
    else:
        object = key
            
    if object:
        print cleanlinks(pydoc.html.page(pydoc.describe(object), pydoc.html.document(object)))



if __name__ == '__main__':
    import getopt
    class BadUsage: pass

    try:
        opts, args = getopt.getopt(sys.argv[1:], 'k:p:w')

        print "<html>"
        print "<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
        print "</head><body>"

        if args:
            for arg in args:
                try:
                    if os.path.isdir(arg): writedocs(arg)
                    
                    if os.path.isfile(arg):
                        arg = pydoc.importfile(arg)
                    writedoc(arg, True)
                except pydoc.ErrorDuringImport, value:
                    print 'problem in %s - %s' % (
                        cgi.escape(value.filename), cgi.escape(value.exc))
        else:
                raise BadUsage

    except (getopt.error, BadUsage):
        print "need parameters\n"