pinout.vvzero.com/generate-json.py

140 lines
3.7 KiB
Python
Raw Permalink Normal View History

2015-06-26 00:02:47 +08:00
#!/usr/bin/env python
2016-09-14 01:27:55 +08:00
2015-06-26 00:02:47 +08:00
import json
import re
import sys
2016-09-14 01:27:55 +08:00
import unicodedata
import markdown
import glob
2015-06-26 00:02:47 +08:00
import markjaml
2016-09-14 01:27:55 +08:00
import pinout
2015-06-26 00:02:47 +08:00
reload(sys)
sys.setdefaultencoding('utf8')
2015-11-14 07:16:37 +08:00
lang = "en"
2015-06-26 00:02:47 +08:00
if len(sys.argv) > 1:
lang = sys.argv[1]
2015-06-26 00:02:47 +08:00
pinout.load(lang)
overlays = glob.glob("src/{}/overlay/*.md".format(lang)) + glob.glob("src/{}/translate/*.md".format(lang))
overlays = [overlay.split("/")[-1].replace(".md", "") for overlay in overlays]
2015-06-26 00:02:47 +08:00
pages = {}
product_map = {}
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
2015-06-26 00:02:47 +08:00
def cssify(value):
value = slugify(value)
2015-11-18 21:52:15 +08:00
if value[0] == '3' or value[0] == '5':
value = 'pow' + value
return value
2015-06-26 00:02:47 +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)
2015-11-18 21:52:15 +08:00
2015-06-26 00:02:47 +08:00
def load_overlay(overlay):
2015-11-18 21:52:15 +08:00
try:
data = markjaml.load('src/{}/overlay/{}.md'.format(lang, overlay))
loaded = data['data']
except IOError:
return None
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
details = []
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if 'manufacturer' in loaded:
2018-02-18 21:27:37 +08:00
if loaded['manufacturer'] == "Pimoroni":
if 'buy' in loaded:
product_slug = loaded['buy'].split('/')[-1]
product_map[product_slug] = slugify(loaded['name'])
2015-11-18 21:52:15 +08:00
details.append('* Made by ' + loaded['manufacturer'])
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if 'pincount' in loaded:
pincount = int(loaded['pincount'])
if pincount == 40:
details.append('* HAT form-factor')
2015-12-04 01:31:15 +08:00
elif pincount == 38:
details.append('* pHAT form-factor')
2015-11-18 21:52:15 +08:00
elif pincount == 26:
details.append('* Classic 26-pin')
else:
details.append('* {} pin header'.format(pincount))
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if 'pin' in loaded:
uses_5v = False
uses_3v = False
uses = 0
for pin in loaded['pin']:
pin = str(pin)
if pin.startswith('bcm'):
pin = pinout.bcm_to_physical(pin[3:])
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if pin in pinout.pins:
actual_pin = pinout.pins[pin]
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if actual_pin['type'] in ['+3v3', '+5v', 'GND']:
if actual_pin['type'] == '+3v3':
uses_3v = True
if actual_pin['type'] == '+5v':
uses_5v = True
else:
uses += 1
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if uses > 0:
details.append('* Uses {} GPIO pins'.format(uses))
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if '3' in loaded['pin'] and '5' in loaded['pin']:
pin_3 = loaded['pin']['3']
pin_5 = loaded['pin']['5']
2018-02-18 21:27:37 +08:00
if pin_3 is not None and pin_5 is not None:
if 'mode' in pin_3 and 'mode' in pin_5:
if pin_3['mode'] == 'i2c' and pin_5['mode'] == 'i2c':
details.append('* Uses I2C')
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if 'url' in loaded:
details.append('* [More Information]({url})'.format(url=loaded['url']))
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if 'github' in loaded:
details.append('* [GitHub Repository]({url})'.format(url=loaded['github']))
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if 'buy' in loaded:
details.append('* [Buy Now]({url})'.format(url=loaded['buy']))
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
if not 'page_url' in loaded:
loaded['page_url'] = slugify(loaded['name'])
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
pages[loaded['page_url']] = loaded
return loaded
2015-06-26 00:02:47 +08:00
def load_md(filename):
2015-11-18 21:52:15 +08:00
filename = 'src/{}/{}'.format(lang, filename)
try:
html = markdown.markdown(open(filename).read(), extensions=['fenced_code'])
return html
except IOError:
print('Unable to load markdown from {}'.format(filename))
return ''
2015-06-26 00:02:47 +08:00
2015-11-18 21:52:15 +08:00
overlays = map(load_overlay, overlays)
2015-06-26 00:02:47 +08:00
print(json.dumps(overlays))
#print(json.dumps(product_map))