beta-0.89.2
[luatex.git] / source / libs / zziplib / zziplib-0.13.62 / docs / zzipdoc / docbookdocument.py
blobc4602ad64d38e1693873cf621264bbc10573c374
1 #! /usr/bin/env python
2 # -*- coding: UTF-8 -*-
3 from match import Match
5 class DocbookDocument:
6 """ binds some xml content page with additional markup - in this
7 variant we set the rootnode container to 'reference' and the DTD
8 to the Docbook 4.1.2 version. Modify as you like."""
9 has_title_child = [ "book", "chapter", "section", "reference" ]
10 docbook_dtd = (
11 ' PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"'+"\n"+
12 ' "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"')
13 def __init__(self, o, filename = None):
14 self.o = o
15 self.rootnode = "reference"
16 self.filename = filename
17 self.title = ""
18 self.text = []
19 def add(self, text):
20 """ add some content """
21 self.text += [ text ]
22 return self
23 def get_title(self):
24 if self.title: return title
25 try: return self.text[0].get_title()
26 except Exception, e: pass
27 return self.title
28 def _xml_doctype(self, rootnode):
29 return "<!DOCTYPE "+rootnode+self.docbook_dtd+">"
30 def _xml_text(self, xml):
31 """ accepts adapter objects with .xml_text() """
32 try: return xml.xml_text()
33 except Exception, e: print "DocbookDocument/text", e; pass
34 return str(xml)
35 def _fetch_rootnode(self, text):
36 fetch = Match(r"^[^<>]*<(\w+)\b")
37 if text & fetch: return fetch[1]
38 return self.rootnode
39 def _filename(self, filename):
40 if filename is not None:
41 self.filename = filename
42 filename = self.filename
43 if not filename & Match(r"\.\w+$"):
44 ext = self.o.docbook
45 if not ext: ext = "docbook"
46 filename += "."+ext
47 return filename
48 def save(self, filename = None):
49 filename = self._filename(filename)
50 print "writing '"+filename+"'"
51 if len(self.text) > 1:
52 self.save_all(filename)
53 else:
54 self.save_text(filename, self.text[0])
55 def save_text(self, filename, text):
56 try:
57 fd = open(filename, "w")
58 xml_text = self._xml_text(text)
59 rootnode = self._fetch_rootnode(xml_text)
60 doctype = self._xml_doctype(rootnode)
61 print >>fd, doctype
62 print >>fd, xml_text
63 fd.close()
64 return True
65 except IOError, e:
66 print "could not open '"+filename+"'file", e
67 return False
68 def save_all(self, filename):
69 assert len(self.text) > 1
70 try:
71 fd = open(filename, "w")
72 xml_text = self._xml_text(self.text[0])
73 rootnode = self._fetch_rootnode(xml_text)
74 if rootnode == self.rootnode:
75 rootnode = "book"
76 else:
77 rootnode = self.rootnode
78 doctype = self._xml_doctype(rootnode)
79 print >>fd, doctype
80 title = self.get_title()
81 if title and self.rootnode in self.has_title_child:
82 print >>fd, "<"+self.rootnode+'><title>'+title+'</title>'
83 elif title:
84 print >>fd, "<"+self.rootnode+' id="'+title+'">'
85 else:
86 print >>fd, "<"+self.rootnode+'>'
87 for text in self.text:
88 text = self._xml_text(text)
89 print >>fd, text
90 print >>fd, "</"+self.rootnode+">"
91 fd.close()
92 return True
93 except IOError, e:
94 print "could not open '"+filename+"'file", e
95 return False