10 from amara import bindery
11 from amara.xslt import transform
12 from Cheetah.Template import Template
14 dist = os.path.dirname(os.getcwd())
16 style_xslt = dist+"/style/"+style+"/docbook.xsl"
17 style_tmpl = dist+"/style/"+style+"/index.html.tmpl"
18 outputdir = dist+"/htdocs/"
20 valid_scripts = ['.py','.pl']
26 except OSError as exc: # Python >2.5
27 if exc.errno == errno.EEXIST:
31 def generateSitemap():
34 sfile = open('sitemap.txt')
35 flist = sfile.read().split()
38 sitemap.append(dict(link=f))
39 except IOError, what_error:
40 print 'Sitemap missing - generating one.'
41 for dirname, dirnames, filenames in os.walk('.'):
42 for filename in filenames:
43 if fnmatch.fnmatch(filename, '*.xml'):
44 xfile = os.path.join(dirname,filename)
45 doc = bindery.parse(xfile,
46 prefixes={u'db': u'http://docbook.org/ns/docbook',
47 u'xi': u'http://www.w3.org/2001/XInclude'})
48 title = doc.xml_select(u'/db:article/db:info/db:title')
49 menu = doc.xml_select(u'/db:article/db:info/db:titleabbrev')
50 code = doc.xml_select(u"//xi:include[@parse='text']")
53 (p, ext) = os.path.splitext(c.href)
54 if ext in valid_scripts:
59 base = xfile.split('.')[1]
60 link = base.replace('index','')
61 level = len(filter(None,re.split(r'(/\w*/)',link)))
62 page = dict(title=unicode(doc.article.info.title),
63 menu=unicode(doc.article.info.titleabbrev),
64 output=os.path.join(dirname,filename.replace('xml','html')),
73 print "adding "+link+" to sitemap"
77 sfile = open('sitemap.txt','w')
79 sfile.write(l['link']+'\n')
83 def expandXincludeTxt(page):
84 doc = bindery.parse(page['file'],prefixes={u'db': u'http://docbook.org/ns/docbook',
85 u'xi': u'http://www.w3.org/2001/XInclude'})
87 code = doc.xml_select(u"//xi:include[@parse='text']")
89 (p, ext) = os.path.splitext(c.href)
90 if ext in valid_scripts:
91 exe = os.path.join(os.path.abspath(c.href))
92 xml = subprocess.Popen([exe],stdout=subprocess.PIPE)
93 xstr = bindery.parse(str(xml.stdout.read()))
94 id = c.xml_index_on_parent
95 for x in xstr.xml_children:
96 c.xml_parent.xml_insert(id,x)
97 c.xml_parent.xml_remove(c)
100 def xsltConvert(doc):
101 # amara can not handle the docbook stylesheets
102 # xmlarticle = transform(doc,style_xslt)
104 rundir = os.path.dirname(page['file'])
106 infile = os.path.basename(tempfile.mktemp())
107 outfile = tempfile.mktemp()
108 tfi = open(infile,'w')
109 tfi.write(doc.xml_encode())
111 # cmd = ["saxon-xslt-xinclude","-o",outfile,infile,style_xslt]
112 cmd = ["xsltproc","--xinclude","--output",outfile,style_xslt,infile]
113 retcode = subprocess.call(cmd)
115 print 'Error: '+' '.join(cmd)+' Returncode ['+str(retcode)+']'
116 tfo = open(outfile,'r')
124 def genMenu(page,sitemap,slevel,elevel):
127 if elevel == MAXLEVEL or elevel == 1:
130 idx = sitemap.index(page)
131 while (sitemap[idx]['level'] == page['level']):
133 title = sitemap[idx]['menu']
135 while (idx < len(sitemap) and sitemap[idx]['level'] == page['level']):
136 sm.append(sitemap[idx])
141 if slevel > p['level'] or elevel < p['level']:
143 if not title and p['link'] == '/':
146 if oldlevel < p['level']:
148 elif oldlevel > p['level']:
149 if p['link'][-1] == '/':
151 html+='</ul>\n</li>\n'
153 html+='<li><a href="%s">[%s]</a>' % (p['link'],p['menu'])
155 html+='<li><a href="%s">%s</a>' % (p['link'],p['menu'])
156 if p['link'][-1] != '/' or p['link'] == '/':
158 oldlevel = p['level']
162 def writeToTemplate(page,doc,sitemap):
163 (menu,menuname) = genMenu(page,sitemap,1,MAXLEVEL)
164 (levelmenu,levelname) = genMenu(page,sitemap,page['level'],page['level'])
165 template = Template(file=style_tmpl,
166 searchList=[{'menu':menu},
168 {'levelmenu':levelmenu},
169 {'levelname':levelname}])
170 outfile = outputdir+page['output']
171 d = os.path.split(outfile)[0]
174 out = open(outfile, 'w')
175 out.write(str(template))
177 sitemap = generateSitemap()
180 print "Page : "+page['link'],
181 doc = expandXincludeTxt(page)
182 pubdoc = xsltConvert(doc)
183 writeToTemplate(page,pubdoc,sitemap)
186 print "["+str(round(t2-t1,2))+"] done."