merge of Gadgetoid changes 151108
This commit is contained in:
parent
3d14aafcb9
commit
efce2b5d50
|
@ -9,19 +9,43 @@ import sys
|
||||||
import pinout
|
import pinout
|
||||||
import yaml
|
import yaml
|
||||||
import markjaml
|
import markjaml
|
||||||
|
import urlmapper
|
||||||
|
|
||||||
reload(sys)
|
reload(sys)
|
||||||
sys.setdefaultencoding('utf8')
|
sys.setdefaultencoding('utf8')
|
||||||
|
|
||||||
lang = "en-GB"
|
lang = "en-GB"
|
||||||
|
default_strings = {
|
||||||
|
'made_by': '* Made by {manufacturer}',
|
||||||
|
'type_hat': '* HAT form-factor',
|
||||||
|
'type_classic': '* Classic form-factor',
|
||||||
|
'pin_header': '* {} pin header',
|
||||||
|
'uses_i2c': '* Uses I2C',
|
||||||
|
'wiring_pi_pin': 'Wiring Pi pin {}'
|
||||||
|
}
|
||||||
|
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
lang = sys.argv[1]
|
lang = sys.argv[1]
|
||||||
|
|
||||||
|
alternate_urls = urlmapper.generate_urls(lang)
|
||||||
|
|
||||||
pinout.load(lang)
|
pinout.load(lang)
|
||||||
|
|
||||||
overlays = pinout.settings['overlays']
|
overlays = pinout.settings['overlays']
|
||||||
|
|
||||||
|
strings = pinout.get_setting('strings',{})
|
||||||
|
|
||||||
|
if type(strings) == list:
|
||||||
|
_strings = {}
|
||||||
|
for item in strings:
|
||||||
|
_strings[item.keys()[0]] = item.values()[0]
|
||||||
|
strings = _strings
|
||||||
|
|
||||||
|
for key, val in default_strings.items():
|
||||||
|
if key not in strings:
|
||||||
|
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'
|
||||||
|
@ -81,16 +105,16 @@ def load_overlay(overlay):
|
||||||
details = []
|
details = []
|
||||||
|
|
||||||
if 'manufacturer' in loaded:
|
if 'manufacturer' in loaded:
|
||||||
details.append('* Made by ' + 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('* HAT form-factor')
|
details.append(strings['type_hat'])
|
||||||
elif pincount == 26:
|
elif pincount == 26:
|
||||||
details.append('* Classic 26-pin')
|
details.append(strings['type_classic'])
|
||||||
else:
|
else:
|
||||||
details.append('* {} 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
|
||||||
|
@ -120,7 +144,7 @@ def load_overlay(overlay):
|
||||||
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('* 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('* [More Information]({url})'.format(url=loaded['url']))
|
||||||
|
@ -138,6 +162,7 @@ def load_overlay(overlay):
|
||||||
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)
|
||||||
|
loaded['src'] = overlay
|
||||||
pages[loaded['page_url']] = loaded
|
pages[loaded['page_url']] = loaded
|
||||||
navs[loaded['page_url']] = render_nav(loaded['page_url'], overlay=loaded)
|
navs[loaded['page_url']] = render_nav(loaded['page_url'], overlay=loaded)
|
||||||
select_overlays.append((loaded['page_url'], loaded['name']))
|
select_overlays.append((loaded['page_url'], loaded['name']))
|
||||||
|
@ -293,7 +318,7 @@ def render_pin(pin_num, selected_url, overlay=None):
|
||||||
pin_name = 'BCM {} {}'.format(bcm, pin_subname)
|
pin_name = 'BCM {} {}'.format(bcm, pin_subname)
|
||||||
if 'wiringpi' in pin['scheme']:
|
if 'wiringpi' in pin['scheme']:
|
||||||
wiringpi = pin['scheme']['wiringpi']
|
wiringpi = pin['scheme']['wiringpi']
|
||||||
pin_link_title.append('Wiring Pi pin {}'.format(wiringpi))
|
pin_link_title.append(strings['wiring_pi_pin'].format(wiringpi))
|
||||||
|
|
||||||
pin_url = base_url + slugify('pin{}_{}'.format(pin_num,pin_url))
|
pin_url = base_url + slugify('pin{}_{}'.format(pin_num,pin_url))
|
||||||
|
|
||||||
|
@ -345,9 +370,9 @@ and all other pages in /pinout/
|
||||||
|
|
||||||
serve.py will mirror this structure for testing.
|
serve.py will mirror this structure for testing.
|
||||||
'''
|
'''
|
||||||
pages['pinout'] = {}
|
pages['index'] = {}
|
||||||
pages['pinout']['rendered_html'] = render_overlay_page({'name':'Index','long_description':load_md('index.md')})
|
pages['index']['rendered_html'] = render_overlay_page({'name':'Index','long_description':load_md('index.md')})
|
||||||
navs['pinout'] = render_nav('pinout')
|
navs['index'] = render_nav('pinout')
|
||||||
|
|
||||||
print('Rendering pin pages...')
|
print('Rendering pin pages...')
|
||||||
|
|
||||||
|
@ -355,8 +380,26 @@ 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 == None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
hreflang = []
|
||||||
|
|
||||||
|
src = 'pin{}'.format(pin)
|
||||||
|
|
||||||
|
for code in alternate_urls:
|
||||||
|
if src in alternate_urls[code]:
|
||||||
|
alt = alternate_urls[code][src]
|
||||||
|
code_lang = code.split('-')[0] + '.'
|
||||||
|
if code_lang == 'en.':
|
||||||
|
code_lang = ''
|
||||||
|
hreflang.append('<link rel="alternate" src="//{lang}pinout.xyz/pinout/{alt}" hreflang="{code}"/>'.format(
|
||||||
|
lang=code_lang,
|
||||||
|
alt=alt,
|
||||||
|
code=code
|
||||||
|
))
|
||||||
|
|
||||||
pin_nav = render_nav(pin_url)
|
pin_nav = render_nav(pin_url)
|
||||||
pin_html = pinout.render_html(template,
|
pin_html = pinout.render_html(template,
|
||||||
|
hreflang = "\n\t\t".join(hreflang),
|
||||||
nav = pin_nav,
|
nav = pin_nav,
|
||||||
content = pin_html,
|
content = pin_html,
|
||||||
resource_url = resource_url,
|
resource_url = resource_url,
|
||||||
|
@ -376,6 +419,33 @@ print('Rendering overlay and index pages...')
|
||||||
for url in pages:
|
for url in pages:
|
||||||
content = pages[url]['rendered_html']
|
content = pages[url]['rendered_html']
|
||||||
nav = navs[url]
|
nav = navs[url]
|
||||||
|
hreflang = []
|
||||||
|
|
||||||
|
if url == 'index':
|
||||||
|
for code in alternate_urls:
|
||||||
|
code_lang = code.split('-')[0] + '.'
|
||||||
|
if code_lang == 'en.':
|
||||||
|
code_lang = ''
|
||||||
|
hreflang.append('<link rel="alternate" src="//{lang}pinout.xyz" hreflang="{code}"/>'.format(
|
||||||
|
lang=code_lang,
|
||||||
|
alt=alt,
|
||||||
|
code=code
|
||||||
|
))
|
||||||
|
|
||||||
|
if 'src' in pages[url]:
|
||||||
|
src = pages[url]['src']
|
||||||
|
|
||||||
|
for code in alternate_urls:
|
||||||
|
if src in alternate_urls[code]:
|
||||||
|
alt = alternate_urls[code][src]
|
||||||
|
code_lang = code.split('-')[0] + '.'
|
||||||
|
if code_lang == 'en.':
|
||||||
|
code_lang = ''
|
||||||
|
hreflang.append('<link rel="alternate" src="//{lang}pinout.xyz/pinout/{alt}" hreflang="{code}"/>'.format(
|
||||||
|
lang=code_lang,
|
||||||
|
alt=alt,
|
||||||
|
code=code
|
||||||
|
))
|
||||||
|
|
||||||
if not 'description' in pages[url]:
|
if not 'description' in pages[url]:
|
||||||
pages[url]['description'] = pinout.settings['default_desc']
|
pages[url]['description'] = pinout.settings['default_desc']
|
||||||
|
@ -386,6 +456,7 @@ for url in pages:
|
||||||
pages[url]['name'] = pinout.settings['default_title']
|
pages[url]['name'] = pinout.settings['default_title']
|
||||||
|
|
||||||
html = pinout.render_html(template,
|
html = pinout.render_html(template,
|
||||||
|
hreflang = "\n\t\t".join(hreflang),
|
||||||
nav = nav,
|
nav = nav,
|
||||||
content = content,
|
content = content,
|
||||||
overlays = overlays_html,
|
overlays = overlays_html,
|
||||||
|
@ -395,7 +466,7 @@ for url in pages:
|
||||||
)
|
)
|
||||||
print('Outputting page {}'.format(url))
|
print('Outputting page {}'.format(url))
|
||||||
|
|
||||||
if url != 'pinout':
|
if url != 'index':
|
||||||
url = os.path.join('pinout',url)
|
url = os.path.join('pinout',url)
|
||||||
|
|
||||||
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:
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 599 B |
|
@ -16,10 +16,15 @@ h2 {font-size:18px;margin-top:20px;}
|
||||||
.drop-down {
|
.drop-down {
|
||||||
float: right;
|
float: right;
|
||||||
display: block;
|
display: block;
|
||||||
width: 250px;
|
width: 500px;
|
||||||
border:2px solid #D6264E;
|
border:2px solid #D6264E;
|
||||||
margin-left:20px;
|
margin-left:20px;
|
||||||
}
|
}
|
||||||
|
img.grayscale {
|
||||||
|
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 10+, Firefox on Android */
|
||||||
|
filter: gray; /* IE6-9 */
|
||||||
|
-webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */
|
||||||
|
}
|
||||||
.overlay {
|
.overlay {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
@ -28,6 +33,7 @@ h2 {font-size:18px;margin-top:20px;}
|
||||||
background:rgba(255,255,255,0.95);
|
background:rgba(255,255,255,0.95);
|
||||||
padding:10px 0px;
|
padding:10px 0px;
|
||||||
clear:both;
|
clear:both;
|
||||||
|
overflow:hidden;
|
||||||
}
|
}
|
||||||
.overlay-container span {
|
.overlay-container span {
|
||||||
display:block;
|
display:block;
|
||||||
|
@ -36,8 +42,12 @@ h2 {font-size:18px;margin-top:20px;}
|
||||||
.overlay li {
|
.overlay li {
|
||||||
display:block;
|
display:block;
|
||||||
width:250px;
|
width:250px;
|
||||||
|
float:left;
|
||||||
}
|
}
|
||||||
.overlay li:nth-child(odd) a {
|
.overlay li:nth-child(odd) a {
|
||||||
|
border-right:2px solid #D6264E;
|
||||||
|
}
|
||||||
|
.overlay li:nth-child(4n+1) a,.overlay li:nth-child(4n+2) a {
|
||||||
background:rgba(214, 38, 78, 0.05);
|
background:rgba(214, 38, 78, 0.05);
|
||||||
}
|
}
|
||||||
.overlay li a, .drop-down span {
|
.overlay li a, .drop-down span {
|
||||||
|
@ -49,6 +59,7 @@ h2 {font-size:18px;margin-top:20px;}
|
||||||
cursor:pointer;
|
cursor:pointer;
|
||||||
width:230px;
|
width:230px;
|
||||||
}
|
}
|
||||||
|
.drop-down span {width:60px;}
|
||||||
.drop-down span:hover, .drop-down:hover span {
|
.drop-down span:hover, .drop-down:hover span {
|
||||||
background:#D6264E;
|
background:#D6264E;
|
||||||
color:#FFFFFF;
|
color:#FFFFFF;
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 492 B |
6
serve.py
6
serve.py
|
@ -5,9 +5,9 @@ app = Flask(__name__)
|
||||||
|
|
||||||
lang = 'en-GB'
|
lang = 'en-GB'
|
||||||
|
|
||||||
@app.route("/")
|
@app.route('/')
|
||||||
def redirect_to_pinout():
|
def show_index():
|
||||||
return redirect('/pinout')
|
return send_from_directory(basedir,'index.html')
|
||||||
|
|
||||||
@app.route("/resources/<path:filename>")
|
@app.route("/resources/<path:filename>")
|
||||||
def custom_static(filename):
|
def custom_static(filename):
|
||||||
|
|
|
@ -8,6 +8,13 @@ resource_url: /resources/
|
||||||
url_suffix:
|
url_suffix:
|
||||||
urls:
|
urls:
|
||||||
GND: ground
|
GND: ground
|
||||||
|
strings:
|
||||||
|
- made_by: '* Made by {manufacturer}'
|
||||||
|
- type_hat: '* HAT form-factor'
|
||||||
|
- type_classic: '* Classic form-factor'
|
||||||
|
- pin_header: '* {} pin header'
|
||||||
|
- uses_i2c: '* Uses I2C'
|
||||||
|
- wiring_pi_pin: 'Wiring Pi pin {}'
|
||||||
overlays:
|
overlays:
|
||||||
- ground
|
- ground
|
||||||
- spi
|
- spi
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
import json
|
||||||
|
import unicodedata
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import pinout
|
||||||
|
import yaml
|
||||||
|
import markjaml
|
||||||
|
import glob
|
||||||
|
|
||||||
|
reload(sys)
|
||||||
|
sys.setdefaultencoding('utf8')
|
||||||
|
|
||||||
|
def url_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_url(overlay, lang):
|
||||||
|
try:
|
||||||
|
data = markjaml.load('src/{}/overlay/{}.md'.format(lang,overlay))
|
||||||
|
|
||||||
|
loaded = data['data']
|
||||||
|
except IOError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not 'page_url' in loaded:
|
||||||
|
loaded['page_url'] = url_slugify(loaded['name'])
|
||||||
|
|
||||||
|
return overlay, loaded['page_url']
|
||||||
|
|
||||||
|
def get_pin_url(pin_num,pinout):
|
||||||
|
pin = pinout.pins[str(pin_num)]
|
||||||
|
pin_url = pin['name']
|
||||||
|
|
||||||
|
if pin_url == 'Ground':
|
||||||
|
return None
|
||||||
|
|
||||||
|
if 'scheme' in pin:
|
||||||
|
if 'bcm' in pin['scheme']:
|
||||||
|
bcm = pin['scheme']['bcm']
|
||||||
|
pin_url = 'gpio{}'.format(bcm)
|
||||||
|
|
||||||
|
return url_slugify('pin{}_{}'.format(pin_num,pin_url))
|
||||||
|
|
||||||
|
def generate_for_lang(lang="en-GB"):
|
||||||
|
url_lookup = {}
|
||||||
|
|
||||||
|
pinout.load(lang)
|
||||||
|
|
||||||
|
overlays = pinout.settings['overlays']
|
||||||
|
|
||||||
|
overlays_html = ''
|
||||||
|
|
||||||
|
overlays = map(lambda overlay: load_overlay_url(overlay, lang),overlays)
|
||||||
|
|
||||||
|
for pin in range(1,len(pinout.pins)+1):
|
||||||
|
pin_url = get_pin_url(pin,pinout)
|
||||||
|
if pin_url is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
url_lookup['pin{}'.format(pin)] = '{}'.format(pin_url)
|
||||||
|
|
||||||
|
for url in overlays:
|
||||||
|
if url is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
url_lookup['{}'.format(url[0])] = '{}'.format(url[1])
|
||||||
|
|
||||||
|
return url_lookup
|
||||||
|
|
||||||
|
def generate_urls(lang="en-GB"):
|
||||||
|
languages = [l.replace('src/','') for l in glob.glob('src/*')] # if not l == 'src/'+lang
|
||||||
|
urls = {}
|
||||||
|
for lang in languages:
|
||||||
|
urls[lang] = generate_for_lang(lang)
|
||||||
|
return urls
|
||||||
|
|
Loading…
Reference in New Issue