Mercurial > projects > dil
diff src/docgen/page/writer.d @ 806:bcb74c9b895c
Moved out files in the trunk folder to the root.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 09 Mar 2008 00:12:19 +0100 |
parents | trunk/src/docgen/page/writer.d@cb8edb09108a |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/docgen/page/writer.d Sun Mar 09 00:12:19 2008 +0100 @@ -0,0 +1,231 @@ +/** + * Author: Jari-Matti Mäkelä + * License: GPL3 + */ +module docgen.page.writer; + +public import docgen.misc.misc; +public import docgen.misc.options; +public import docgen.misc.parser; +import tango.io.model.IConduit : OutputStream; +import tango.time.chrono.Gregorian; +import tango.text.locale.Core; +import tango.time.WallClock; +import tango.text.convert.Sprint; +import tango.io.stream.FileStream; +import tango.io.Stdout; +import tango.io.Print: Print; +import tango.text.convert.Layout : Layout; +import tango.io.FilePath; +import tango.io.FileScan; + +const templateDir = "docgen/templates/"; + +const formatDirs = [ "latex"[], "xml"[], "html"[], "plaintext"[] ]; + +/** + * Writes the logical subcomponents of a document, + * e.g. sections, embedded graphics, lists + */ +interface PageWriter { + /** + * Updates the outputstreams. + */ + void setOutput(OutputStream[] outputs); + + /** + * Generates the first page(s). + */ + void generateFirstPage(); + + /** + * Generates table of contents. + */ + void generateTOC(Module[] modules); + + /** + * Generates class documentation section. + */ + void generateClassSection(); + + /** + * Generates module documentation section. + */ + void generateModuleSection(Module[] modules); + + /** + * Generates source code listing section. + */ + void generateListingSection(Module[] modules); + + /** + * Generates dependency graph section. + */ + void generateDepGraphSection(); + + /** + * Generates an index section. + */ + void generateIndexSection(); + + /** + * Generates the last page(s). + */ + void generateLastPage(); + + /** + * Generates a page using a custom template file. + * + * Some examples: style sheet, DTD files, makefiles. + */ + void generateCustomPage(char[] name, char[][] args ...); + + // --- page components + // + /* + * Adds an external graphics file. + */ + void addGraphics(char[] imageFile); + + /** + * Adds a source code listing. + */ + void addListing(char[] moduleName, char[] contents, bool inline = true); + + /** + * Adds a list of items. + */ + void addList(char[][] contents, bool ordered); +} + +interface PageWriterFactory : WriterFactory { + PageWriter createPageWriter(OutputStream[] outputs, DocFormat outputFormat); +} + +template AbstractPageWriter(char[] format, int n = 0) { + abstract class AbstractPageWriter : AbstractWriter!(PageWriterFactory, n), PageWriter { + protected: + + char[][char[]] m_templates; + Print!(char) print; + + public: + + this(PageWriterFactory factory, OutputStream[] outputs) { + this(factory); + setOutput(outputs); + } + + void setOutput(OutputStream[] outputs) { + this.outputs = outputs; + static if (n > 0) + assert(outputs.length == n, "Incorrect number of outputs"); + + print = new Print!(char)(new Layout!(char), outputs[0]); + } + + void generateTOC(Module[] modules) { + print.format(getTemplate("toc")); + } + + void generateClassSection() { + print.format(getTemplate("classes")); + } + + void generateModuleSection(Module[] modules) { + print.format(getTemplate("modules")); + } + + void generateListingSection(Module[] modules) { + print.format(getTemplate("listings")); + } + + void generateDepGraphSection() { + print.format(getTemplate("dependencies")); + } + + void generateIndexSection() { + print.format(getTemplate("index")); + } + + void generateLastPage() { + print.format(getTemplate("lastpage")); + } + + void generateCustomPage(char[] name, char[][] args ...) { + switch(args.length) { + case 0: print.format(getTemplate(name)); break; + case 1: print.format(getTemplate(name), args[0]); break; + case 2: print.format(getTemplate(name), args[0], args[1]); break; + case 3: print.format(getTemplate(name), args[0], args[1], args[2]); break; + default: throw new Exception("Too many arguments"); + } + } + + //--- + + void addGraphics(char[] imageFile) { + print.format(getTemplate("graphics"), imageFile); + } + + void addListing(char[] moduleName, char[] contents, bool inline) { + print.format(getTemplate("listing"), moduleName, contents); + } + + protected: + + this(PageWriterFactory factory) { + super(factory); + + auto scan = new FileScan(); + scan(templateDir~factory.options.templates.templateStyle~"/"~format~"/", ".tpl"); + + debug Stdout(scan.files.length)(" template files loaded.\n"); + + foreach(tpl; scan.files) { + m_templates[tpl.name] = loadTemplate(tpl.toString()); + } + } + + char[] getTemplate(char[] name) { + auto tpl = name in m_templates; + assert(tpl, "Error: template ["~format~"/"~name~"] not found!"); + return *tpl; + } + + char[] loadTemplate(char[] fn) { + scope(failure) { + Stderr("Warning: error opening template "~fn~"."); + return null; + } + + auto file = new FileInput(fn); + auto content = new char[file.length]; + auto bytesRead = file.read(content); + + assert(bytesRead == file.length, "Error reading template"); + + file.close(); + + return content; + } + + char[] timeNow() { + auto n = WallClock.now; + auto c = Gregorian.generic; + auto d = c.toDate(n); + auto sprint = new Sprint!(char); + + auto culture = new Culture("en-GB"); + auto dateTimeFormat = culture.dateTimeFormat(); + + return sprint.format("{} {} {} {}", + dateTimeFormat.getAbbreviatedDayName(c.getDayOfWeek(n)), + 1,//d.day(), + //dateTimeFormat.getAbbreviatedMonthName(d.month()), + 2,//d.month(), + 3//d.year()) //FIXME: something is broken here (Error: function expected before (), not *(&d + 8u) of type uint) + ).dup; + } + } +}