import os import re import datetime from .html import HTMLBuilder class HTMLSinglePageBuilder(HTMLBuilder): """Single page HTML manual builder for Traintastic""" def __init__(self, args): if args.output_dir is None: args.output_dir = os.path.join(args.base_dir, 'build', 'html-single-page') super().__init__(args) self._md2id = {} self._version = args.version def _file_to_html(self, page): html = HTMLBuilder._file_to_html(self, page) basedir = os.path.dirname(os.path.join(self._language_dir, page['markdown'])) # find id of

m = re.search(r']+id="([^"]+)"[^>]*>', html) if m is not None: self._md2id[page['markdown']] = '#' + m.group(1) # correct href to md files: html = re.sub(r'href="([^"]+\.md)"', lambda m: 'href="' + os.path.relpath(os.path.abspath(os.path.join(basedir, m.group(1))), self._language_dir) + '"', html) # correct image src and copy image html = re.sub(r'(]+src=")([^"]+)(")', lambda m: m.group(1) + self._output_copy_image(os.path.join(basedir, m.group(2))) + m.group(3), html) return html def subpages(self, page, depth=1): html = '' if 'pages' in page: for subpage in page['pages']: subhtml = self._file_to_html(subpage) subhtml = re.sub(r']*)>(.*?)', lambda m: '' + m.group(3) + '', subhtml) html += subhtml + self.subpages(subpage, depth + 1) return html def build(self): self._output_copy_files([ 'css/pure-min.css', 'css/traintasticmanual.css', 'js/traintasticmanual.js']) title = 'Traintastic manual' toc = {'preface': [], 'chapter': [], 'appendix': []} manual_html = '' for page in self._json: page_html = self._file_to_html(page) + self.subpages(page) m = re.findall(r']*)>(.*?)', page_html) if m is not None: toc_item = {'children': []} for g in m: id = re.search(r'id="([a-z0-9-]+)"', g[1]) if id is None: raise Exception('header `' + g[2] + '` has no id') id = id.group(1) if int(g[0]) == 1: toc_item['title'] = g[2] toc_item['id'] = id elif int(g[0]) == 2: toc_item['children'].append({'title': g[2], 'id': id}) toc[page['type']].append(toc_item) manual_html += page_html html = ''' ''' + title + '''
Index
    ''' for item in toc['chapter']: html += '
  • ' + item['title'] + '' if len(item['children']) > 0: html += '' html += '
  • ' + os.linesep html += '''

''' + title + '''

''' if self._version is not None: html += '''

v''' + self._version + '''

''' html += '''

Build ''' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + '''

''' + manual_html + '''
''' # replace .md links by #id: html = re.sub(r'href="([^"]+\.md)"', lambda m: 'href="' + self._md2id[m.group(1)] + '"', html) # replace .md#id links by #id: html = re.sub(r'href="[^"]+\.md(#[^"]+)"', lambda m: 'href="' + m.group(1) + '"', html) self._output_text_file(self._language + '.html', html)