4 # WARNING: this script can't find files included in a different directory
13 def read_pipe (command
):
15 pipe
= os
.popen (command
)
18 print "pipe failed: %(command)s" % locals ()
22 optlist
, texi_files
= getopt
.getopt(sys
.argv
[1:],'no:d:b:i:l:',['skeleton', 'gettext'])
23 process_includes
= not ('-n', '') in optlist
# -n don't process @include's in texinfo files
25 make_gettext
= ('--gettext', '') in optlist
# --gettext generate a node list from a Texinfo source
26 make_skeleton
= ('--skeleton', '') in optlist
# --skeleton extract the node tree from a Texinfo source
28 output_file
= 'doc.pot'
30 # @untranslated should be defined as a macro in Texinfo source
31 node_blurb
= '''@untranslated
34 head_committish
= read_pipe ('git-rev-parse HEAD')
35 intro_blurb
= '''@c -*- coding: utf-8; mode: texinfo%(doclang)s -*-
36 @c This file is part of %(topfile)s
38 Translation of GIT committish: %(head_committish)s
39 When revising a translation, copy the HEAD committish of the
40 version that you are working on. See TRANSLATION for details.
45 @c -- SKELETON FILE --
49 if x
[0] == '-o': # -o NAME set PO output file name to NAME
51 elif x
[0] == '-d': # -d DIR set working directory to DIR
53 elif x
[0] == '-b': # -b BLURB set blurb written at each node to BLURB
55 elif x
[0] == '-i': # -i BLURB set blurb written at beginning of each file to BLURB
57 elif x
[0] == '-l': # -l ISOLANG set documentlanguage to ISOLANG
58 doclang
= '; documentlanguage: ' + x
[1]
60 texinfo_with_menus_re
= re
.compile (r
"^(\*) +([^:\n]+)::.*?$|^@(include|menu|end menu|node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) *(.*?)$|@(rglos){(.+?)}", re
.M
)
62 texinfo_re
= re
.compile (r
"^@(include|node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) *(.+?)$|@(rglos){(.+?)}", re
.M
)
64 ly_string_re
= re
.compile (r
'^([a-zA-Z]+)[\t ]*=|%+[\t ]*(.*)$|\\(?:new|context)\s+(?:[a-zA-Z]*?(?:Staff(?:Group)?|Voice|FiguredBass|FretBoards|Names|Devnull))\s+=\s+"?([a-zA-Z]+)"?\s+')
65 lsr_verbatim_ly_re
= re
.compile (r
'% begin verbatim$')
66 texinfo_verbatim_ly_re
= re
.compile (r
'^@lilypond\[.*?verbatim')
68 def process_texi (texifilename
, i_blurb
, n_blurb
, write_skeleton
, topfile
, output_file
=None, scan_ly
=False):
70 f
= open (texifilename
, 'r')
73 printedfilename
= texifilename
.replace ('../','')
76 # process ly var names and comments
77 if output_file
and (scan_ly
or texifilename
.endswith ('.ly')):
78 lines
= texifile
.splitlines ()
80 in_verb_ly_block
= False
81 if texifilename
.endswith ('.ly'):
82 verbatim_ly_re
= lsr_verbatim_ly_re
84 verbatim_ly_re
= texinfo_verbatim_ly_re
85 for i
in range (len (lines
)):
86 if verbatim_ly_re
.search (lines
[i
]):
87 in_verb_ly_block
= True
88 elif lines
[i
].startswith ('@end lilypond'):
89 in_verb_ly_block
= False
90 elif in_verb_ly_block
:
91 for (var
, comment
, context_id
) in ly_string_re
.findall (lines
[i
]):
93 output_file
.write ('# ' + printedfilename
+ ':' + \
94 str (i
+ 1) + ' (variable)\n_(r"' + var
+ '")\n')
96 output_file
.write ('# ' + printedfilename
+ ':' + \
97 str (i
+ 1) + ' (comment)\n_(r"' + \
98 comment
.replace ('"', '\\"') + '")\n')
100 output_file
.write ('# ' + printedfilename
+ ':' + \
101 str (i
+ 1) + ' (context id)\n_(r"' + \
104 # process Texinfo node names and section titles
106 g
= open (os
.path
.basename (texifilename
), 'w')
108 subst
.update (locals ())
109 g
.write (i_blurb
% subst
)
110 tutu
= texinfo_with_menus_re
.findall (texifile
)
114 g
.write ('* ' + item
[1] + '::\n')
115 elif output_file
and item
[4] == 'rglos':
116 output_file
.write ('_(r"' + item
[5] + '") # @rglos in ' + printedfilename
+ '\n')
117 elif item
[2] == 'menu':
119 elif item
[2] == 'end menu':
120 g
.write ('@end menu\n\n')
122 g
.write ('@' + item
[2] + ' ' + item
[3] + '\n')
126 elif item
[2] == 'include':
127 includes
.append (item
[3])
130 output_file
.write ('# @' + item
[2] + ' in ' + \
131 printedfilename
+ '\n_(r"' + item
[3].strip () + '")\n')
132 if item
[2] == 'node':
138 toto
= texinfo_re
.findall (texifile
)
140 if item
[0] == 'include':
141 includes
.append(item
[1])
142 elif item
[2] == 'rglos':
143 output_file
.write ('# @rglos in ' + printedfilename
+ '\n_(r"' + item
[3] + '")\n')
145 output_file
.write ('# @' + item
[0] + ' in ' + printedfilename
+ '\n_(r"' + item
[1].strip () + '")\n')
148 dir = os
.path
.dirname (texifilename
)
149 for item
in includes
:
150 process_texi (os
.path
.join (dir, item
.strip ()), i_blurb
, n_blurb
, write_skeleton
, topfile
, output_file
, scan_ly
)
151 except IOError, (errno
, strerror
):
152 sys
.stderr
.write ("I/O error(%s): %s: %s\n" % (errno
, texifilename
, strerror
))
155 if intro_blurb
!= '':
156 intro_blurb
+= '\n\n'
158 node_blurb
= '\n' + node_blurb
+ '\n\n'
160 node_list_filename
= 'node_list'
161 node_list
= open (node_list_filename
, 'w')
162 node_list
.write ('# -*- coding: utf-8 -*-\n')
163 for texi_file
in texi_files
:
164 # Urgly: scan ly comments and variable names only in English doco
165 is_english_doc
= 'Documentation/user' in texi_file
166 process_texi (texi_file
, intro_blurb
, node_blurb
, make_skeleton
,
167 os
.path
.basename (texi_file
), node_list
,
168 scan_ly
=is_english_doc
)
169 for word
in ('Up:', 'Next:', 'Previous:', 'Appendix ', 'Footnotes', 'Table of Contents'):
170 node_list
.write ('_(r"' + word
+ '")\n')
172 os
.system ('xgettext -c -L Python --no-location -o ' + output_file
+ ' ' + node_list_filename
)
174 for texi_file
in texi_files
:
175 process_texi (texi_file
, intro_blurb
, node_blurb
, make_skeleton
,
176 os
.path
.basename (texi_file
))