2015-02-24 17:59:29 +08:00
|
|
|
#!/usr/bin/env python
|
|
|
|
import json
|
2015-02-25 06:07:11 +08:00
|
|
|
import markdown
|
2015-02-24 17:59:29 +08:00
|
|
|
import unicodedata
|
|
|
|
import re
|
2015-02-26 01:29:06 +08:00
|
|
|
import os
|
2015-02-24 17:59:29 +08:00
|
|
|
|
2015-02-25 01:28:00 +08:00
|
|
|
overlays = ['pibrella','explorerhat']
|
|
|
|
|
|
|
|
template = open('template/layout.html').read()
|
2015-02-24 17:59:29 +08:00
|
|
|
|
2015-02-26 01:29:06 +08:00
|
|
|
pages = {}
|
|
|
|
|
|
|
|
html_odd = ''
|
|
|
|
html_even = ''
|
|
|
|
|
|
|
|
|
2015-02-24 17:59:29 +08:00
|
|
|
def slugify(value):
|
|
|
|
"""
|
|
|
|
Normalizes string, converts to lowercase, removes non-alpha characters,
|
|
|
|
and converts spaces to hyphens.
|
|
|
|
"""
|
|
|
|
value = unicode(value)
|
|
|
|
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
|
|
|
|
value = re.sub('[^\w\s-]', '', value).strip().lower()
|
|
|
|
return re.sub('[-\s]+', '_', value)
|
|
|
|
|
|
|
|
def load_overlay(overlay):
|
|
|
|
try:
|
2015-02-25 01:28:00 +08:00
|
|
|
loaded = json.load(open('overlay/{}.json'.format(overlay)))
|
2015-02-24 17:59:29 +08:00
|
|
|
except IOError:
|
|
|
|
return None
|
|
|
|
|
2015-02-25 06:07:11 +08:00
|
|
|
loaded['long_description'] = load_md('description/overlay/{}.md'.format(overlay))
|
2015-02-26 01:29:06 +08:00
|
|
|
loaded['url'] = slugify(loaded['name'])
|
|
|
|
pages[loaded['url']] = render_overlay_page(loaded)
|
2015-02-25 01:28:00 +08:00
|
|
|
return loaded
|
|
|
|
|
2015-02-25 06:07:11 +08:00
|
|
|
def load_md(filename):
|
2015-02-25 01:28:00 +08:00
|
|
|
try:
|
2015-02-25 06:07:11 +08:00
|
|
|
html = markdown.markdown(open(filename).read(), extensions=['fenced_code'])
|
|
|
|
|
|
|
|
return html
|
|
|
|
#return markdown.markdown(open(filename).read(), extensions=[gfm.HiddenHiliteExtension([]),'fenced_code'])
|
2015-02-25 01:28:00 +08:00
|
|
|
except IOError:
|
|
|
|
return None
|
|
|
|
|
2015-02-25 06:07:11 +08:00
|
|
|
def render_pin_text(pin_num, pin_url, pin_name, pin_subtext):
|
|
|
|
return '<article class="{}"><h1>{}</h1>{}{}</article>'.format(pin_url,pin_name,pin_subtext,load_md('description/pins/pin-{}.md'.format(pin_num)))
|
|
|
|
|
2015-02-25 01:28:00 +08:00
|
|
|
def render_overlay_page(overlay):
|
|
|
|
if overlay == None:
|
|
|
|
return ''
|
2015-02-25 06:07:11 +08:00
|
|
|
return '<article class="page_{}">{}</article>'.format(slugify(overlay['name']),overlay['long_description'])
|
2015-02-25 01:28:00 +08:00
|
|
|
|
2015-02-24 17:59:29 +08:00
|
|
|
db = json.load(open('pi-pinout.json'))
|
|
|
|
|
|
|
|
pins = db['pins']
|
|
|
|
|
2015-02-26 01:29:06 +08:00
|
|
|
pages['index'] = render_overlay_page({'name':'Index','long_description':load_md('description/index.md')})
|
2015-02-24 17:59:29 +08:00
|
|
|
|
|
|
|
overlays = map(load_overlay,overlays)
|
|
|
|
|
2015-02-26 01:29:06 +08:00
|
|
|
#pages += map(render_overlay_page,overlays)
|
2015-02-25 06:07:11 +08:00
|
|
|
|
2015-02-24 17:59:29 +08:00
|
|
|
def render_alternate(handle, name):
|
|
|
|
handle = slugify(handle.lower())
|
|
|
|
return '<span class="alternate legend_{}">{}</span>'.format(handle,name)
|
|
|
|
|
|
|
|
def render_pin(pin_num):
|
|
|
|
pin = pins[str(pin_num)]
|
|
|
|
pin_type = list([x.strip() for x in pin['type'].lower().split('/')])
|
|
|
|
pin_url = pin['name']
|
|
|
|
pin_name = pin['name']
|
2015-02-25 06:07:11 +08:00
|
|
|
pin_text_name = pin['name']
|
|
|
|
|
|
|
|
pin_subtext = []
|
2015-02-24 17:59:29 +08:00
|
|
|
alternates = []
|
|
|
|
|
2015-02-25 06:07:11 +08:00
|
|
|
|
|
|
|
pin_subtext.append('Physical pin {}'.format(pin_num))
|
|
|
|
|
2015-02-24 17:59:29 +08:00
|
|
|
for overlay in overlays:
|
|
|
|
if overlay != None:
|
|
|
|
if str(pin_num) in overlay['pin']:
|
|
|
|
alternates.append(render_alternate(overlay['name'],overlay['pin'][str(pin_num)]['name']))
|
|
|
|
|
|
|
|
if 'scheme' in pin:
|
|
|
|
if 'bcm' in pin['scheme']:
|
|
|
|
bcm = pin['scheme']['bcm']
|
|
|
|
pin_subname = ''
|
2015-02-25 06:07:11 +08:00
|
|
|
pin_subname_text = ''
|
2015-02-24 17:59:29 +08:00
|
|
|
#if pin_url == '':
|
|
|
|
pin_url = 'gpio{}'.format(bcm)
|
|
|
|
if pin['name'] != '':
|
|
|
|
pin_subname = '<small>({})</small>'.format(pin['name'])
|
2015-02-25 06:07:11 +08:00
|
|
|
pin_subname_text = '({})'.format(pin['name'])
|
|
|
|
pin_name = 'BCM {} {}'.format(bcm, pin_subname)
|
|
|
|
pin_text_name = 'BCM {} {}'.format(bcm, pin_subname_text)
|
|
|
|
pin_subtext.append('BCM pin {}'.format(bcm))
|
2015-02-24 17:59:29 +08:00
|
|
|
if 'wiringpi' in pin['scheme']:
|
|
|
|
wiringpi = pin['scheme']['wiringpi']
|
2015-02-25 06:07:11 +08:00
|
|
|
pin_subtext.append('Wiring Pi pin {}'.format(wiringpi))
|
2015-02-24 17:59:29 +08:00
|
|
|
alternates.append(render_alternate('wiringpi','Wiring Pi pin {}'.format(wiringpi)))
|
|
|
|
|
2015-02-25 06:07:11 +08:00
|
|
|
if 'bcmAlt' in pin['scheme']:
|
|
|
|
bcmAlt = pin['scheme']['bcmAlt']
|
|
|
|
pin_subtext.append('BCM pin {} on Rev 1 ( very early ) Pi'.format(bcmAlt))
|
|
|
|
|
2015-02-24 17:59:29 +08:00
|
|
|
#print(pin_type)
|
|
|
|
|
2015-02-25 06:07:11 +08:00
|
|
|
pin_url = slugify('pin{}_{}'.format(pin_num,pin_url))
|
|
|
|
|
|
|
|
pin_text = render_pin_text(pin_num,pin_url,pin_text_name,'<ul><li>{}</li></ul>'.format('</li><li>'.join(pin_subtext)))
|
|
|
|
if pin_text != None:
|
2015-02-26 01:29:06 +08:00
|
|
|
pages[pin_url] = pin_text
|
2015-02-25 06:07:11 +08:00
|
|
|
|
2015-02-26 01:29:06 +08:00
|
|
|
return '<li class="pin{} {}"><a href="{}.html"><span class="default"><span class="phys">{}</span> {}</span><span class="pin"></span>\n{}</a></li>\n'.format(
|
2015-02-24 17:59:29 +08:00
|
|
|
pin_num,
|
|
|
|
' '.join(map(slugify,pin_type)),
|
2015-02-25 06:07:11 +08:00
|
|
|
pin_url,
|
2015-02-24 17:59:29 +08:00
|
|
|
pin_num,
|
|
|
|
pin_name,
|
|
|
|
'\n'.join(alternates)
|
|
|
|
)
|
|
|
|
|
2015-02-26 01:29:06 +08:00
|
|
|
def render_page(nav, content):
|
|
|
|
global template
|
|
|
|
return template.replace('{{nav}}',nav).replace('{{content}}',content)
|
|
|
|
|
|
|
|
def render_nav():
|
|
|
|
global html_odd, html_even
|
|
|
|
for odd in range(1,len(pins),2):
|
|
|
|
html_odd += render_pin(odd)
|
|
|
|
html_even += render_pin(odd+1)
|
2015-02-24 17:59:29 +08:00
|
|
|
|
2015-02-25 01:28:00 +08:00
|
|
|
|
2015-02-26 01:29:06 +08:00
|
|
|
return '''<ul class="bottom">
|
2015-02-25 01:28:00 +08:00
|
|
|
{}</ul>
|
|
|
|
<ul class="top">
|
|
|
|
{}</ul>'''.format(html_odd, html_even)
|
|
|
|
|
2015-02-24 17:59:29 +08:00
|
|
|
|
2015-02-26 01:29:06 +08:00
|
|
|
nav = render_nav()
|
|
|
|
|
|
|
|
for page in pages:
|
|
|
|
content = pages[page]
|
|
|
|
print(content)
|
|
|
|
html = render_page(nav, content)
|
|
|
|
with open(os.path.join('output','{}.html'.format(page)),'w') as f:
|
|
|
|
f.write(html)
|
|
|
|
|