Fix typo in UI messages.
[blender.git] / doc / manpage / blender.1.py
1 #!/usr/bin/env python3
2
3 # ##### BEGIN GPL LICENSE BLOCK #####
4 #
5 #  This program is free software; you can redistribute it and/or
6 #  modify it under the terms of the GNU General Public License
7 #  as published by the Free Software Foundation; either version 2
8 #  of the License, or (at your option) any later version.
9 #
10 #  This program is distributed in the hope that it will be useful,
11 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #  GNU General Public License for more details.
14 #
15 #  You should have received a copy of the GNU General Public License
16 #  along with this program; if not, write to the Free Software Foundation,
17 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #
19 # ##### END GPL LICENSE BLOCK #####
20
21 '''
22 This script generates the blender.1 man page, embedding the help text
23 from the Blender executable itself. Invoke it as follows:
24
25     blender.1.py <path-to-blender> <output-filename>
26
27 where <path-to-blender> is the path to the Blender executable,
28 and <output-filename> is where to write the generated man page.
29 '''
30
31 # <pep8 compliant>
32
33 import os
34 import subprocess
35 import sys
36
37 import time
38
39
40 def man_format(data):
41     data = data.replace("-", "\\-")
42     data = data.replace("\t", "  ")
43     return data
44
45
46 if len(sys.argv) != 3:
47     import getopt
48     raise getopt.GetoptError("Usage: %s <path-to-blender> <output-filename>" % sys.argv[0])
49
50 blender_bin = sys.argv[1]
51 outfilename = sys.argv[2]
52
53 cmd = [blender_bin, "--help"]
54 print("  executing:", " ".join(cmd))
55 blender_help = subprocess.run(
56     cmd, env={"ASAN_OPTIONS": "exitcode=0"}, check=True, stdout=subprocess.PIPE).stdout.decode(encoding="utf-8")
57 blender_version = subprocess.run(
58     [blender_bin, "--version"], env={"ASAN_OPTIONS": "exitcode=0"}, check=True, stdout=subprocess.PIPE).stdout.decode(encoding="utf-8").strip()
59 blender_version, blender_date = (blender_version.split("build") + [None, None])[0:2]
60 blender_version = blender_version.rstrip().partition(" ")[2]  # remove 'Blender' prefix.
61 if blender_date is None:
62     # Happens when built without WITH_BUILD_INFO e.g.
63     date_string = time.strftime("%B %d, %Y", time.gmtime(int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))))
64 else:
65     blender_date = blender_date.strip().partition(" ")[2]  # remove 'date:' prefix
66     date_string = time.strftime("%B %d, %Y", time.strptime(blender_date, "%Y-%m-%d"))
67
68 outfile = open(outfilename, "w")
69 fw = outfile.write
70
71 fw('.TH "BLENDER" "1" "%s" "Blender %s"\n' % (date_string, blender_version.replace(".", "\\&.")))
72
73 fw('''
74 .SH NAME
75 blender \- a full-featured 3D application''')
76
77 fw('''
78 .SH SYNOPSIS
79 .B blender [args ...] [file] [args ...]''')
80
81 fw('''
82 .br
83 .SH DESCRIPTION
84 .PP
85 .B blender
86 is a full-featured 3D application. It supports the entirety of the 3D pipeline - modeling, rigging, animation, simulation, rendering, compositing, motion tracking, and video editing.
87
88 Use Blender to create 3D images and animations, films and commercials, content for games, architectural and industrial visualizatons, and scientific visualizations.
89
90 https://www.blender.org''')
91
92 fw('''
93 .SH OPTIONS''')
94
95 fw("\n\n")
96
97 lines = [line.rstrip() for line in blender_help.split("\n")]
98
99 while lines:
100     l = lines.pop(0)
101     if l.startswith("Environment Variables:"):
102         fw('.SH "ENVIRONMENT VARIABLES"\n')
103     elif l.endswith(":"):  # one line
104         fw('.SS "%s"\n\n' % l)
105     elif l.startswith("-") or l.startswith("/"):  # can be multi line
106
107         fw('.TP\n')
108         fw('.B %s\n' % man_format(l))
109
110         while lines:
111             # line with no
112             if lines[0].strip() and len(lines[0].lstrip()) == len(lines[0]):  # no white space
113                 break
114
115             if not l:  # second blank line
116                 fw('.IP\n')
117             else:
118                 fw('.br\n')
119
120             l = lines.pop(0)
121             l = l[1:]  # remove first whitespace (tab)
122
123             fw('%s\n' % man_format(l))
124
125     else:
126         if not l.strip():
127             fw('.br\n')
128         else:
129             fw('%s\n' % man_format(l))
130
131 # footer
132
133 fw('''
134 .br
135 .SH SEE ALSO
136 .B luxrender(1)
137
138 .br
139 .SH AUTHORS
140 This manpage was written for a Debian GNU/Linux system by Daniel Mester
141 <mester@uni-bremen.de> and updated by Cyril Brulebois
142 <cyril.brulebois@enst-bretagne.fr> and Dan Eicher <dan@trollwerks.org>.
143 ''')
144
145 outfile.close()
146 print("written:", outfilename)