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 0000000..ff701e1
Binary files /dev/null and b/resources/gb.png differ
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 0000000..be32f77
Binary files /dev/null and b/resources/tr.png differ
diff --git a/serve.py b/serve.py
index 22b1ece..08b6a93 100755
--- a/serve.py
+++ b/serve.py
@@ -5,9 +5,9 @@ app = Flask(__name__)
lang = 'en-GB'
-@app.route("/")
-def redirect_to_pinout():
- return redirect('/pinout')
+@app.route('/')
+def show_index():
+ return send_from_directory(basedir,'index.html')
@app.route("/resources/")
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
+