Tidied up generate-html.py, added more strings to be translated

This commit is contained in:
Phil Howard 2015-11-14 00:55:20 +00:00
parent 31c23e23b7
commit 5c7963b2d3
1 changed files with 313 additions and 308 deletions

View File

@ -11,6 +11,7 @@ import urlmapper
reload(sys) reload(sys)
sys.setdefaultencoding('utf8') sys.setdefaultencoding('utf8')
def cssify(value): def cssify(value):
value = slugify(value); value = slugify(value);
if value[0] == '3' or value[0] == '5': if value[0] == '3' or value[0] == '5':
@ -18,6 +19,7 @@ def cssify(value):
return value return value
def slugify(value): def slugify(value):
""" """
Normalizes string, converts to lowercase, removes non-alpha characters, Normalizes string, converts to lowercase, removes non-alpha characters,
@ -28,6 +30,7 @@ def slugify(value):
value = re.sub('[^\w\s-]', '', value).strip().lower() value = re.sub('[^\w\s-]', '', value).strip().lower()
return re.sub('[-\s]+', '_', value) return re.sub('[-\s]+', '_', value)
def load_overlay(overlay): def load_overlay(overlay):
try: try:
data = markjaml.load('src/{}/overlay/{}.md'.format(lang, overlay)) data = markjaml.load('src/{}/overlay/{}.md'.format(lang, overlay))
@ -37,20 +40,22 @@ def load_overlay(overlay):
except IOError: except IOError:
return None return None
details = [] details = []
if 'type' not in loaded:
loaded['type'] = 'addon'
if 'manufacturer' in loaded: if 'manufacturer' in loaded:
details.append(strings['made_by'].format(manufacturer=loaded['manufacturer'])) details.append('* ' + strings['made_by'].format(manufacturer=loaded['manufacturer']))
if 'pincount' in loaded: if 'pincount' in loaded:
pincount = int(loaded['pincount']) pincount = int(loaded['pincount'])
if pincount == 40: if pincount == 40:
details.append(strings['type_hat']) details.append('* ' + strings['type_hat'])
elif pincount == 26: elif pincount == 26:
details.append(strings['type_classic']) details.append('* ' + strings['type_classic'])
else: else:
details.append(strings['pin_header'].format(pincount)) details.append('* ' + strings['pin_header'].format(pincount))
if 'pin' in loaded: if 'pin' in loaded:
uses_5v = False uses_5v = False
@ -73,28 +78,28 @@ def load_overlay(overlay):
uses += 1 uses += 1
if uses > 0: if uses > 0:
details.append('* Uses {} GPIO pins'.format(uses)) details.append(strings['uses_n_gpio_pins'].format(uses))
if '3' in loaded['pin'] and '5' in loaded['pin']: if '3' in loaded['pin'] and '5' in loaded['pin']:
pin_3 = loaded['pin']['3'] pin_3 = loaded['pin']['3']
pin_5 = loaded['pin']['5'] pin_5 = loaded['pin']['5']
if 'mode' in pin_3 and 'mode' in pin_5: if 'mode' in pin_3 and 'mode' in pin_5:
if pin_3['mode'] == 'i2c' and pin_5['mode'] == 'i2c': if pin_3['mode'] == 'i2c' and pin_5['mode'] == 'i2c':
details.append(strings['uses_i2c']) details.append('* ' + strings['uses_i2c'])
if 'url' in loaded: if 'url' in loaded:
details.append('* [More Information]({url})'.format(url=loaded['url'])) details.append('* [{text}]({url})'.format(text=strings['more_information'], url=loaded['url']))
if 'github' in loaded: if 'github' in loaded:
details.append('* [GitHub Repository]({url})'.format(url=loaded['github'])) details.append('* [{text}]({url})'.format(text=strings['github_repository'], url=loaded['github']))
if 'buy' in loaded: if 'buy' in loaded:
details.append('* [Buy Now]({url})'.format(url=loaded['buy'])) details.append('* [{text}]({url})'.format(text=strings['buy_now'], url=loaded['buy']))
if loaded['type'] != 'info':
loaded['long_description'] = '{}\n{}'.format(loaded['long_description'], markdown.markdown('\n'.join(details))) loaded['long_description'] = '{}\n{}'.format(loaded['long_description'], markdown.markdown('\n'.join(details)))
if not 'page_url' in loaded: if 'page_url' not in loaded:
loaded['page_url'] = slugify(loaded['name']) loaded['page_url'] = slugify(loaded['name'])
loaded['rendered_html'] = render_overlay_page(loaded) loaded['rendered_html'] = render_overlay_page(loaded)
@ -104,6 +109,7 @@ def load_overlay(overlay):
select_overlays.append((loaded['page_url'], loaded['name'])) select_overlays.append((loaded['page_url'], loaded['name']))
return loaded return loaded
def load_md(filename): def load_md(filename):
filename = 'src/{}/{}'.format(lang, filename) filename = 'src/{}/{}'.format(lang, filename)
try: try:
@ -114,6 +120,7 @@ def load_md(filename):
print('Unable to load markdown from {}'.format(filename)) print('Unable to load markdown from {}'.format(filename))
return '' return ''
def render_pin_text(pin_num, pin_url, pin_name, pin_functions, pin_subtext): def render_pin_text(pin_num, pin_url, pin_name, pin_functions, pin_subtext):
return '<article class="{pin_url}"><h1>{pin_name}</h1>{pin_functions}{pin_subtext}{pin_text}</article>'.format( return '<article class="{pin_url}"><h1>{pin_name}</h1>{pin_functions}{pin_subtext}{pin_text}</article>'.format(
pin_url=pin_url, pin_url=pin_url,
@ -122,8 +129,9 @@ def render_pin_text(pin_num, pin_url, pin_name, pin_functions, pin_subtext):
pin_subtext=pin_subtext, pin_subtext=pin_subtext,
pin_text=load_md('pin/pin-{}.md'.format(pin_num))) pin_text=load_md('pin/pin-{}.md'.format(pin_num)))
def render_overlay_page(overlay): def render_overlay_page(overlay):
if overlay == None: if overlay is None:
return '' return ''
return '<article class="page_{}">{}</article>'.format(slugify(overlay['name']), overlay['long_description']) return '<article class="page_{}">{}</article>'.format(slugify(overlay['name']), overlay['long_description'])
@ -132,19 +140,19 @@ def render_alternate(handle, name):
handle = slugify(handle.lower()) handle = slugify(handle.lower())
return '<span class="alternate legend_{}">{}</span>'.format(handle, name) return '<span class="alternate legend_{}">{}</span>'.format(handle, name)
def render_pin_page(pin_num): def render_pin_page(pin_num):
pin = pinout.pins[str(pin_num)] pin = pinout.pins[str(pin_num)]
pin_url = pin['name'] pin_url = pin['name']
if pin_url == 'Ground': if pin_url == 'Ground':
return (None, None, None) return None, None, None
pin_text_name = pin['name'] pin_text_name = pin['name']
pin_subtext = [] pin_subtext = []
pin_subtext.append(strings['physical_pin_n'].format(pin_num))
pin_subtext.append('Physical pin {}'.format(pin_num))
if 'scheme' in pin: if 'scheme' in pin:
if 'bcm' in pin['scheme']: if 'bcm' in pin['scheme']:
@ -161,7 +169,7 @@ def render_pin_page(pin_num):
pin_subtext.append('Wiring Pi pin {}'.format(wiringpi)) pin_subtext.append('Wiring Pi pin {}'.format(wiringpi))
if 'bcmAlt' in pin['scheme']: if 'bcmAlt' in pin['scheme']:
bcmAlt = pin['scheme']['bcmAlt'] bcmAlt = pin['scheme']['bcmAlt']
pin_subtext.append('BCM pin {} on Rev 1 ( very early ) Pi'.format(bcmAlt)) pin_subtext.append(strings['bcm_pin_rev1_pi'].format(bcmAlt))
if 'description' in pin: if 'description' in pin:
pin_text_name = '{} ({})'.format(pin_text_name, pin['description']) pin_text_name = '{} ({})'.format(pin_text_name, pin['description'])
@ -192,9 +200,6 @@ def render_pin_page(pin_num):
</tbody> </tbody>
</table>'''.format(headings='</th><th>'.join(fn_headings), functions='</td><td>'.join(fn_functions)) </table>'''.format(headings='</th><th>'.join(fn_headings), functions='</td><td>'.join(fn_functions))
pin_url = slugify('pin{}_{}'.format(pin_num, pin_url)) pin_url = slugify('pin{}_{}'.format(pin_num, pin_url))
pin_text = render_pin_text( pin_text = render_pin_text(
@ -205,13 +210,12 @@ def render_pin_page(pin_num):
'<ul><li>{}</li></ul>'.format('</li><li>'.join(pin_subtext)) '<ul><li>{}</li></ul>'.format('</li><li>'.join(pin_subtext))
) )
# if pin_text != None: # if pin_text != None:
return (pin_url, pin_text, pin_text_name) #pages[pin_url] = pin_text return pin_url, pin_text, pin_text_name # pages[pin_url] = pin_text
def render_pin(pin_num, selected_url, overlay=None): def render_pin(pin_num, selected_url, overlay=None):
pin = pinout.pins[str(pin_num)] pin = pinout.pins[str(pin_num)]
pin_type = list([x.strip() for x in pin['type'].lower().split('/')]) pin_type = list([x.strip() for x in pin['type'].lower().split('/')])
pin_url = pin['name'] pin_url = pin['name']
pin_name = pin['name'] pin_name = pin['name']
@ -222,7 +226,7 @@ def render_pin(pin_num, selected_url, overlay=None):
if 'bcm' in pin['scheme']: if 'bcm' in pin['scheme']:
bcm_pin = 'bcm' + str(pin['scheme']['bcm']) bcm_pin = 'bcm' + str(pin['scheme']['bcm'])
if overlay != None and ( pin_num in overlay['pin'] or str(pin_num) in overlay['pin'] or bcm_pin in overlay['pin']): if overlay is not None and (pin_num in overlay['pin'] or str(pin_num) in overlay['pin'] or bcm_pin in overlay['pin']):
if pin_num in overlay['pin']: if pin_num in overlay['pin']:
overlay_pin = overlay['pin'][pin_num] overlay_pin = overlay['pin'][pin_num]
@ -231,7 +235,7 @@ def render_pin(pin_num, selected_url, overlay=None):
else: else:
overlay_pin = overlay['pin'][bcm_pin] overlay_pin = overlay['pin'][bcm_pin]
if overlay_pin == None: if overlay_pin is None:
overlay_pin = {} overlay_pin = {}
pin_used = True pin_used = True
@ -268,7 +272,6 @@ def render_pin(pin_num, selected_url, overlay=None):
if pin_used: if pin_used:
selected += ' overlay-pin' selected += ' overlay-pin'
pin_url = pin_url + url_suffix pin_url = pin_url + url_suffix
return '<li class="pin{pin_num} {pin_type}{pin_selected}"><a href="{pin_url}" title="{pin_title}"><span class="default"><span class="phys">{pin_num}</span> {pin_name}</span><span class="pin"></span></a></li>\n'.format( return '<li class="pin{pin_num} {pin_type}{pin_selected}"><a href="{pin_url}" title="{pin_title}"><span class="default"><span class="phys">{pin_num}</span> {pin_name}</span><span class="pin"></span></a></li>\n'.format(
@ -281,6 +284,7 @@ def render_pin(pin_num, selected_url, overlay=None):
langcode=lang langcode=lang
) )
def render_nav(url, overlay=None): def render_nav(url, overlay=None):
html_odd = '' html_odd = ''
html_even = '' html_even = ''
@ -293,6 +297,7 @@ def render_nav(url, overlay=None):
<ul class="top"> <ul class="top">
{}</ul>'''.format(html_odd, html_even) {}</ul>'''.format(html_odd, html_even)
def get_hreflang_urls(src): def get_hreflang_urls(src):
hreflang = [] hreflang = []
for lang in sorted(alternate_urls): for lang in sorted(alternate_urls):
@ -313,7 +318,8 @@ def get_lang_urls(src):
if url_lang == lang: if url_lang == lang:
img_css = ' class="grayscale"' img_css = ' class="grayscale"'
url = alternate_urls[url_lang][src] url = alternate_urls[url_lang][src]
urls.append('<li><a href="{url}" rel="alternate" hreflang="{lang}"><img{css} src="{resource_url}{lang}.png" /></a>'.format( urls.append(
'<li><a href="{url}" rel="alternate" hreflang="{lang}"><img{css} src="{resource_url}{lang}.png" /></a>'.format(
lang=url_lang, lang=url_lang,
url=url, url=url,
resource_url=resource_url, resource_url=resource_url,
@ -322,20 +328,24 @@ def get_lang_urls(src):
return urls return urls
''' '''
Main Program Flow Main Program Flow
''' '''
lang = "en" lang = "en"
default_strings = { default_strings = {
'made_by': '* Made by {manufacturer}', 'made_by': 'Made by {manufacturer}',
'type_hat': '* HAT form-factor', 'type_hat': 'HAT form-factor',
'type_classic': '* Classic form-factor', 'type_classic': 'Classic form-factor',
'pin_header': '* {} pin header', 'pin_header': '{} pin header',
'uses_i2c': '* Uses I2C', 'uses_i2c': 'Uses I2C',
'wiring_pi_pin': 'Wiring Pi pin {}' 'wiring_pi_pin': 'Wiring Pi pin {}',
'uses_n_gpio_pins': '* Uses {} GPIO pins',
'bcm_pin_rev1_pi': 'BCM pin {} on Rev 1 ( very early ) Pi',
'physical_pin_n': 'Physical pin {}',
'more_information': 'More Information',
'github_repository': 'GitHub Repository',
'buy_now': 'Buy Now'
} }
if len(sys.argv) > 1: if len(sys.argv) > 1:
@ -359,7 +369,6 @@ for key, val in default_strings.items():
if key not in strings: if key not in strings:
strings[key] = val strings[key] = val
base_url = pinout.get_setting('base_url', '/pinout/') # '/pinout-tr/pinout/' base_url = pinout.get_setting('base_url', '/pinout/') # '/pinout-tr/pinout/'
resource_url = pinout.get_setting('resource_url', '/resources/') # '/pinout-tr/resources/' resource_url = pinout.get_setting('resource_url', '/resources/') # '/pinout-tr/resources/'
url_suffix = pinout.get_setting('url_suffix', '') # '.html' url_suffix = pinout.get_setting('url_suffix', '') # '.html'
@ -372,7 +381,6 @@ select_overlays = []
overlays_html = '' overlays_html = ''
if not os.path.isdir('output'): if not os.path.isdir('output'):
try: try:
os.mkdir('output') os.mkdir('output')
@ -389,13 +397,11 @@ if not os.path.isdir('output/{}/pinout'.format(lang)):
except OSError: except OSError:
exit('Failed to create output/{}/pinout dir'.format(lang)) exit('Failed to create output/{}/pinout dir'.format(lang))
overlays = map(load_overlay, overlays) overlays = map(load_overlay, overlays)
for url, name in select_overlays: for url, name in select_overlays:
overlays_html += '<li><a href="{}{}">{}</a></li>'.format(base_url, url, name) overlays_html += '<li><a href="{}{}">{}</a></li>'.format(base_url, url, name)
''' '''
Manually add the index page as 'pinout', this is due to how the Manually add the index page as 'pinout', this is due to how the
website is currently structured with /pinout as the index website is currently structured with /pinout as the index
@ -411,7 +417,7 @@ print('Rendering pin pages...')
for pin in range(1, len(pinout.pins) + 1): for pin in range(1, len(pinout.pins) + 1):
(pin_url, pin_html, pin_title) = render_pin_page(pin) (pin_url, pin_html, pin_title) = render_pin_page(pin)
if pin_url == None: if pin_url is None:
continue continue
hreflang = get_hreflang_urls('pin{}'.format(pin)) hreflang = get_hreflang_urls('pin{}'.format(pin))
@ -479,4 +485,3 @@ for url in pages:
with open(os.path.join('output', lang, '{}.html'.format(url)), 'w') as f: with open(os.path.join('output', lang, '{}.html'.format(url)), 'w') as f:
f.write(html) f.write(html)