import os import re import codecs import cmarkgfm # pip3 install cmarkgfm from .builder import Builder class HTMLBuilder(Builder): """Traintastic HTML manual builder base class""" def _file_to_html(self, page): with codecs.open(os.path.join(self._language_dir, page['markdown']), 'r', 'utf-8') as md: html = cmarkgfm.github_flavored_markdown_to_html(md.read(), options=cmarkgfm.Options.CMARK_OPT_UNSAFE) # parse id html = re.sub(r']*)>(.*) {#([a-z0-9-]+)}', r'\3', html) # replace -> by html = re.sub(r'->', '\u2794', html) # set target="_blank" for external links: html = re.sub(r']+href="http(s|)://)', r')(.+)()', self._highlight_lua, html, flags=re.DOTALL) # change img title attribute to figcaption html = re.sub(r'(]+)title="([^">]*)"([^>]*>)', lambda m: '
' + m.group(1) + m.group(3) + '
' + m.group(2) + '
', html) # float image right html = re.sub(r'(]+)alt=">', r'\1class="img-float-right" alt="', html) # handle badges html = html.replace('$badge:lua$', 'Lua') html = re.sub(r'\$badge:since:v([0-9]+\.[0-9]+(|\.[0-9]+))\$', r'≥ \1\2', html) # handle notes html = html.replace('

Note: ', '

Note ') return html def _highlight_replace(self, code, css_class): return '' + re.sub(r']*>(.+?)', r'\1', code) + '' def _highlight_lua(self, m): code = m.group(2) code = re.sub(r'\b(math|table|string|class|enum|set|log|world)\b', r'\1', code) # globals code = re.sub(r'\b([A-Z_][A-Z0-9_]*)\b', r'\1', code) # CONSTANTS code = re.sub(r'\b(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b', r'\1', code) # keywords code = re.sub(r'(\a.*?[^\\]\a|\a\a)', lambda m: self._highlight_replace(m.group(1), 'text'), code) code = re.sub(r"('.*?[^\\]'|'')", lambda m: self._highlight_replace(m.group(1), 'text'), code) code = re.sub(r'(--.*)$', lambda m: self._highlight_replace(m.group(1), 'comment'), code, flags=re.MULTILINE) # single line comments return m.group(1) + code + m.group(3)