X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=build.py;h=d7753fe60a31441341bce9136b075d33032dff40;hb=01263a844bbe2fb45c5df31d1c6053d323c69446;hp=e9f4f279fee121e237aa9058a148b083179540e6;hpb=e89c48ffdf6a996ed65aabbeeb2c1f17e68fb8f1;p=ardour-manual diff --git a/build.py b/build.py index e9f4f27..d7753fe 100755 --- a/build.py +++ b/build.py @@ -4,7 +4,7 @@ # finished manual/website. # # by James Hammons -# (C) 2017 Underground Software +# (C) 2020 Underground Software # # Contributors: Ed Ward # @@ -21,13 +21,14 @@ import datetime global_bootstrap_path = '/bootstrap-3.3.7' global_page_title = 'The Ardour Manual' global_site_dir = './website/' +global_manual_url = 'http://manual.ardour.org' global_githuburl = 'https://github.com/Ardour/manual/edit/master/include/' global_screen_template = 'page-template.html' global_onepage_template = 'onepage-template.html' global_pdf_template = 'pdf-template.html' global_master_doc = 'master-doc.txt' +global_pdflink = '' from datetime import datetime -global_today_iso = datetime.today().strftime('%Y-%m-%dT%H%M%S') global_today = datetime.today().strftime('%Y-%m-%d') # This matches all *non* letter/number, ' ', '.', '-', and '_' chars @@ -79,12 +80,12 @@ def ParseHeader(fileObj): # Turn a "part" name into an int # def PartToLevel(s): - level = -1 - lvl = {'part': 0, 'chapter': 1, 'subchapter': 2} + lvl = {'part': 0, 'chapter': 1, 'subchapter': 2, 'section': 3, 'subsection': 4 } + if s in lvl: return lvl[s] - else: - return -1 + + return -1 # @@ -107,7 +108,7 @@ def num2roman(num): # def GetFileStructure(): fs = [] - fnames = [None]*6 + fnames = [None] * 6 content = '' grab = False mf = open(global_master_doc) @@ -207,15 +208,22 @@ def GetParent(fs, pos): # -# Change the hierarchy of titles : h1->hn, h2->hn+1, etc... n being delta-1 +# Change the hierarchy of titles :

->,

->, so that the +# highest hyerarchy level is maxlevel # -def reheader(txt, delta): - for i in range(6, 0, -1): - txt = txt.replace(' 0: #level 0 is the part number which is not shown txtlevel = str(levelNums[j]) + '.' + txtlevel - j = j-1 + j = j - 1 + if len(txtlevel) > 0: txtlevel = txtlevel[:-1] + ' - ' @@ -376,8 +389,9 @@ def BuildOnePageSidebar(fs): anchor = fs[i]['filename'] while lvl < level: - content = content + '
    \n' + content = content + '
      \n' lvl = lvl + 1 + while lvl > level: content = content + '
    \n' lvl = lvl - 1 @@ -397,11 +411,12 @@ def CreateLinkSidebar(fs, pos, childList): # Build the list recursively from the top level nodes content = BuildList(FindTopLevelNodes(fs), fs, pos, childList) # Shove the TOC link and one file link at the top... - active = ' class=active' if pos<0 else '' - content = content.replace('
      ','
        Table of Contents',1) + active = ' class=active' if pos < 0 else '' + content = content.replace('
          ', '
            Table of Contents\n', 1) return content + # Preliminaries # We have command line arguments now, so deal with them @@ -409,19 +424,20 @@ parser = argparse.ArgumentParser(description='A build script for the Ardour Manu parser.add_argument('-v', '--verbose', action='store_true', help='Display the high-level structure of the manual') parser.add_argument('-q', '--quiet', action='store_true', help='Suppress all output (overrides -v)') parser.add_argument('-d', '--devmode', action='store_true', help='Add content to pages to help developers debug them') -parser.add_argument('-n', '--nopdf', action='store_true', help='Do not automatically generate PDF from content') +parser.add_argument('-p', '--pdf', action='store_true', help='Automatically generate PDF from content') args = parser.parse_args() verbose = args.verbose -quiet = args.quiet +noisy = not args.quiet devmode = args.devmode -nopdf = args.nopdf +pdf = args.pdf -if quiet: +# --quiet overrides --verbose, so tell it to shut up if user did both +if not noisy: verbose = False level = 0 fileCount = 0 -levelNums = [0]*3 +levelNums = [0] * 5 lastFile = '' page = '' onepage = '' @@ -429,35 +445,37 @@ pdfpage = '' toc = '' pageNumber = 0 - - -if not quiet and devmode: +if noisy and devmode: print('Devmode active: scribbling extra junk to the manual...') if os.access(global_site_dir, os.F_OK): - if not quiet: + if noisy: print('Removing stale HTML data...') shutil.rmtree(global_site_dir) shutil.copytree('./source', global_site_dir) - # Read the template, and fix the stuff that's fixed for all pages temp = open(global_screen_template) template = temp.read() temp.close() template = template.replace('{{page.bootstrap_path}}', global_bootstrap_path) template = template.replace('{{page.page_title}}', global_page_title) +if pdf: + template = template.replace('{{page.page_pdflink}}', global_pdflink) +else: + template = template.replace('{{page.page_pdflink}}', '') + -# Same as above, but for the One-page version +# Same as above, but for the "One-Page" version temp = open(global_onepage_template) onepage = temp.read() temp.close() onepage = onepage.replace('{{page.bootstrap_path}}', global_bootstrap_path) onepage = onepage.replace('{{page.page_title}}', global_page_title) -if not nopdf: +if pdf: # Same as above, but for the PDF version temp = open(global_pdf_template) pdfpage = temp.read() @@ -474,11 +492,11 @@ nodeChildren = FindChildren(fileStruct) links = FindInternalLinks(fileStruct) oplinks = FindInternalAnchors(fileStruct) -if not quiet: +if noisy: print('Found ' + str(len(links)) + ' internal link target', end='') print('.') if len(links) == 1 else print('s.') -if not quiet: +if noisy: master = open(global_master_doc) firstLine = master.readline().rstrip('\r\n') master.close() @@ -500,9 +518,10 @@ for header in fileStruct: lastLevel = level level = header['level'] - # Handle Part/Chapter/subchapter numbering + # Handle Part/Chapter/subchapter/section/subsection numbering if level < 2: levelNums[2] = 0 + levelNums[level] = levelNums[level] + 1; # This is totally unnecessary, but nice; besides which, you can capture @@ -525,15 +544,10 @@ for header in fileStruct: toc = toc + '\t

            Ch. ' + str(levelNums[level]) + ':  ' + header['title'] + '

            \n' elif level == 2: toc = toc + '\t\t

            ' + header['title'] + '

            \n' - - # Handle one-page and PDF titles... - opl = '' - if 'link' in header: - opl = ' id="' + header['link'] + '"' - else: - opl = ' id="' + header['filename'] + '"' - oph = '' + header['title'] + '\n'; - + elif level == 3: + toc = toc + '

            ' + header['title'] + '

            \n' + elif level == 4: + toc = toc + '

            ' + header['title'] + '

            \n' # Make the 'this thing contains...' stuff if HaveChildren(fileStruct, pageNumber): @@ -614,12 +628,19 @@ for header in fileStruct: # Fix up any internal links opcontent = FixInternalLinks(oplinks, content, header['title']) - opcontent = reheader(opcontent, 2) + opcontent = remapheader(opcontent, level+2) + + # Create "one page" header + oph = '' + header['title'] + '\n'; # Set up the actual page from the template onepage = onepage.replace('{{ content }}', oph + '\n' + opcontent + '\n{{ content }}') - if not nopdf: - pdfpage = pdfpage.replace('{{ content }}', oph + '\n' + opcontent + '\n{{ content }}') + + if pdf: + if not 'pdf-exclude' in header: + pdfpage = pdfpage.replace('{{ content }}', oph + '\n' + opcontent + '\n{{ content }}') + else: + pdfpage = pdfpage.replace('{{ content }}', oph + '\n' + 'Please refer to the online manual.\n{{ content }}') # ----- Normal version ----- @@ -678,15 +699,17 @@ onepage = onepage.replace('{{ content }}', '') # cleans up the last spaceholder onepageFile.write(onepage) onepageFile.close() -if not nopdf: - if not quiet: +if pdf: + if noisy: print('Generating the PDF...') + import logging + logger = logging.getLogger('weasyprint') + logger.addHandler(logging.StreamHandler()) # Create the PDF version of the documentation pdfpage = pdfpage.replace('{% tree %}', opsidebar) # create the TOC pdfpage = pdfpage.replace('{{ content }}', '') # cleans up the last spaceholder pdfpage = pdfpage.replace('{{ today }}', global_today) - pdfpage = pdfpage.replace('{{ today_iso }}', global_today_iso) pdfpage = pdfpage.replace('src="/images/', 'src="images/') # makes images links relative pdfpage = pdfpage.replace('url(\'/images/', 'url(\'images/') # CSS images links relative # Write it to disk (optional, can be removed) @@ -697,10 +720,11 @@ if not nopdf: # Generating the actual PDF with weasyprint (https://weasyprint.org/) from weasyprint import HTML from weasyprint.fonts import FontConfiguration + html_font_config = FontConfiguration() doc = HTML(string = pdfpage, base_url = global_site_dir) doc.write_pdf(global_site_dir + 'manual.pdf', font_config = html_font_config) -if not quiet: +if noisy: print('Processed ' + str(fileCount) + ' files.')