File: itk_doxy2swig.py

package info (click to toggle)
insighttoolkit4 4.10.1-dfsg1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 416,780 kB
  • ctags: 104,347
  • sloc: cpp: 553,142; ansic: 142,389; fortran: 34,788; python: 16,392; lisp: 2,070; sh: 1,862; tcl: 993; java: 362; perl: 200; makefile: 111; csh: 81; pascal: 69; xml: 19; ruby: 10
file content (128 lines) | stat: -rwxr-xr-x 4,513 bytes parent folder | download | duplicates (3)
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
#!/usr/bin/env python
"""Doxygen XML to SWIG docstring converter for ITK classes.

Usage:

  itk_doxy2swig.py [input directory name] [output swing interface file name]

"""

from __future__ import print_function

import sys
import os
import glob
from doxy2swig import *
from cStringIO import StringIO

class itkDoxy2SWIG(Doxy2SWIG):
    def __init__(self, src, cpp_name="", swig_name=""):
        Doxy2SWIG.__init__(self, src)
        self.cpp_name = cpp_name
        self.swig_name = swig_name

    def write_to_file(self, file):
        if self.multi:
            file.write("".join(self.pieces))
        else:
            file.write("".join(self.clean_pieces(self.pieces)))

    def cpp_to_swig_name(self, cpp_name):
        if self.cpp_name == cpp_name:
          return self.swig_name
        return cpp_name

    def do_compoundname(self, node):
        self.add_text('\n\n')
        data = self.cpp_to_swig_name(node.firstChild.data)
        # print("=================", data)
        self.add_text('%%feature("docstring") %s "\n'%data)

    def do_memberdef(self, node):
        prot = node.attributes['prot'].value
        id = node.attributes['id'].value
        kind = node.attributes['kind'].value
        tmp = node.parentNode.parentNode.parentNode
        compdef = tmp.getElementsByTagName('compounddef')[0]
        cdef_kind = compdef.attributes['kind'].value

        if prot == 'public':
            first = self.get_specific_nodes(node, ('definition', 'name'))
            name = first['name'].firstChild.data
            if name[:8] == 'operator': # Don't handle operators yet.
                return

            # store self.pieces to be able to restore it if the docstring is empty.
            pieces_backup = list(self.pieces)

            defn = first['definition'].firstChild.data
            self.add_text('\n')
            self.add_text('%feature("docstring") ')

            anc = node.parentNode.parentNode
            if cdef_kind in ('file', 'namespace'):
                ns_node = anc.getElementsByTagName('innernamespace')
                if not ns_node and cdef_kind == 'namespace':
                    ns_node = anc.getElementsByTagName('compoundname')
                if ns_node:
                    ns = ns_node[0].firstChild.data
                    self.add_text(' %s::%s "\n%s'%(ns, name, defn))
                else:
                    self.add_text(' %s "\n%s'%(name, defn))
            elif cdef_kind in ('class', 'struct'):
                # Get the full function name.
                anc_node = anc.getElementsByTagName('compoundname')
                cname = self.cpp_to_swig_name(anc_node[0].firstChild.data)
                # self.add_text(' %s::%s "\n%s'%(cname, name, defn))
                self.add_text(' %s::%s "'%(cname, name))
                # print("***", name, defn)

            # make sure that the docstring won't be empty before writing any text
            current_length = len(self.pieces)

            for n in node.childNodes:
                # if n not in first.values():
                if n not in first.values() and (n.__class__.__name__ != "Element" or "description" in n.tagName):
                    self.parse(n)

            # make sure that the docstring won't be empty before writing any text
            if current_length == len(self.pieces):
                # restore the old self.pieces
                self.pieces = pieces_backup
            else:
                self.add_text(['";', '\n'])


def d2s_dir(in_dir_name, out_swig_i):
  conffile = file(in_dir_name)
  output = StringIO()
  for l in conffile:
    l = l.strip()
    if l != "":
      ls = l.split("\t")
      xfn = ls[0]
      if os.path.isfile(xfn): # make sure the assumed file exists
          cpp_name = ls[1]
#          print("-- Doxygen to SWIG: " + cpp_name)
          output2 = StringIO()
          d2s = itkDoxy2SWIG(xfn, cpp_name, "@[{(]})@")
          d2s.generate()
          d2s.write_to_file(output2)
          tpl = output2.getvalue()
          output2.close()
          for swig_name in ls[2:]:
            output.write(tpl.replace("@[{(]})@", swig_name))
      else:
        print("Warning: %s does not exist. Ignore it." % xfn, file=sys.stderr)
  f = open(out_swig_i, 'w')
  f.write(output.getvalue())
  f.close()

def main(in_dir_name, out_swig_i):
        d2s_dir(in_dir_name, out_swig_i)

if __name__ == '__main__':
        if len(sys.argv) != 3:
                print(__doc__)
                sys.exit(1)
        main(sys.argv[1], sys.argv[2])