From efce2b5d504fbb4de20b1acf131e419376543b72 Mon Sep 17 00:00:00 2001 From: RogueM Date: Sun, 8 Nov 2015 21:07:54 +0000 Subject: [PATCH] merge of Gadgetoid changes 151108 --- generate-html.py | 91 ++++++++++++++++-- resources/gb.png | Bin 0 -> 599 bytes resources/pinout.css | 13 ++- resources/tr.png | Bin 0 -> 492 bytes serve.py | 6 +- .../{rtk-000-0001.md => rtk-000-001.md} | 0 src/en-GB/settings.yaml | 7 ++ urlmapper.py | 85 ++++++++++++++++ 8 files changed, 188 insertions(+), 14 deletions(-) create mode 100644 resources/gb.png create mode 100755 resources/tr.png rename src/en-GB/overlay/{rtk-000-0001.md => rtk-000-001.md} (100%) create mode 100755 urlmapper.py diff --git a/generate-html.py b/generate-html.py index cf40047..31eb2c6 100755 --- a/generate-html.py +++ b/generate-html.py @@ -9,19 +9,43 @@ import sys import pinout import yaml import markjaml +import urlmapper reload(sys) sys.setdefaultencoding('utf8') 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: lang = sys.argv[1] +alternate_urls = urlmapper.generate_urls(lang) + pinout.load(lang) 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/' resource_url = pinout.get_setting('resource_url','/resources/') # '/pinout-tr/resources/' url_suffix = pinout.get_setting('url_suffix','') # '.html' @@ -81,16 +105,16 @@ def load_overlay(overlay): details = [] if 'manufacturer' in loaded: - details.append('* Made by ' + loaded['manufacturer']) + details.append(strings['made_by'].format(manufacturer=loaded['manufacturer'])) if 'pincount' in loaded: pincount = int(loaded['pincount']) if pincount == 40: - details.append('* HAT form-factor') + details.append(strings['type_hat']) elif pincount == 26: - details.append('* Classic 26-pin') + details.append(strings['type_classic']) else: - details.append('* {} pin header'.format(pincount)) + details.append(strings['pin_header'].format(pincount)) if 'pin' in loaded: uses_5v = False @@ -120,7 +144,7 @@ def load_overlay(overlay): pin_5 = loaded['pin']['5'] if 'mode' in pin_3 and 'mode' in pin_5: if pin_3['mode'] == 'i2c' and pin_5['mode'] == 'i2c': - details.append('* Uses I2C') + details.append(strings['uses_i2c']) if 'url' in loaded: details.append('* [More Information]({url})'.format(url=loaded['url'])) @@ -138,6 +162,7 @@ def load_overlay(overlay): loaded['page_url'] = slugify(loaded['name']) loaded['rendered_html'] = render_overlay_page(loaded) + loaded['src'] = overlay pages[loaded['page_url']] = loaded navs[loaded['page_url']] = render_nav(loaded['page_url'], overlay=loaded) 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) if 'wiringpi' in pin['scheme']: 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)) @@ -345,9 +370,9 @@ and all other pages in /pinout/ serve.py will mirror this structure for testing. ''' -pages['pinout'] = {} -pages['pinout']['rendered_html'] = render_overlay_page({'name':'Index','long_description':load_md('index.md')}) -navs['pinout'] = render_nav('pinout') +pages['index'] = {} +pages['index']['rendered_html'] = render_overlay_page({'name':'Index','long_description':load_md('index.md')}) +navs['index'] = render_nav('pinout') 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) if pin_url == None: 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(''.format( + lang=code_lang, + alt=alt, + code=code + )) + pin_nav = render_nav(pin_url) pin_html = pinout.render_html(template, + hreflang = "\n\t\t".join(hreflang), nav = pin_nav, content = pin_html, resource_url = resource_url, @@ -376,6 +419,33 @@ print('Rendering overlay and index pages...') for url in pages: content = pages[url]['rendered_html'] 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(''.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(''.format( + lang=code_lang, + alt=alt, + code=code + )) if not 'description' in pages[url]: pages[url]['description'] = pinout.settings['default_desc'] @@ -386,6 +456,7 @@ for url in pages: pages[url]['name'] = pinout.settings['default_title'] html = pinout.render_html(template, + hreflang = "\n\t\t".join(hreflang), nav = nav, content = content, overlays = overlays_html, @@ -395,7 +466,7 @@ for url in pages: ) print('Outputting page {}'.format(url)) - if url != 'pinout': + if url != 'index': url = os.path.join('pinout',url) with open(os.path.join('output',lang,'{}.html'.format(url)),'w') as f: diff --git a/resources/gb.png b/resources/gb.png new file mode 100644 index 0000000000000000000000000000000000000000..ff701e19f6d2c0658fb23b1d94124cba4ce60851 GIT binary patch literal 599 zcmV-d0;v6oP)U(k2*|8J(R-+sudaynhucHbwAMTnor{mwqO^w7JHzaBsT z{O^B8RYf5+LvDs&KmRKVd78=o{`1#HTiEo_OolaGleS)G+IQ#sUI`b*pv<`1zCJ=H0jd{{2S>p`ri%{LsXJ%FbMS z$#S`6f|?OG!^Jxczkf6Q`UNF{l0Sd`ad7zm>({^EzyAS6{{CgrkluOb3l1A>ZU2~A zK+FZ=zkmP!`TOVhpFbzBzFaPmD2$N3;+$pK?>zdet`f0002ovPDHLkV1gy;I?Vt8 literal 0 HcmV?d00001 diff --git a/resources/pinout.css b/resources/pinout.css index 2952aad..18450d1 100644 --- a/resources/pinout.css +++ b/resources/pinout.css @@ -16,10 +16,15 @@ h2 {font-size:18px;margin-top:20px;} .drop-down { float: right; display: block; - width: 250px; + width: 500px; border:2px solid #D6264E; 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 { margin: 0; padding: 0; @@ -28,6 +33,7 @@ h2 {font-size:18px;margin-top:20px;} background:rgba(255,255,255,0.95); padding:10px 0px; clear:both; + overflow:hidden; } .overlay-container span { display:block; @@ -36,8 +42,12 @@ h2 {font-size:18px;margin-top:20px;} .overlay li { display:block; width:250px; + float:left; } .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); } .overlay li a, .drop-down span { @@ -49,6 +59,7 @@ h2 {font-size:18px;margin-top:20px;} cursor:pointer; width:230px; } +.drop-down span {width:60px;} .drop-down span:hover, .drop-down:hover span { background:#D6264E; color:#FFFFFF; diff --git a/resources/tr.png b/resources/tr.png new file mode 100755 index 0000000000000000000000000000000000000000..be32f77e9910c0896c1ee8e7ed4f0edf815a517e GIT binary patch literal 492 zcmV@|4`Xj5kLT%yy% zCxE~j7#aURc>+`lQtjr(@bBOM9XtMi`UFz<>-YcPzyAOF1!ObI$^vZw2q2J#|6qeb zs-vSBOie-Rl$HN?bb!_U0_g#3VEFwTr~x2=m_Y6Zss`GqsL0^t^nd#F|4B*zH*EO- z_3QuT%m4H6g6)A?0#pkSKujPf{rCwIb#eU5`( z{s2t}2q2J#|9}60{Pg58FvR|AYlEDjruP5RC6KEgJ^H_IA4CJhNdN)F0>q49OBog~ z{?Etvzo-c07$As@{Qu?4|3!FoS~(Xu$ujuK&Ki|5;f") def custom_static(filename): diff --git a/src/en-GB/overlay/rtk-000-0001.md b/src/en-GB/overlay/rtk-000-001.md similarity index 100% rename from src/en-GB/overlay/rtk-000-0001.md rename to src/en-GB/overlay/rtk-000-001.md diff --git a/src/en-GB/settings.yaml b/src/en-GB/settings.yaml index 2af5b36..b9cc54f 100644 --- a/src/en-GB/settings.yaml +++ b/src/en-GB/settings.yaml @@ -8,6 +8,13 @@ resource_url: /resources/ url_suffix: urls: 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: - ground - spi diff --git a/urlmapper.py b/urlmapper.py new file mode 100755 index 0000000..8308e08 --- /dev/null +++ b/urlmapper.py @@ -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 +