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 ]*(.*)$')
65 verbatim_ly_re
= re
.compile (r
'@lilypond\[.*?verbatim')
67 def process_texi (texifilename
, i_blurb
, n_blurb
, write_skeleton
, topfile
, output_file
=None, scan_ly
=False):
69 f
= open (texifilename
, 'r')
72 printedfilename
= texifilename
.replace ('../','')
75 # process ly var names and comments
76 if output_file
and scan_ly
:
77 lines
= texifile
.splitlines ()
79 in_verb_ly_block
= False
80 for i
in range (len (lines
)):
81 if verbatim_ly_re
.match (lines
[i
]):
82 in_verb_ly_block
= True
83 elif lines
[i
].startswith ('@end lilypond'):
84 in_verb_ly_block
= False
85 elif in_verb_ly_block
:
86 for (var
, comment
) in ly_string_re
.findall (lines
[i
]):
88 output_file
.write ('# ' + printedfilename
+ ':' + \
89 str (i
+ 1) + ' (variable)\n_(r"' + var
+ '")\n')
91 output_file
.write ('# ' + printedfilename
+ ':' + \
92 str (i
+ 1) + ' (comment)\n_(r"' + \
93 comment
.replace ('"', '\\"') + '")\n')
95 # process Texinfo node names and section titles
97 g
= open (os
.path
.basename (texifilename
), 'w')
99 subst
.update (locals ())
100 g
.write (i_blurb
% subst
)
101 tutu
= texinfo_with_menus_re
.findall (texifile
)
105 g
.write ('* ' + item
[1] + '::\n')
106 elif output_file
and item
[4] == 'rglos':
107 output_file
.write ('_(r"' + item
[5] + '") # @rglos in ' + printedfilename
+ '\n')
108 elif item
[2] == 'menu':
110 elif item
[2] == 'end menu':
111 g
.write ('@end menu\n\n')
113 g
.write ('@' + item
[2] + ' ' + item
[3] + '\n')
117 elif item
[2] == 'include':
118 includes
.append (item
[3])
121 output_file
.write ('# @' + item
[2] + ' in ' + \
122 printedfilename
+ '\n_(r"' + item
[3].strip () + '")\n')
123 if item
[2] == 'node':
129 toto
= texinfo_re
.findall (texifile
)
131 if item
[0] == 'include':
132 includes
.append(item
[1])
133 elif item
[2] == 'rglos':
134 output_file
.write ('# @rglos in ' + printedfilename
+ '\n_(r"' + item
[3] + '")\n')
136 output_file
.write ('# @' + item
[0] + ' in ' + printedfilename
+ '\n_(r"' + item
[1].strip () + '")\n')
139 dir = os
.path
.dirname (texifilename
)
140 for item
in includes
:
141 process_texi (os
.path
.join (dir, item
.strip ()), i_blurb
, n_blurb
, write_skeleton
, topfile
, output_file
, scan_ly
)
142 except IOError, (errno
, strerror
):
143 sys
.stderr
.write ("I/O error(%s): %s: %s\n" % (errno
, texifilename
, strerror
))
146 if intro_blurb
!= '':
147 intro_blurb
+= '\n\n'
149 node_blurb
= '\n' + node_blurb
+ '\n\n'
151 node_list_filename
= 'node_list'
152 node_list
= open (node_list_filename
, 'w')
153 node_list
.write ('# -*- coding: utf-8 -*-\n')
154 for texi_file
in texi_files
:
155 # Urgly: scan ly comments and variable names only in English doco
156 is_english_doc
= 'Documentation/user' in texi_file
157 process_texi (texi_file
, intro_blurb
, node_blurb
, make_skeleton
,
158 os
.path
.basename (texi_file
), node_list
,
159 scan_ly
=is_english_doc
)
160 for word
in ('Up:', 'Next:', 'Previous:', 'Appendix ', 'Footnotes', 'Table of Contents'):
161 node_list
.write ('_(r"' + word
+ '")\n')
163 os
.system ('xgettext -c -L Python --no-location -o ' + output_file
+ ' ' + node_list_filename
)
165 for texi_file
in texi_files
:
166 process_texi (texi_file
, intro_blurb
, node_blurb
, make_skeleton
,
167 os
.path
.basename (texi_file
))