11 from amara import bindery
12 from amara.xslt import transform
13 from Cheetah.Template import Template
15 parser = argparse.ArgumentParser(description='Process docbook article tree.')
16 parser.add_argument('--style', nargs='?',
17 default=os.path.dirname(os.getcwd())+'/style/default/')
18 parser.add_argument('--output', nargs='?',
19 default=os.path.dirname(os.getcwd())+'/htdocs/')
20 args = parser.parse_args()
22 style_xslt = args.style+"docbook.xsl"
23 style_tmpl = args.style+"index.en.html.tmpl"
24 outputdir = args.output
26 valid_scripts = ['.py','.pl']
32 except OSError as exc: # Python >2.5
33 if exc.errno == errno.EEXIST:
37 def generateSitemap():
40 sfile = open('sitemap.txt')
41 flist = sfile.read().split()
44 sitemap.append(dict(link=f))
45 except IOError, what_error:
46 print 'Sitemap missing - generating one.'
47 for dirname, dirnames, filenames in os.walk('.'):
48 for filename in filenames:
49 if fnmatch.fnmatch(filename, '*.xml'):
50 xfile = os.path.join(dirname,filename)
51 doc = bindery.parse(xfile,
52 prefixes={u'db': u'http://docbook.org/ns/docbook',
53 u'xi': u'http://www.w3.org/2001/XInclude'})
54 title = doc.xml_select(u'/db:article/db:info/db:title')
55 menu = doc.xml_select(u'/db:article/db:info/db:titleabbrev')
56 code = doc.xml_select(u"//xi:include[@parse='text']")
59 (p, ext) = os.path.splitext(c.href)
60 if ext in valid_scripts:
65 base = xfile.split('.')[1]
66 link = base.replace('index','')
67 level = len(filter(None,re.split(r'(/\w*/)',link)))
68 page = dict(title=unicode(doc.article.info.title),
69 menu=unicode(doc.article.info.titleabbrev),
70 output=os.path.join(dirname,
71 filename.replace('xml','html')),
80 print "adding "+link+" to sitemap"
84 sfile = open('sitemap.txt','w')
86 sfile.write(l['link']+'\n')
90 def expandXincludeTxt(page):
91 doc = bindery.parse(page['file'],
92 prefixes={u'db': u'http://docbook.org/ns/docbook',
93 u'xi': u'http://www.w3.org/2001/XInclude'})
95 code = doc.xml_select(u"//xi:include[@parse='text']")
97 (p, ext) = os.path.splitext(c.href)
98 if ext in valid_scripts:
99 exe = os.path.join(os.path.abspath(c.href))
100 xml = subprocess.Popen([exe],stdout=subprocess.PIPE)
101 xstr = bindery.parse(str(xml.stdout.read()))
102 id = c.xml_index_on_parent
103 for x in xstr.xml_children:
104 c.xml_parent.xml_insert(id,x)
105 c.xml_parent.xml_remove(c)
108 def xsltConvert(doc):
109 # amara can not handle the docbook stylesheets
110 # xmlarticle = transform(doc,style_xslt)
112 rundir = os.path.dirname(page['file'])
114 infile = os.path.basename(tempfile.mktemp())
115 outfile = tempfile.mktemp()
116 tfi = open(infile,'w')
117 tfi.write(doc.xml_encode())
119 # cmd = ["saxon-xslt-xinclude","-o",outfile,infile,style_xslt]
120 cmd = ["xsltproc","--xinclude","--output",outfile,style_xslt,infile]
121 retcode = subprocess.call(cmd)
123 print 'Error: '+' '.join(cmd)+' Returncode ['+str(retcode)+']'
124 tfo = open(outfile,'r')
132 def genMenu(page,sitemap,slevel,elevel):
135 if elevel == MAXLEVEL or elevel == 1:
138 idx = sitemap.index(page)
139 while (sitemap[idx]['level'] == page['level']):
141 title = sitemap[idx]['menu']
143 while (idx < len(sitemap) and sitemap[idx]['level'] == page['level']):
144 sm.append(sitemap[idx])
149 if slevel > p['level'] or elevel < p['level']:
151 if not title and p['link'] == '/':
154 if oldlevel < p['level']:
156 elif oldlevel > p['level']:
157 if p['link'][-1] == '/':
159 html+='</ul>\n</li>\n'
161 html+='<li><a href="%s">[%s]</a>' % (p['link'],p['menu'])
163 html+='<li><a href="%s">%s</a>' % (p['link'],p['menu'])
164 if p['link'][-1] != '/' or p['link'] == '/':
166 oldlevel = p['level']
170 def writeToTemplate(page,doc,sitemap):
171 (menu,menuname) = genMenu(page,sitemap,1,MAXLEVEL)
172 (levelmenu,levelname) = genMenu(page,sitemap,page['level'],page['level'])
173 template = Template(file=style_tmpl,
174 searchList=[{'menu':menu},
176 {'levelmenu':levelmenu},
177 {'levelname':levelname}])
178 outfile = outputdir+page['output']
179 d = os.path.split(outfile)[0]
182 out = open(outfile, 'w')
183 out.write(str(template))
185 sitemap = generateSitemap()
188 print "Page : "+page['link'],
189 doc = expandXincludeTxt(page)
190 pubdoc = xsltConvert(doc)
191 writeToTemplate(page,pubdoc,sitemap)
194 print "["+str(round(t2-t1,2))+"] done."