4 # WARNING: this script can't find files included in a different directory
11 def read_pipe (command):
13 pipe = os.popen (command)
16 print "pipe failed: %(command)s" % locals ()
20 optlist, texi_files = getopt.getopt(sys.argv[1:],'no:d:b:i:l:',['skeleton', 'gettext'])
21 process_includes = not ('-n', '') in optlist # -n don't process @include's in texinfo files
23 make_gettext = ('--gettext', '') in optlist # --gettext generate a node list from a Texinfo source
24 make_skeleton = ('--skeleton', '') in optlist # --skeleton extract the node tree from a Texinfo source
26 output_file = 'doc.pot'
29 head_committish = read_pipe ('git-rev-parse HEAD')
30 intro_blurb = '''@c -*- coding: utf-8; mode: texinfo%(doclang)s -*-
31 @c This file is part of %(topfile)s
33 Translation of GIT committish: %(head_committish)s
35 When revising a translation, copy the HEAD committish of the
36 version that you are working on. See TRANSLATION for details.
42 When you actually translate this file, please remove these lines as
43 well as all `UNTRANSLATED NODE: IGNORE ME' lines.
47 if x[0] == '-o': # -o NAME set PO output file name to NAME
49 elif x[0] == '-d': # -d DIR set working directory to DIR
51 elif x[0] == '-b': # -b BLURB set blurb written at each node to BLURB
53 elif x[0] == '-i': # -i BLURB set blurb written at beginning of each file to BLURB
55 elif x[0] == '-l': # -l ISOLANG set documentlanguage to ISOLANG
56 doclang = '; documentlanguage: ' + x[1]
59 def process_texi (texifilename, i_blurb, n_blurb, write_skeleton, topfile, output_file=None):
61 f = open (texifilename, 'r')
66 g = open (os.path.basename (texifilename), 'w')
68 subst.update (locals ())
69 g.write (i_blurb % subst)
70 tutu = re.findall (r"""^(\*) +([^:
72 ]*?$|^@(include|menu|end menu|node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) *([^
74 ]*?$|@(rglos){(.+?)}""", texifile, re.M)
78 g.write ('* ' + item[1] + '::\n')
79 elif output_file and item[4] == 'rglos':
80 output_file.write ('_(r"' + item[5] + '") # @rglos in ' + texifilename + '\n')
82 g.write ('@' + item[2] + ' ' + item[3] + '\n')
86 if not item[2] in ('include', 'menu', 'end menu'):
88 output_file.write ('_(r"' + item[3].strip () + '") # @' + item[2] + \
89 ' in ' + texifilename + '\n')
92 elif item[2] == 'include':
93 includes.append(item[3])
97 toto = re.findall (r"""^@(include|node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) *([^
99 ]*?$|@(rglos){(.+?)}""", texifile, re.M)
101 if item[0] == 'include':
102 includes.append(item[1])
103 elif item[2] == 'rglos':
104 output_file.write ('# @rglos in ' + texifilename + '\n_(r"' + item[3] + '")\n')
106 output_file.write ('# @' + item[0] + ' in ' + texifilename + '\n_(r"' + item[1].strip () + '")\n')
108 dir = os.path.dirname (texifilename)
109 for item in includes:
110 process_texi (os.path.join (dir, item.strip ()), i_blurb, n_blurb, write_skeleton, topfile, output_file)
111 except IOError, (errno, strerror):
112 print "I/O error(%s): %s: %s" % (errno, texifilename, strerror)
115 if intro_blurb != '':
116 intro_blurb += '\n\n'
118 node_blurb = '\n' + node_blurb + '\n\n'
120 node_list_filename = 'node_list'
121 node_list = open (node_list_filename, 'w')
122 for texi_file in texi_files:
123 process_texi (texi_file, intro_blurb, node_blurb, make_skeleton, os.path.basename (texi_file), node_list)
124 for word in ('Up:', 'Next:', 'Previous:', 'Appendix ', 'Footnotes', 'Table of Contents'):
125 node_list.write ('_(r"' + word + '")\n')
127 os.system ('xgettext -c -L Python --no-location -o ' + output_file + ' ' + node_list_filename)
129 for texi_file in texi_files:
130 process_texi (texi_file, intro_blurb, node_blurb, make_skeleton, os.path.basename (texi_file))