| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
import gaphor |
|---|
| 4 |
import gaphor.storage as storage |
|---|
| 5 |
import gaphor.UML as UML |
|---|
| 6 |
import diacanvas |
|---|
| 7 |
|
|---|
| 8 |
import cairo |
|---|
| 9 |
import cairo.svg |
|---|
| 10 |
|
|---|
| 11 |
import optparse |
|---|
| 12 |
import os |
|---|
| 13 |
import re |
|---|
| 14 |
import sys |
|---|
| 15 |
import tempfile |
|---|
| 16 |
|
|---|
| 17 |
def pkg2dir(package): |
|---|
| 18 |
""" |
|---|
| 19 |
Return directory path from UML package class. |
|---|
| 20 |
""" |
|---|
| 21 |
name = [] |
|---|
| 22 |
while package: |
|---|
| 23 |
name.insert(0, package.name) |
|---|
| 24 |
package = package.package |
|---|
| 25 |
return '/'.join(name) |
|---|
| 26 |
|
|---|
| 27 |
|
|---|
| 28 |
def message(msg): |
|---|
| 29 |
""" |
|---|
| 30 |
Print message if user set verbose mode. |
|---|
| 31 |
""" |
|---|
| 32 |
global options |
|---|
| 33 |
if options.verbose: |
|---|
| 34 |
print >> sys.stderr, msg |
|---|
| 35 |
|
|---|
| 36 |
|
|---|
| 37 |
usage = 'usage: %prog [options] file1 file2...' |
|---|
| 38 |
|
|---|
| 39 |
parser = optparse.OptionParser(usage = usage) |
|---|
| 40 |
|
|---|
| 41 |
parser.add_option('-v', '--verbose', dest = 'verbose', action = 'store_true', |
|---|
| 42 |
help = 'verbose output') |
|---|
| 43 |
parser.add_option('-u', '--use-underscores', dest = 'underscores', action = 'store_true', |
|---|
| 44 |
help = 'use underscores instead of spaces for output filenames') |
|---|
| 45 |
parser.add_option('-d', '--dir', dest = 'dir', metavar = 'directory', |
|---|
| 46 |
help = 'output to directory') |
|---|
| 47 |
parser.add_option('-f', '--format', dest = 'format', metavar = 'format', |
|---|
| 48 |
help = 'output file format, default pdf', default = 'pdf', |
|---|
| 49 |
choices = ['pdf', 'svg']) |
|---|
| 50 |
parser.add_option('-r', '--regex', dest = 'regex', metavar = 'regex', |
|---|
| 51 |
help = 'process diagrams which name matches given regular expresion;' \ |
|---|
| 52 |
' name includes package name; regular expressions are case insensitive') |
|---|
| 53 |
|
|---|
| 54 |
(options, args) = parser.parse_args() |
|---|
| 55 |
|
|---|
| 56 |
if not args: |
|---|
| 57 |
parser.print_help() |
|---|
| 58 |
sys.exit(1) |
|---|
| 59 |
|
|---|
| 60 |
|
|---|
| 61 |
factory = UML.ElementFactory() |
|---|
| 62 |
|
|---|
| 63 |
|
|---|
| 64 |
name_re = None |
|---|
| 65 |
if options.regex: |
|---|
| 66 |
name_re = re.compile(options.regex, re.I) |
|---|
| 67 |
|
|---|
| 68 |
|
|---|
| 69 |
for model in args: |
|---|
| 70 |
message('loading model %s' % model) |
|---|
| 71 |
storage.load(model, factory) |
|---|
| 72 |
message('\nready for rendering\n') |
|---|
| 73 |
|
|---|
| 74 |
for diagram in factory.select(lambda e: e.isKindOf(UML.Diagram)): |
|---|
| 75 |
dir = pkg2dir(diagram.package) |
|---|
| 76 |
|
|---|
| 77 |
pname = dir + '/' + diagram.name |
|---|
| 78 |
|
|---|
| 79 |
if options.underscores: |
|---|
| 80 |
dir = dir.replace(' ', '_') |
|---|
| 81 |
pname = pname.replace(' ', '_') |
|---|
| 82 |
|
|---|
| 83 |
if name_re and not name_re.search(pname): |
|---|
| 84 |
message('skipping %s' % pname) |
|---|
| 85 |
continue |
|---|
| 86 |
|
|---|
| 87 |
if options.dir: |
|---|
| 88 |
dir = '%s/%s' % (options.dir, dir) |
|---|
| 89 |
|
|---|
| 90 |
pdf_name = '%s/%s.pdf' % (dir, diagram.name) |
|---|
| 91 |
|
|---|
| 92 |
|
|---|
| 93 |
if options.format == 'svg': |
|---|
| 94 |
svg_name = '%s/%s.svg' % (dir, diagram.name) |
|---|
| 95 |
out_name = svg_name |
|---|
| 96 |
else: |
|---|
| 97 |
fd, svg_name = tempfile.mkstemp() |
|---|
| 98 |
del fd |
|---|
| 99 |
out_name = pdf_name |
|---|
| 100 |
|
|---|
| 101 |
if not os.path.exists(dir): |
|---|
| 102 |
message('creating dir %s' % dir) |
|---|
| 103 |
os.makedirs(dir) |
|---|
| 104 |
|
|---|
| 105 |
message('rendering: %s -> %s...' % (pname, out_name)) |
|---|
| 106 |
|
|---|
| 107 |
|
|---|
| 108 |
|
|---|
| 109 |
|
|---|
| 110 |
svg = diacanvas.ExportSVG() |
|---|
| 111 |
svg.render(diagram.canvas) |
|---|
| 112 |
svg.save(svg_name) |
|---|
| 113 |
|
|---|
| 114 |
if options.format == 'pdf': |
|---|
| 115 |
svg = cairo.svg.Context() |
|---|
| 116 |
svg.parse(svg_name) |
|---|
| 117 |
width, height = svg.get_size() |
|---|
| 118 |
|
|---|
| 119 |
ctx = cairo.Context(cairo.PDFSurface(pdf_name, width, height)) |
|---|
| 120 |
svg.render(ctx) |
|---|
| 121 |
ctx.show_page() |
|---|
| 122 |
|
|---|
| 123 |
|
|---|
| 124 |
os.unlink(svg_name) |
|---|