Merge branch 'uvldoc'
[project/luci.git] / libs / uvldoc / luasrc / uvldoc / renderer.lua
1 --[[
2 LuCI - Lua Configuration Interface
3
4 Copyright 2008 Steven Barth <steven@midlink.org>
5 Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
6
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
10
11 http://www.apache.org/licenses/LICENSE-2.0
12
13 $Id$
14 ]]--
15
16 local io = require "io"
17 local fs = require "luci.fs"
18 local uvl = require "luci.uvl"
19 local util = require "luci.util"
20 local ltn12 = require "luci.ltn12"
21 local template = require "luci.template"
22
23 local ipairs = ipairs
24
25 module "luci.uvldoc.renderer"
26
27
28 Generator = util.class()
29
30 function Generator.__init__(self, schemes, output)
31         self.names   = schemes
32         self.output  = output or "doc"
33         self.schemes = {}
34         self.uvl     = uvl.UVL()
35         
36         self.extension = ".xml"
37         self.additionals = {"uvldoc.css"}
38         self.sourcedir = util.libpath() .. "/uvldoc/proto/xhtml/"
39 end
40
41
42 function Generator.make(self)
43         for i, scheme in ipairs(self.names) do
44                 self.schemes[scheme] = self.uvl:get_scheme(scheme)
45         end
46
47         fs.mkdir(self.output)
48
49         for i, file in ipairs(self.additionals) do
50                 fs.copy(self.sourcedir .. file, self.output)
51         end
52
53         template.compiler_mode = "memory"
54         template.viewdir = self.sourcedir
55
56         self:_make_index()
57
58         for scheme, file in util.kspairs(self.schemes) do
59                 self:_make_package(scheme)
60         end
61 end
62
63 function Generator._make_index(self)
64         local t = template.Template("index.xml")
65         local sink = ltn12.sink.file(
66                 io.open(self.output .. "/" .. self:_index_filename(), "w")
67         )
68         t:render({self = self, write = sink})
69         sink()
70 end
71
72 function Generator._make_package(self, scheme)
73         local t = template.Template("scheme.xml")
74         local sink = ltn12.sink.file(
75                 io.open(self.output .. "/" .. self:_scheme_filename(scheme), "w")
76         )
77         t:render({self = self, package = self.schemes[scheme], scheme = scheme, write = sink})
78         sink()
79 end
80
81 function Generator._index_filename(self)
82         return "index%s" % self.extension
83 end
84
85 function Generator._scheme_filename(self, scheme)
86         return "scheme.%s%s" % {scheme, self.extension}
87 end