def WriteXmlFile(collector): cfg = Config.Instance() SoarDocOutput.CreateOutputDirectory() w = SoarDocXml.Writer() doc = w(collector) f = open(os.path.join(cfg.OutputDirectory, cfg.XmlFileName), 'w') f.write(doc.toprettyxml(' ' * 3))
def writeProdIndex(self): cfg = Config.Instance() if not cfg.LogShowProductions: return html = self.createDoc() self.writeHeader(html) html.append(HTMLgen.Header(2, 'Production Summary for %s' % self.__logName)) prodNames = self.__prodTab.keys()[:] prodNames.sort() t = HTMLgen.TableLite(width='100%') html.append(t) tr = HTMLgen.TR(HTMLgen.TH('Production'), HTMLgen.TH('Description'), align='left') if cfg.LogShowProdFirings: tr.append(HTMLgen.TH('Firings')) if cfg.LogShowProdRetractions: tr.append(HTMLgen.TH('Retractions')) t.append(tr) trBgColors = ['white', '#f2f2ff'] c = 1 for prodName in prodNames: sdpr = self.__col.GetObject(self.__col.ProdTab, prodName) tr = self.buildProdEntry(prodName, self.__prodTab[prodName], sdpr) if tr: tr.bgcolor = trBgColors[c] t.append(tr) c = not c # alternate colors SoarDocOutput.WriteFooter(html) html.write(os.path.join(Config.Instance().OutputDirectory, self.ProdIdxFile))
def GenerateLogDoc(collector, logFileName, state): name, ext = os.path.splitext(logFileName) # Pull off the extension SoarDocOutput.CreateOutputDirectory() w = LogWriter(collector, logFileName, state) # Write a pretty version of the log file logUrl = name + '_log.html' w.Write(os.path.join(Config.Instance().OutputDirectory, logUrl)) iw = IndexWriter(collector, name, state, logUrl, 'log') # Write indices for the log file iw.Write() # Build a frame document to hold indices and pretty log f1 = HTMLgen.Frame(name=INDEX_FRAME_NAME, src=iw.OpIdxFile) f2 = HTMLgen.Frame(name=LOG_FRAME_NAME, src =logUrl) fs = HTMLgen.Frameset(f1, f2, rows='50%,50%') fdoc = HTMLgen.FramesetDocument(title='SoarLog: %s' % name) fdoc.script = HTMLgen.Script(code=GetSoarDocNavFrameScript()) fdoc.append(fs) fsUrl = name + '.html' # This is a bit of hack to work around a bug in HTMLgen. # The FramesetDocument class doesn't properly write out its # script property because it's derived from BasicDocument. f = open(os.path.join(Config.Instance().OutputDirectory, fsUrl), 'w') f.write(HTMLgen.DOCTYPE) f.write('<head><title>%s</title>%s</head>' % (fdoc.title, str(fdoc.script))) f.write(str(fs)) f.write('</html>')
def GenerateXmlLog(logFileName, state): name, ext = os.path.splitext(logFileName) # Pull off the extension SoarDocOutput.CreateOutputDirectory() doc = Writer()(name, state) f = open(os.path.join(Config.Instance().OutputDirectory, name + '.xml'), 'w') f.write(doc.toprettyxml(' ' * 3))
def Write(self, fileName): self.setupAgentOutputFilters() self.__html = HTMLgen.SimpleDocument() self.__html.script = HTMLgen.Script(code=GetSoarDocNavScript()) self.__html.append(HTMLgen.Heading(2,'Soar Log File: %s' % self.__logFileName)) self.__table = HTMLgen.TableLite(border=0, cellspacing=0, width='100%') self.__html.append(self.__table) self.writeState(self.__logState, 0) SoarDocOutput.WriteFooter(self.__html) self.__html.write(fileName)
def __init__(self, collector, logFileName, logState): self.__col = collector self.__logFileName = logFileName self.__logState = logState self.__maxDepth = SoarLog.DepthCalculator()(logState) self.__sdhg = SoarDocOutput.HrefGen(collector) self.__ag = AnchorGen() self.__colors = ['#f2f2ff', '#e2e2ff', '#d2d2ff', '#c2c2ff', '#b2b2ff', '#a2a2ff', '#b2b2ff', '#c2c2ff', '#d2d2ff', '#e2e2ff'] self.__lastCycle = -1 self.__wroteCycle = 0
def __init__(self, collector, logName, logState, logUrl, logTgt): self.__col = collector self.__logName = logName self.__logState = logState self.__logUrl = logUrl self.__logTgt = logTgt self.__sdhg = SoarDocOutput.HrefGen(collector) self.__ag = AnchorGen() self.__stateTab = {} self.__opTab = {} self.__prodTab = {} self.collectObject(None, logState) self.OpIdxFile = logName + 'OpIdx.html' self.ProdIdxFile = logName + 'PrIdx.html' self.__logNavScript = """ function logNav(f, s) { window.open(window.document.forms[f][s].value, "%s") } """ % (self.__logTgt,)
def writeOpIndex(self): html = self.createDoc() self.writeHeader(html) html.append(HTMLgen.Header(2, 'Operator Summary for %s' % self.__logName)) opNames = self.__opTab.keys()[:] opNames.sort() t = HTMLgen.TableLite(width='100%') html.append(t) t.append(HTMLgen.TR( HTMLgen.TH('Operator'), HTMLgen.TH('Description'), HTMLgen.TH('Cycles'), align='left')) trBgColors = ['white', '#f2f2ff'] c = 1 for opName in opNames: tr = HTMLgen.TR(bgcolor=trBgColors[c], valign='top') self.writeOpEntry(tr, opName, self.__opTab[opName]) t.append(tr) c = not c SoarDocOutput.WriteFooter(html) html.write(os.path.join(Config.Instance().OutputDirectory,self.OpIdxFile))
def WriteAutoDocFile(collector, dm): cfg = Config.Instance() SoarDocOutput.CreateOutputDirectory() w = DocBlockWriter.Writer() # we append here since we may have read documentation from # an existing autodoc file and we don't want to blow it away. f = open(os.path.join(cfg.OutputDirectory, cfg.AutoDocFileName), 'a') # todo, write this as a 'diff/patch' file? # if there's no mainpage write a stub... if not collector.MainPage: f.write('##!\n') f.write('# @mainpage %s\n' % cfg.ProjectName) f.write('#\n') f.write('# <h1>Documentation for %s</h1>\n' % cfg.ProjectName) f.write('\n') for p in collector.Prods: if p.IsTemp(): p.Type = p.GuessType() if dm: # for all undocumented productions, see if we can augment their # @problem-space and @operator properties with info from the # datamap # TODO - how can we handle this for documented productions? for ps in dm.GetProblemSpaces(): psname = ps.GetName() for pname in ps.GetProductions(): p = collector.GetObject(collector.ProdTab, pname) if p and p.IsTemp() and not psname in p.ProblemSpaces: p.ProblemSpaces.append(psname) for op in dm.GetOperators(): opname = op.GetName() for pname in op.GetProductions(): p = collector.GetObject(collector.ProdTab, pname) if p and p.IsTemp() and not opname in p.Operators: p.Operators.append(opname) # Now write everybody else that isn't documented. for b in collector.All: if b.IsTemp(): f.write('# %s:%d\n' % (b.GetSourceFile(), b.GetSourceLineNo())) w(f, b) f.write('\n') # If there's a datamap, let's try to generate some problem-space and # operators... if dm: opParentMap = {} # look for undocumented problem spaces for ps in dm.GetProblemSpaces(): if not collector.GetObject(collector.ProblemSpaceTab, ps.GetName()): f.write('##!\n') f.write('# @problem-space %s\n' % ps.GetName()) f.write('# @brief Generated by SoarDoc from dmgen\n') # if there's an operator with the same name, we'll assume this # problem-space is a child of that operator if dm.GetOperator(ps.GetName()): f.write('#\n') f.write('# @operator %s\n' % ps.GetName()) f.write('\n') for opName in ps.ProposedOperators: if not opParentMap.has_key(opName): opParentMap[opName] = [] opParentMap[opName].append(ps.GetName()) # look for undocumented operators for op in dm.GetOperators(): if not collector.GetObject(collector.OperatorTab, op.GetName()): f.write('##!\n') f.write('# @operator %s\n' % op.GetName()) f.write('# @brief Generated by SoarDoc from dmgen\n') if opParentMap.has_key(op.GetName()): opParents = opParentMap[op.GetName()] f.write('#\n# @problem-space %s\n' % ' '.join(opParents)) f.write('\n')
cfg.EvaluateOverride(override) try: dm = LoadXmlDatamap() # load datamap if specified in config file except Exception, e: print 'Error: While loading XML datamap: ', e sys.exit(1) if not LogFile: # Recursively walk the input directory tree, creating docblock objects blocks = DirTreeWalker()(cfg.InputDirectory) # Collect blocks, removing duplicates, etc. c = BlockCollector.Collector(blocks, dm) if cfg.OutputFormat == 'html': # Write the documentation w = SoarDocOutput.Writer(c) elif cfg.OutputFormat == 'xml': WriteXmlFile(c) elif cfg.OutputFormat == 'autodoc': WriteAutoDocFile(c, dm) else: print 'Error: Unknown OutputFormat value "%s"' % cfg.OutputFormat sys.exit(1) else: p = SoarLog.Parser() try: state = p.Parse(LogFile) except IOError, e: print 'Error: While loading log file "%s": %s' % (LogFile, e) baseName = os.path.basename(LogFile) # File name without path if cfg.LogOutputFormat == 'html':
def createDoc(self): html = HTMLgen.SimpleDocument(meta=SoarDocOutput.CreateGeneratorTags(), script=[HTMLgen.Script(code=self.__logNavScript), HTMLgen.Script(code=GetSoarDocNavScript())]) return html