medit/api/parsedocs.py

66 lines
2.3 KiB
Python

#! /usr/bin/env python
import os
import re
import sys
import optparse
import fnmatch
import filecmp
from mdp.docparser import Parser
from mdp.module import Module
import mdp.xmlwriter
def read_files(files, opts):
p = Parser()
p.read_files(files)
mod = Module('Moo' if not opts.module else opts.module)
mod.init_from_dox(p.classes + p.enums + p.functions + p.vmethods + p.signals)
return mod
def parse_args():
op = optparse.OptionParser()
op.add_option("--source-dir", dest="source_dirs", action="append",
help="parse source files from DIR", metavar="DIR")
op.add_option("--source-file", dest="source_files", action="append",
help="parse source file FILE", metavar="FILE")
op.add_option("--skip", dest="skip_globs", action="append",
help="skip files which match pattern PAT", metavar="PAT")
op.add_option("--output", dest="output", action="store",
help="write result to FILE", metavar="FILE")
op.add_option("--module", dest="module", action="store",
help="generate module MOD", metavar="MOD")
(opts, args) = op.parse_args()
if args:
op.error("too many arguments")
source_files = []
if opts.source_files:
source_files += [os.path.abspath(f) for f in opts.source_files]
skip_pat = None
if opts.skip_globs:
skip_pat = re.compile('|'.join([fnmatch.translate(g) for g in opts.skip_globs]))
if opts.source_dirs:
for source_dir in opts.source_dirs:
for root, dirs, files in os.walk(source_dir):
for f in files:
if f.endswith('.c') or f.endswith('.cpp') or f.endswith('.h'):
if skip_pat is None or not skip_pat.match(f):
source_files.append(os.path.join(root, f))
if not source_files:
op.error("no input files")
return opts, source_files
opts, files = parse_args()
mod = read_files(files, opts)
tmp_file = opts.output + '.tmp'
with open(tmp_file, 'w') as out:
mdp.xmlwriter.write_xml(mod, out)
if not os.path.exists(opts.output):
os.rename(tmp_file, opts.output)
elif filecmp.cmp(tmp_file, opts.output):
os.remove(tmp_file)
else:
os.remove(opts.output)
os.rename(tmp_file, opts.output)