]> git.donarmstrong.com Git - lilypond.git/blobdiff - buildscripts/html-gettext.py
Merge branch 'lilypond/translation' of ssh://jomand@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / buildscripts / html-gettext.py
index 1aebf6ca34eba02f92f837a2df039afb96bfa594..ccfe6937c0316ec354e2116239475338951a719d 100644 (file)
@@ -1,7 +1,7 @@
 #!@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
@@ -11,87 +11,116 @@ import sys
 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>'), r'@command{\1}'),
-            'code': (re.compile (r'<code>(.*?)</code>'), r'@code{\1}')
-            }
-texi2html = {'command': (re.compile (r'@command{(.*?)}'), r'<samp><span class="command">\1</span></samp>'),
-            'code': (re.compile (r'@code{(.*?)}'), r'<code>\1</code>')
-            }
+              (' --- ', ' &mdash; '),
+              ("'", '&rsquo;'))
+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):
-       if not s:
-               return ''
-       for c in html_codes:
-               s = s.replace (c[1], c[0])
-       for u in html2texi.values():
-               s = u[0].sub (u[1], s)
-       s = my_gettext (s)
-       for u in texi2html.values():
-               s = u[0].sub (u[1], 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.]+ | (?:&lt;){1,2} |&nbsp;[^>:]+?:&nbsp;|&nbsp;|)\
+(?P<name>(?:<samp><span class="command">|</?code>|</span>|[^>])+?)(?P<end_code>(?(code)</code>|))\
+(?P<trailing> (?:&gt;){1,2} |&nbsp;|)</a>:?')
 
 def a_href_gettext (m):
-       s = ''
-       if m.group(0)[-1] == ':':
-               s = double_punct_char_separator + ':'
-       t = ''
-       if m.lastindex == 7:
-               t = m.group(7)
-       return '<a ' + (m.group(1) or '') + m.group(2) + (m.group(3) or '') + _(m.group(4)) + m.group(5) + _(m.group(6)) + t + '</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):
-       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) + '>'
-
-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)
-       # ugh
-       page = re.sub (r'<a ((?:rel="\w+")? ?(?:accesskey="[^"]+?")? ?(?:name=".*?")? ?)(href="[^"]+?">)(<code>)?(Appendix )?([A-Z\d.]+ |)(.+?)(?(3)</code>)</a>:?', a_href_gettext, page)
-       page = re.sub (r'<h(\d)( class="\w+"|)>(Appendix |)([A-Z\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)
-       page = langdefs.LANGDICT[lang].html_filter (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 ()