16 <div style="background-color: #e8ffe8; padding: 2; border: #c0ffc0 1px solid;">
19 This page is for %(package_name)s-%(package_version)s (%(branch_str)s). <br>
21 <address><font size="-1">
22 Report errors to <a href="%(mail_address_url)s">%(mail_address)s</a>.</font></address>
27 mail_address = 'http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs'
29 header_tag = '<!-- header_tag -->'
30 footer_tag = '<!-- footer_tag -->'
35 language_available = _ ("Other languages: %s.") % "%(language_menu)s"
36 browser_language = _ ("Using <A HREF='%s'>automatic language selection</A>.") \
37 % "/web/about/browser-language"
39 LANGUAGES_TEMPLATE = '''\
41 %(language_available)s
48 html_re = re.compile ('(.*?)(?:[.]([^/.]*))?[.]html$')
51 def build_pages_dict (filelist):
52 """Build dictionnary of available translations of each page"""
58 if len (g) <= 1 or g[1] == None:
62 if not g[0] in pages_dict.keys():
63 pages_dict[g[0]] = [e]
65 pages_dict[g[0]].append (e)
68 """Add header (<BODY> and doctype)"""
69 if re.search (header_tag, s) == None:
70 body = '<BODY BGCOLOR=WHITE TEXT=BLACK>'
71 s = re.sub ('(?i)<body>', body, s)
72 if re.search ('(?i)<BODY', s):
73 s = re.sub ('(?i)<body[^>]*>', body + header, s, 1)
74 elif re.search ('(?i)<html', s):
75 s = re.sub ('(?i)<html>', '<HTML>' + header, s, 1)
79 s = header_tag + '\n' + s
81 if re.search ('(?i)<!DOCTYPE', s) == None:
82 doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n'
86 def info_external_ref_remove (s):
87 """Remove info's annoying's indication of referencing external document"""
88 return re.sub (' \((lilypond|lilypond-internals|music-glossary)\)</a>', '</a>', s)
92 # maybe find first node?
93 fallback_web_title = '-- --'
94 m = re.match ('.*?<title>(.*?)</title>', s, re.DOTALL)
96 fallback_web_title = m.group (1)
97 s = re.sub ('@WEB-TITLE@', fallback_web_title, s)
100 info_nav_bar = re.compile (r'<div class="node">\s*<p>\s*<a name=".+?"></a>(.+?)<hr>\s*</div>', re.M | re.S)
105 also add navigation bar to bottom of Info HTML pages"""
106 m = info_nav_bar.search (s)
108 custom_footer = '<br><hr>\n<div class="node">\n<p>' + m.group (1) + '</div>\n' + footer
110 custom_footer = footer
111 if re.search ('(?i)</body', s):
112 s = re.sub ('(?i)</body>', footer_tag + custom_footer + '\n' + '</BODY>', s, 1)
113 elif re.search ('(?i)</html', s):
114 s = re.sub ('(?i)</html>', footer_tag + custom_footer + '\n' + '</HTML>', s, 1)
116 s += footer_tag + custom_footer + '\n'
119 def find_translations (prefix, lang_ext):
120 """find available translations of a page"""
123 for l in langdefs.LANGUAGES:
126 if e in pages_dict[prefix]:
128 elif lang_ext == '' and l.enabled and \
129 ('lilypond/' in prefix or 'lilypond-internals/' in prefix or 'music-glossary/' in prefix or 'input/' in prefix):
130 # English version of missing translated pages in the splitted docs will be written
132 return available, missing
134 def process_links (s, prefix, lang_ext, file_name, missing, target):
136 if target == 'online':
137 # Strip .html, .png suffix for auto language selection (content
138 # negotiation). The menu must keep the full extension, so do
139 # this before adding the menu.
140 page_flavors[file_name] = re.sub (
141 '''(href|src)=[\'"]([^/][.]*[^.:\'"]*)(.html|.png)(#[^"\']*|)[\'"]''',
143 elif target == 'offline':
144 # in LANG doc index: don't rewrite .html suffixes as not all .LANG.html pages exist
145 # the doc index should be translated and contain the right links
146 if prefix == 'Documentation/out-www/index':
147 page_flavors[file_name] = s
149 page_flavors[file_name] = s
151 page_flavors[langdefs.lang_file_name (prefix, e, '.html')] = re.sub (
152 '''href=[\'"]([^/][.]*[^.:\'"]*)(.html)(#[^"\']*|)[\'"]''',
153 'href="\\1.' + e + '\\2\\3"', s)
155 page_flavors[file_name] = re.sub (
156 '''href=[\'"]([^/][.]*[^.:\'"]*)(.html)(#[^"\']*|)[\'"]''',
157 'href="\\1.' + lang_ext + '\\2\\3"', s)
160 def add_menu (page_flavors, prefix, available):
162 for lang in available:
163 lang_file = lang.file_name (os.path.basename (prefix), '.html')
164 if language_menu != '':
165 language_menu += ', '
166 language_menu += '<a href="%s">%s</a>' % (lang_file, lang.name)
170 languages = LANGUAGES_TEMPLATE % vars ()
172 # put language menu before '</body>' and '</html>' tags
173 for k in page_flavors.keys():
174 if re.search ('(?i)</body', page_flavors[k]):
175 page_flavors[k] = re.sub ('(?i)</body>', languages + '</BODY>', page_flavors[k], 1)
176 elif re.search ('(?i)</html', page_flavors[k]):
177 page_flavors[k] = re.sub ('(?i)</html>', languages + '</HTML>', page_flavors[k], 1)
179 page_flavors[k] += languages
183 def add_html_footer (package_name = '',
184 package_version = '',
186 name_filter = lambda s: s):
187 """Add header, footer to a number of HTML files
190 package_name=NAME set package_name to NAME
191 package_version=VERSION set package version to VERSION
192 targets=offline|online set page processing depending on the target
193 offline is for reading HTML pages locally
194 online is for hosting the HTML pages on a website with content
196 name_filter a HTML file name filter
198 localtime = time.strftime ('%c %Z', time.localtime (time.time ()))
200 if re.search ("http://", mail_address):
201 mail_address_url = mail_address
203 mail_address_url= 'mailto:' + mail_address
205 versiontup = package_version.split ('.')
206 branch_str = 'stable-branch'
207 if int ( versiontup[1]) % 2:
208 branch_str = 'development-branch'
210 for prefix, ext_list in pages_dict.items ():
211 for lang_ext in ext_list:
212 file_name = langdefs.lang_file_name (prefix, lang_ext, '.html')
213 in_f = open (file_name)
217 s = re.sub ('%', '%%', s)
219 # seems to be no more needed
220 # s = info_external_ref_remove (s)
223 if re.search (footer_tag, s) == None:
225 available, missing = find_translations (prefix, lang_ext)
226 page_flavors = process_links (s, prefix, lang_ext, file_name, missing, target)
227 # Add menu after stripping: must not have autoselection for language menu.
228 page_flavors = add_menu (page_flavors, prefix, available)
229 # urg, this stuff is oudated and seems useless, let's disable it
231 # for e in [l.webext for l in langdefs.LANGUAGES]:
232 # if not e in pages_dict[prefix]:
233 # page_flavors[langdefs.lang_file_name (prefix, e, '.html')] = s
236 subst.update (locals())
237 for k in page_flavors.keys():
238 page_flavors[k] = page_flavors[k] % subst
240 out_f = open (name_filter (k), 'w')
241 out_f.write (page_flavors[k])
243 # if the page is translated, a .en.html symlink is necessary for content negotiation
244 if target == 'online' and ext_list != ['']:
245 os.symlink (os.path.basename (prefix) + '.html', name_filter (prefix + '.en.html'))