13 # This is to try to make the docball not too big with almost duplicate files
15 non_copied_pages = ['Documentation/user/out-www/lilypond-big-page',
16 'Documentation/user/out-www/lilypond-internals-big-page',
17 'Documentation/user/out-www/music-glossary-big-page',
19 'Documentation/topdocs/out-www/NEWS',
20 'Documentation/topdocs/out-www/INSTALL',
21 'Documentation/bibliography/out-www/index',
22 'Documentation/bibliography/out-www/engraving',
23 'Documentation/bibliography/out-www/colorado',
24 'Documentation/bibliography/out-www/computer-notation'
25 'Documentation/out-www/THANKS',
26 'Documentation/out-www/DEDICATION',
27 'Documentation/topdocs/out-www/AUTHORS']
33 <div style="background-color: #e8ffe8; padding: 2; border: #c0ffc0 1px solid;">
36 ''' + _ ('This page is for %(package_name)s-%(package_version)s (%(branch_str)s).') + '''<br>
38 <address><font size="-1">
39 ''' + _ ('Report errors to <a href="%(mail_address_url)s">%(mail_address)s</a>.') + '''</font></address>
44 mail_address = 'http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs'
46 header_tag = '<!-- header_tag -->'
47 footer_tag = '<!-- footer_tag -->'
52 language_available = _ ("Other languages: %s.")
53 browser_language = _ ('About <A HREF="%s">automatic language selection</A>.')
54 browser_language_url = "/web/about/browser-language"
56 LANGUAGES_TEMPLATE = '''
58 %(language_available)s
65 html_re = re.compile ('(.*?)(?:[.]([^/.]*))?[.]html$')
68 def build_pages_dict (filelist):
69 """Build dictionnary of available translations of each page"""
75 if len (g) <= 1 or g[1] == None:
79 if not g[0] in pages_dict.keys():
80 pages_dict[g[0]] = [e]
82 pages_dict[g[0]].append (e)
85 """Add header (<BODY> and doctype)"""
86 if re.search (header_tag, s) == None:
87 body = '<BODY BGCOLOR=WHITE TEXT=BLACK>'
88 s = re.sub ('(?i)<body>', body, s)
89 if re.search ('(?i)<BODY', s):
90 s = re.sub ('(?i)<body[^>]*>', body + header, s, 1)
91 elif re.search ('(?i)<html', s):
92 s = re.sub ('(?i)<html>', '<HTML>' + header, s, 1)
96 s = header_tag + '\n' + s
98 if re.search ('(?i)<!DOCTYPE', s) == None:
99 doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n'
103 def info_external_ref_remove (s):
104 """Remove info's annoying's indication of referencing external document"""
105 return re.sub (' \((lilypond|lilypond-internals|music-glossary)\)</a>', '</a>', s)
109 # maybe find first node?
110 fallback_web_title = '-- --'
111 m = re.match ('.*?<title>(.*?)</title>', s, re.DOTALL)
113 fallback_web_title = m.group (1)
114 s = re.sub ('@WEB-TITLE@', fallback_web_title, s)
117 info_nav_bar = re.compile (r'<div class="node">\s*<p>\s*<a name=".+?"></a>(.+?)<hr>\s*</div>', re.M | re.S)
118 info_footnote_hr = re.compile (r'<hr>\s*(</div>)?\s*</body>', re.M | re.I)
123 also add navigation bar to bottom of Info HTML pages"""
124 m = info_nav_bar.search (s)
126 # avoid duplicate <hr> in case there are footnotes at the end of the Info HTML page
127 if info_footnote_hr.search (s):
128 custom_footer = '<div class="node">\n<p>' + m.group (1) + '</div>\n' + footer
130 custom_footer = '<br><hr>\n<div class="node">\n<p>' + m.group (1) + '</div>\n' + footer
132 custom_footer = footer
133 if re.search ('(?i)</body', s):
134 s = re.sub ('(?i)</body>', footer_tag + custom_footer + '\n' + '</BODY>', s, 1)
135 elif re.search ('(?i)</html', s):
136 s = re.sub ('(?i)</html>', footer_tag + custom_footer + '\n' + '</HTML>', s, 1)
138 s += footer_tag + custom_footer + '\n'
141 def find_translations (prefix, lang_ext):
142 """find available translations of a page"""
145 for l in langdefs.LANGUAGES:
148 if e in pages_dict[prefix]:
150 elif lang_ext == '' and l.enabled and not prefix in non_copied_pages:
151 # English version of missing translated pages will be written
153 return available, missing
155 def process_links (s, prefix, lang_ext, file_name, missing, target):
157 if target == 'online':
158 # Strip .html, .png suffix for auto language selection (content
159 # negotiation). The menu must keep the full extension, so do
160 # this before adding the menu.
161 page_flavors[file_name] = [lang_ext, re.sub (
162 '''(href|src)=[\'"]([^/][.]*[^.:\'"]*)(.html|.png)(#[^"\']*|)[\'"]''',
164 elif target == 'offline':
165 # in LANG doc index: don't rewrite .html suffixes as not all .LANG.html pages exist
166 # the doc index should be translated and contain the right links
167 if prefix == 'Documentation/out-www/index':
168 page_flavors[file_name] = [lang_ext, s]
170 page_flavors[file_name] = [lang_ext, s]
172 page_flavors[langdefs.lang_file_name (prefix, e, '.html')] = [e, re.sub (
173 '''href=[\'"]([^/][.]*[^.:\'"]*)(.html)(#[^"\']*|)[\'"]''',
174 'href="\\1.' + e + '\\2\\3"', s)]
176 page_flavors[file_name] = [lang_ext, re.sub (
177 '''href=[\'"]([^/][.]*[^.:\'"]*)(.html)(#[^"\']*|)[\'"]''',
178 'href="\\1.' + lang_ext + '\\2\\3"', s)]
181 def add_menu (page_flavors, prefix, available, target, translation):
182 for k in page_flavors.keys():
185 if page_flavors[k][0] != '':
186 t = translation[page_flavors[k][0]]
189 for lang in available:
190 lang_file = lang.file_name (os.path.basename (prefix), '.html')
191 if language_menu != '':
192 language_menu += ', '
193 language_menu += '<a href="%s">%s</a>' % (lang_file, t (lang.name))
194 if target == 'offline':
195 browser_language = ''
196 elif target == 'online':
197 browser_language = t (browser_language) % browser_language_url
199 language_available = t (language_available) % language_menu
200 languages = LANGUAGES_TEMPLATE % vars ()
201 # put language menu before '</body>' and '</html>' tags
202 if re.search ('(?i)</body', page_flavors[k][1]):
203 page_flavors[k][1] = re.sub ('(?i)</body>', languages + '</BODY>', page_flavors[k][1], 1)
204 elif re.search ('(?i)</html', page_flavors[k][1]):
205 page_flavors[k][1] = re.sub ('(?i)</html>', languages + '</HTML>', page_flavors[k][1], 1)
207 page_flavors[k][1] += languages
211 def add_html_footer (translation,
213 package_version = '',
215 name_filter = lambda s: s):
216 """Add header, footer to a number of HTML files
219 translation gettext translations dictionary, with language codes as keys
220 package_name=NAME set package_name to NAME
221 package_version=VERSION set package version to VERSION
222 targets=offline|online set page processing depending on the target
223 offline is for reading HTML pages locally
224 online is for hosting the HTML pages on a website with content
226 name_filter a HTML file name filter
228 localtime = time.strftime ('%c %Z', time.localtime (time.time ()))
230 if re.search ("http://", mail_address):
231 mail_address_url = mail_address
233 mail_address_url= 'mailto:' + mail_address
235 versiontup = package_version.split ('.')
236 branch_str = _('stable-branch')
237 if int ( versiontup[1]) % 2:
238 branch_str = _('development-branch')
240 for prefix, ext_list in pages_dict.items ():
241 for lang_ext in ext_list:
242 file_name = langdefs.lang_file_name (prefix, lang_ext, '.html')
243 in_f = open (file_name)
247 s = re.sub ('%', '%%', s)
249 # seems to be no more needed
250 # s = info_external_ref_remove (s)
253 if re.search (footer_tag, s) == None:
255 available, missing = find_translations (prefix, lang_ext)
256 page_flavors = process_links (s, prefix, lang_ext, file_name, missing, target)
257 # Add menu after stripping: must not have autoselection for language menu.
258 page_flavors = add_menu (page_flavors, prefix, available, translation)
259 # urg, this stuff is outdated and seems useless, let's disable it
261 # for e in [l.webext for l in langdefs.LANGUAGES]:
262 # if not e in pages_dict[prefix]:
263 # page_flavors[langdefs.lang_file_name (prefix, e, '.html')] = s
265 subst.update (locals())
266 for k in page_flavors.keys():
267 for name in subst.keys():
268 subst[name] = translation[page_flavors[k][0]] (subst[name])
269 page_flavors[k][1] = page_flavors[k][1] % subst
270 out_f = open (name_filter (k), 'w')
271 out_f.write (page_flavors[k][1])
273 # if the page is translated, a .en.html symlink is necessary for content negotiation
274 if target == 'online' and ext_list != ['']:
275 os.symlink (os.path.basename (prefix) + '.html', name_filter (prefix + '.en.html'))