#!@PYTHON@
# html-gettext.py
-# USAGE: html-gettext.py [-o OUTDIR] BUILDSCRIPT-DIR LOCALEDIR LANG FILES
+# USAGE: html-gettext.py [-o OUTDIR] LANG FILES
#
# -o OUTDIR specifies that output files should be written in OUTDIR
# rather than be overwritten
import re
import os
import getopt
-import gettext
+
+import langdefs
optlist, args = getopt.getopt(sys.argv[1:],'o:')
-buildscript_dir, localedir, lang = args[0:3]
+lang = args[0]
+files = args [1:]
outdir = '.'
for x in optlist:
- if x[0] == '-o':
- outdir = x[1]
-
-sys.path.append (buildscript_dir)
-import langdefs
+ if x[0] == '-o':
+ outdir = x[1]
double_punct_char_separator = langdefs.LANGDICT[lang].double_punct_char_sep
-print localedir
-print lang
-t = gettext.translation('lilypond-doc', localedir, [lang])
-my_gettext = t.gettext
+my_gettext = langdefs.translation[lang]
html_codes = ((' -- ', ' – '),
- (' --- ', ' — '))
-html2texi_command = re.compile (r'<samp><span class="command">(.*?)</span></samp>')
-texi2html_command = re.compile (r'@command{(.*?)}')
+ (' --- ', ' — '),
+ ("'", '’'))
+texi_html_conversion = {
+ 'command': {
+ 'html2texi':
+ (re.compile (r'(?:<samp><span class="command">|<code>)(.*?)(?:</span></samp>|</code>)'),
+ r'@command{\1}'),
+ 'texi2html':
+ (re.compile (r'@command{(.*?)}'),
+ r'<code>\1</code>'),
+ },
+ 'code': {
+ 'html2texi':
+ (re.compile (r'<code>(.*?)</code>'),
+ r'@code{\1}'),
+ 'texi2html':
+ (re.compile (r'@code{(.*?)}'),
+ r'<code>\1</code>'),
+ },
+ }
+
+whitespaces = re.compile (r'\s+')
+
def _ (s):
- for c in html_codes:
- s = s.replace (c[1], c[0])
- s = html2texi_command.sub (r'@command{\1}', s)
- s = my_gettext (s)
- s = texi2html_command.sub (r'<samp><span class="command">\1</span></samp>', s)
- for c in html_codes:
- s = s.replace (c[0], c[1])
- return s
+ if not s:
+ return ''
+ str = whitespaces.sub (' ', s)
+ for c in html_codes:
+ str = str.replace (c[1], c[0])
+ for command in texi_html_conversion:
+ d = texi_html_conversion[command]
+ str = d['html2texi'][0].sub (d['html2texi'][1], str)
+ str = my_gettext (str)
+ str = d['texi2html'][0].sub (d['texi2html'][1], str)
+ for c in html_codes:
+ str = str.replace (c[0], c[1])
+ return str
+
+link_re = re.compile (r'<link rel="(up|prev|next)" (.*?) title="([^"]*?)">')
def link_gettext (m):
- return '<link rel="' + m.group(1) + '" ' + m.group(2) + ' title="' + _(m.group(3)) + '">'
+ return '<link rel="' + m.group (1) + '" ' + m.group (2) \
+ + ' title="' + _ (m.group (3)) + '">'
-def title_gettext (m):
- return '<title>' + _(m.group(1)) + ' - ' + m.group(2) + '</title>'
+makeinfo_title_re = re.compile (r'<title>([^<]*?) - ([^<]*?)</title>')
+
+def makeinfo_title_gettext (m):
+ return '<title>' + _ (m.group (1)) + ' - ' + m.group (2) + '</title>'
+
+texi2html_title_re = re.compile (r'<title>(.+): ([A-Z\d.]+ |)(.+?)</title>')
+
+def texi2html_title_gettext (m):
+ return '<title>' + _ (m.group (1)) + double_punct_char_separator + ': ' \
+ + m.group (2) + _ (m.group (3)) + '</title>'
+
+a_href_re = re.compile ('(?s)<a (?P<attributes>[^>]*?href="[\\w.#-_]+"[^>]*?>)(?P<code><code>)?\
+(?P<appendix>Appendix )?(?P<leading>[A-Z0-9.]+ | (?:<){1,2} | [^>:]+?: | |)\
+(?P<name>(?:<samp><span class="command">|</?code>|</span>|[^>])+?)(?P<end_code>(?(code)</code>|))\
+(?P<trailing> (?:>){1,2} | |)</a>:?')
def a_href_gettext (m):
- if m.group(6) == ':':
- s = double_punct_char_separator + ':'
- elif m.group(6) == None:
- s = ''
- return '<a ' + (m.group(1) or '') + m.group(2) + m.group(3) + _(m.group(4)) + m.group(5) + '</a>' + s
+ s = ''
+ if m.group(0)[-1] == ':':
+ s = double_punct_char_separator + ':'
+ t = ''
+ if m.group ('appendix'):
+ t = _ (m.group ('appendix'))
+ return '<a ' + m.group ('attributes') + (m.group ('code') or '') + \
+ t + m.group ('leading') + _ (m.group ('name')) + \
+ m.group ('end_code') + m.group ('trailing') + '</a>' + s
+
+h_re = re.compile (r'<h(\d)( class="\w+"|)>\s*(Appendix |)([A-Z\d.]+ |)(.+?)\s*</h\1>')
def h_gettext (m):
- return '<h' + m.group(1) + m.group(2) + '>' + \
- m.group(3) + _(m.group(4)) + '</h' + m.group(1) + '>'
-
-def rglos_gettext (m):
- return '<a href="../music-glossary/' + m.group(1) + '">' + _(m.group(2)) + '</a>'
-
-for filename in args[3:]:
- f = open (filename, 'r')
- page = f.read ()
- f.close()
- page = re.sub (r'<link rel="(up|prev|next)" (.*?) title="([^"]*?)">', link_gettext, page)
- page = re.sub (r'<title>([^<]*?) - ([^<]*?)</title>', title_gettext, page)
- page = re.sub (r'<a ((?:rel="\w+")? ?(?:accesskey="[^"]+?")? ?(?:name=".*?")? ?)(href="[^"]+?">)((?:<code>|)(?:[\d.]+ |))([^<]+)(</code>|)</a>(:)?', a_href_gettext, page)
- page = re.sub (r'<h(\d)( class="\w+"|)>([\d.]+ |)?([^<]+)</h\1>', h_gettext, page)
- page = re.sub (r'<a href="../music-glossary/(.+?)">(.+?)</a>', rglos_gettext, page)
- for w in ('Next:', 'Previous:', 'Up:'):
- page = re.sub (w, _(w), page)
- f = open (os.path.join (outdir, filename), 'w')
- f.write (page)
- f.close ()
+ if m.group (3):
+ s = _ (m.group (3))
+ else:
+ s= ''
+ return '<h' + m.group (1) + m.group (2) + '>' + s +\
+ m.group (4) + _ (m.group (5)) + '</h' + m.group (1) + '>'
+
+for filename in files:
+ f = open (filename, 'r')
+ page = f.read ()
+ f.close ()
+ page = link_re.sub (link_gettext, page)
+ page = makeinfo_title_re.sub (makeinfo_title_gettext, page)
+ page = texi2html_title_re.sub (texi2html_title_gettext, page)
+ page = a_href_re.sub (a_href_gettext, page)
+ page = h_re.sub (h_gettext, page)
+ for w in ('Next:', 'Previous:', 'Up:'):
+ page = page.replace (w, _ (w))
+ page = langdefs.LANGDICT[lang].html_filter (page)
+ f = open (os.path.join (outdir, filename), 'w')
+ f.write (page)
+ f.close ()