aboutsummaryrefslogtreecommitdiff
path: root/make_guides.py
blob: 524d4b50e67779c1048051394a939d9d7ee2c4f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/env python3

import argparse, os, shutil
import docutils.core

def basename(fname):
    '''Returns the name of the guide from either its name or its directory'''
    if os.path.isdir(os.path.join('guides',fname)):
        return fname
    elif os.path.isdir(fname):
        return os.path.basename(os.path.abspath(fname))
    else:
        msg = '%s is not a valid directory' % fname
        raise argparse.ArgumentTypeError(msg)

def build_latex(guide):
    '''Builds the LaTeX source for the guide'''
    src_dir = os.path.join('guides',guide)
    tools_dir = 'tools'
    build_dir = os.path.join('build',guide)
    tex_name = guide+'.tex'
    # Check if we need to (re)build
    rebuild = False
    try:
        tex_time = os.stat(os.path.join(build_dir,tex_name)).st_mtime
        # the source has changed?
        for dirpath, dirnames, filenames in os.walk(src_dir):
            for src_file in filenames:
                src_time = os.stat(os.path.join(dirpath,src_file)).st_mtime
                if src_time > tex_time:
                    rebuild = True
                    break
        # a template has changed?
        for dirpath, dirnames, filenames in os.walk(tools_dir):
            for src_file in filenames:
                src_time = os.stat(os.path.join(dirpath,src_file)).st_mtime
                if src_time > tex_time:
                    rebuild = True
                    break
    except (IOError,OSError):
        rebuild = True
    if not rebuild:
        return None
    # Build the LaTeX source
    s_files = []
    for dirpath, dirnames, filenames in os.walk(src_dir):
        s_files += [os.path.join(dirpath,fn) 
                for fn in filenames 
                if fn.endswith(('.txt','.rst'))]
    s_files.sort()
    source = ""
    for fname in s_files:
        fp = open(fname,'rt')
        try:
            source += fp.read()
        except IOError:
            pass
        finally:
            fp.close()
    if not os.path.isdir(build_dir):
        os.mkdir(build_dir)
    fp = open(os.path.join(build_dir,tex_name),'wb')
    fp.write(docutils.core.publish_string(source,
        writer_name='latex',
        settings_overrides={'language_code': 'it',
            'documentoptions': 'a6paper,twoside',
            'stylesheet': 'lmodern',
            'template': os.path.join(tools_dir,'booklet-A6.template.tex'),
            'hyperlink-color': '0'}))
    fp.close()

def build_pdf(guide):
    '''Builds the A6 PDF for the guide'''
    build_dir = os.path.join('build',guide)
    dist_dir = os.path.join('dist','PDF')
    tex_name = guide+'.tex'
    pdf_name = guide+'.pdf'
    # check for prerequisites
    build_latex(guide)
    # Check if we need to (re)build
    tex_time = os.stat(os.path.join(build_dir,tex_name)).st_mtime
    try:
        pdf_time = os.stat(os.path.join(dist_dir,pdf_name)).st_mtime
        if pdf_time > tex_time:
            return None
    except OSError:
        pass
    if not os.path.isdir(dist_dir):
        os.mkdir(dist_dir)
    os.chdir(build_dir)
    try:
        if os.system('pdflatex '+tex_name) == 0:
            if os.system('pdflatex '+tex_name) == 0:
                os.system('pdflatex '+tex_name)
    except OSError:
        return False
    finally:
        os.chdir('../../')
    try:
        shutil.move(os.path.join(build_dir,pdf_name),
                os.path.join(dist_dir,pdf_name))
    except IOError:
        return False

def build_nup_pdf(guide):
    '''Builds the nup-ed PDF for the guide'''
    dist_dir = os.path.join('dist','PDF')
    pdf_name = guide+'.pdf'
    nup_name = guide+'-A6suA4.pdf'
    # check for prerequisites
    build_pdf(guide)
    # Check if we need to (re)build
    pdf_time = os.stat(os.path.join(dist_dir,pdf_name)).st_mtime
    try:
        nup_time = os.stat(os.path.join(dist_dir,nup_name)).st_mtime
        if nup_time > pdf_time:
            return None
    except OSError:
        pass
    try:
        os.system('pdfnup --paper a4paper --nup 2x2 --keepinfo -o '+
                os.path.join(dist_dir,nup_name)+ ' '+
                os.path.join(dist_dir,pdf_name)+
                ' "16,1,14,3,2,15,4,13,12,5,10,7,11,6,8,9" ')
    except OSError:
        return False

def main():
    parser = argparse.ArgumentParser(description='Build a distribution format of a 1800 words article',
            epilog='Prerequisites of required formats are build automatically, but you may want to build the LaTeX source first, edit it by hand and then build the rest.')
    parser.add_argument('guide', nargs='+', type=basename,
            help='Source directory of the article')
    parser.add_argument('-l','--latex',action='store_true',
            help='Generate LaTeX source')
    parser.add_argument('-p','--pdf',action='store_true',
            help='Generate PDF')
    parser.add_argument('-n','--nup-pdf',action='store_true',
            help='Generate nup-ed A4 PDF')
    args = parser.parse_args()

    for guide in args.guide:
        if args.latex:
            build_latex(guide)
        if args.pdf:
            build_pdf(guide)
        if args.nup_pdf:
            build_nup_pdf(guide)


if __name__ == '__main__': main()