def run(self): options = self.options servicedef = ServiceDef() servicedef.load(options.filename) self.servicedefmgr.add(servicedef) for related in (options.related or []): relateddef = ServiceDef() relateddef.load(related) self.servicedefmgr.add(relateddef) title = "%s v%s %s" % (servicedef.title, servicedef.version, servicedef.status) name = (self.options.urlname or servicedef.name) relname = os.path.join(name, servicedef.version, 'service') outdir = options.outdir fullname = os.path.abspath(os.path.join(outdir, relname)) fulldir = os.path.dirname(fullname) if not os.path.exists(fulldir): os.makedirs(fulldir) apiroot = options.apiroot or ("/api/%s/%s" % (servicedef.name, servicedef.version)) # HTML version if options.html: html = fullname + '.html' if os.path.exists(html): os.remove(html) htmldoc = reschema.html.Document(title, printable=False) htmldoc.header.a(href="http://www.riverbed.com", cls="headerimg") hl = htmldoc.header.div(cls="headerleft") breadcrumbs = hl.div(cls="breadcrumbs") breadcrumbs.a(href="../../index.html").text = "apis" breadcrumbs.span().text = unescape(" » ") breadcrumbs.a(href=("../index.html")).text = name breadcrumbs.span().text = unescape(" » {}" "".format(servicedef.version)) hl.div(cls="headertitle").text = title htmldoc.header.span(cls="headerright").text = ( "Created %s" % datetime.datetime.now().strftime("%b %d, %Y at %I:%M %p")) r2h = ServiceDefToHtml(servicedef, htmldoc.content, htmldoc.menu, device=options.device, apiroot=apiroot, options=Options(printable=False, json=(not options.nojson), xml=(not options.noxml), apiroot=apiroot, docroot=outdir)) r2h.process() htmldoc.write(html) print("Wrote %s" % html) # PDF if options.pdf: # First make a printable HTML phtml = fullname + '-printable.html' if os.path.exists(phtml): os.remove(phtml) htmldoc = reschema.html.Document(title, printable=True) r2h = ServiceDefToHtml(servicedef, htmldoc.content, htmldoc.menu, device=options.device, apiroot=apiroot, options=Options(printable=True, json=(not options.nojson), xml=(not options.noxml), apiroot=apiroot, docroot=outdir)) r2h.process() htmldoc.write(phtml) print("Wrote %s" % phtml) ### PDF if options.wkhtmltopdf is not None: wkhtmltopdf = options.wkhtmltopdf else: wkhtmltopdf = distutils.spawn.find_executable("wkhtmltopdf") if not wkhtmltopdf: if not "WKHTMLTOPDF" in os.environ: raise ReschemaDocException( "Cannot find 'wkhtmltopdf' in path, " "use -w <path> or set WKHTMLTOPDF env variable") wkhtmltopdf = os.environ['WKHTMLTOPDF'] args = [wkhtmltopdf, "--version"] lines = subprocess.check_output(args).split('\n') version = None for line in lines: g = re.search("wkhtmltopdf ([0-9]+)\.([0-9]+)", line) if g: version = int(g.group(2)) break if version is None: print("WARNING: Could not determine wkhtmltopdf version, " "assuming latest") else: print("wkhtmltopdf version %d" % version) if version is None or version >= 10: tocarg = "toc" coverarg = "cover" else: tocarg = "--toc" coverarg = "--cover" # create a cover apge cover = fullname + '-cover.html' cover_base = reschema.html.HTMLElement('html') cover_body = cover_base.body() cover_body.h1().text = title if options.copyright: cover_body.p().text = "Copyright \xa9 " + str( options.copyright) created = datetime.datetime.now().strftime("%b %d, %Y at %I:%m %p") cover_body.p().text = "Created %s" % created f = open(cover, "w") f.write(reschema.html.ET.tostring(cover_base, method="html")) f.close() pdf = fullname + '.pdf' if os.path.exists(pdf): os.remove(pdf) args = [ wkhtmltopdf, '--title', title, coverarg, cover, tocarg, '--toc-header-text', 'Contents', '--footer-center', '[page]', phtml, pdf ] subprocess.check_call(args) # Fix for 'illegal byte sequence' os.environ['LC_TYPE'] = 'C' os.environ['LANG'] = 'C' args = ['sed', '-i.bak', '-e', 's/#00//g', pdf] subprocess.check_call(args) print("Wrote %s" % pdf) os.remove(pdf + ".bak")