Tidying up build process
This commit is contained in:
parent
7e385b7999
commit
6d45bb72d1
|
@ -1 +1,2 @@
|
||||||
output/
|
output/
|
||||||
|
*.py[cod]
|
||||||
|
|
100
generate-html.py
100
generate-html.py
|
@ -6,6 +6,7 @@ import re
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import sys
|
import sys
|
||||||
|
import pinout
|
||||||
|
|
||||||
lang = "en-GB"
|
lang = "en-GB"
|
||||||
base_url = '/pinout/'
|
base_url = '/pinout/'
|
||||||
|
@ -14,11 +15,7 @@ resource_url = '/resources/'
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
lang = sys.argv[1]
|
lang = sys.argv[1]
|
||||||
|
|
||||||
default_desc = 'The comprehensive Raspberry Pi GPIO Pinout guide for the original Raspberry Pi, B+ and Pi 2'
|
pinout.load(lang)
|
||||||
default_title = 'Raspberry Pi GPIO Pinout - Pi 1, B+, Pi 2'
|
|
||||||
title_suffix = ' at Raspberry Pi GPIO Pinout'
|
|
||||||
|
|
||||||
pins = None
|
|
||||||
|
|
||||||
overlays = [
|
overlays = [
|
||||||
'spi',
|
'spi',
|
||||||
|
@ -86,7 +83,7 @@ def load_overlay(overlay):
|
||||||
except IOError:
|
except IOError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
loaded['long_description'] = load_md('src/{}/description/overlay/{}.md'.format(lang,overlay))
|
loaded['long_description'] = load_md('description/overlay/{}.md'.format(overlay))
|
||||||
|
|
||||||
details = []
|
details = []
|
||||||
|
|
||||||
|
@ -103,25 +100,16 @@ def load_overlay(overlay):
|
||||||
details.append('* {} pin header'.format(pincount))
|
details.append('* {} pin header'.format(pincount))
|
||||||
|
|
||||||
if 'pin' in loaded:
|
if 'pin' in loaded:
|
||||||
#uses = len(loaded['pin'])
|
|
||||||
uses_5v = False
|
uses_5v = False
|
||||||
uses_3v = False
|
uses_3v = False
|
||||||
uses = 0
|
uses = 0
|
||||||
for pin in loaded['pin']:
|
for pin in loaded['pin']:
|
||||||
if pin.startswith('bcm'):
|
if pin.startswith('bcm'):
|
||||||
pin = pin[3:]
|
pin = pinout.bcm_to_physical(pin[3:])
|
||||||
for idx in pins:
|
|
||||||
compare_pin = pins[idx]
|
if pin in pinout.pins:
|
||||||
#print(compare_pin)
|
actual_pin = pinout.pins[pin]
|
||||||
if 'scheme' in compare_pin:
|
|
||||||
if 'bcm' in compare_pin['scheme']:
|
|
||||||
if compare_pin['scheme']['bcm'] == int(pin):
|
|
||||||
print("Mapping BCM{} to {}".format(pin, str(idx)))
|
|
||||||
pin = str(idx)
|
|
||||||
break
|
|
||||||
|
|
||||||
if pin in pins:
|
|
||||||
actual_pin = pins[pin]
|
|
||||||
if actual_pin['type'] in ['+3v3','+5v','GND']:
|
if actual_pin['type'] in ['+3v3','+5v','GND']:
|
||||||
if actual_pin['type'] == '+3v3':
|
if actual_pin['type'] == '+3v3':
|
||||||
uses_3v = True
|
uses_3v = True
|
||||||
|
@ -160,12 +148,13 @@ def load_overlay(overlay):
|
||||||
return loaded
|
return loaded
|
||||||
|
|
||||||
def load_md(filename):
|
def load_md(filename):
|
||||||
|
filename = 'src/{}/{}'.format(lang, filename)
|
||||||
try:
|
try:
|
||||||
html = markdown.markdown(open(filename).read(), extensions=['fenced_code'])
|
html = markdown.markdown(open(filename).read(), extensions=['fenced_code'])
|
||||||
|
|
||||||
return html
|
return html
|
||||||
#return markdown.markdown(open(filename).read(), extensions=[gfm.HiddenHiliteExtension([]),'fenced_code'])
|
|
||||||
except IOError:
|
except IOError:
|
||||||
|
print('Unable to load markdown from {}'.format(filename))
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
def render_pin_text(pin_num, pin_url, pin_name, pin_functions, pin_subtext):
|
def render_pin_text(pin_num, pin_url, pin_name, pin_functions, pin_subtext):
|
||||||
|
@ -174,21 +163,20 @@ def render_pin_text(pin_num, pin_url, pin_name, pin_functions, pin_subtext):
|
||||||
pin_name=pin_name,
|
pin_name=pin_name,
|
||||||
pin_functions=pin_functions,
|
pin_functions=pin_functions,
|
||||||
pin_subtext=pin_subtext,
|
pin_subtext=pin_subtext,
|
||||||
pin_text=load_md('src/{}/description/pins/pin-{}.md'.format(lang,pin_num)))
|
pin_text=load_md('description/pins/pin-{}.md'.format(pin_num)))
|
||||||
|
|
||||||
def render_overlay_page(overlay):
|
def render_overlay_page(overlay):
|
||||||
if overlay == None:
|
if overlay == None:
|
||||||
return ''
|
return ''
|
||||||
return '<article class="page_{}">{}</article>'.format(slugify(overlay['name']),overlay['long_description'])
|
return '<article class="page_{}">{}</article>'.format(slugify(overlay['name']),overlay['long_description'])
|
||||||
|
|
||||||
#pages += map(render_overlay_page,overlays)
|
|
||||||
|
|
||||||
def render_alternate(handle, name):
|
def render_alternate(handle, name):
|
||||||
handle = slugify(handle.lower())
|
handle = slugify(handle.lower())
|
||||||
return '<span class="alternate legend_{}">{}</span>'.format(handle,name)
|
return '<span class="alternate legend_{}">{}</span>'.format(handle,name)
|
||||||
|
|
||||||
def render_pin_page(pin_num):
|
def render_pin_page(pin_num):
|
||||||
pin = pins[str(pin_num)]
|
pin = pinout.pins[str(pin_num)]
|
||||||
pin_url = pin['name']
|
pin_url = pin['name']
|
||||||
pin_text_name = pin['name']
|
pin_text_name = pin['name']
|
||||||
|
|
||||||
|
@ -202,8 +190,6 @@ def render_pin_page(pin_num):
|
||||||
bcm = pin['scheme']['bcm']
|
bcm = pin['scheme']['bcm']
|
||||||
pin_url = 'gpio{}'.format(bcm)
|
pin_url = 'gpio{}'.format(bcm)
|
||||||
|
|
||||||
#pin_subname_text = ''
|
|
||||||
#pin_text_name = 'BCM {} {}'.format(bcm, pin_subname_text)
|
|
||||||
pin_text_name = 'BCM {}'.format(bcm)
|
pin_text_name = 'BCM {}'.format(bcm)
|
||||||
|
|
||||||
if pin['name'] != '':
|
if pin['name'] != '':
|
||||||
|
@ -262,7 +248,7 @@ def render_pin_page(pin_num):
|
||||||
|
|
||||||
|
|
||||||
def render_pin(pin_num, selected_url, overlay=None):
|
def render_pin(pin_num, selected_url, overlay=None):
|
||||||
pin = pins[str(pin_num)]
|
pin = pinout.pins[str(pin_num)]
|
||||||
|
|
||||||
|
|
||||||
pin_type = list([x.strip() for x in pin['type'].lower().split('/')])
|
pin_type = list([x.strip() for x in pin['type'].lower().split('/')])
|
||||||
|
@ -289,12 +275,6 @@ def render_pin(pin_num, selected_url, overlay=None):
|
||||||
|
|
||||||
if 'description' in overlay_pin:
|
if 'description' in overlay_pin:
|
||||||
pin_link_title.append(overlay_pin['description'])
|
pin_link_title.append(overlay_pin['description'])
|
||||||
#alternates = []
|
|
||||||
|
|
||||||
#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 'scheme' in pin:
|
||||||
if 'bcm' in pin['scheme']:
|
if 'bcm' in pin['scheme']:
|
||||||
|
@ -305,19 +285,13 @@ def render_pin(pin_num, selected_url, overlay=None):
|
||||||
pin_url = 'gpio{}'.format(bcm)
|
pin_url = 'gpio{}'.format(bcm)
|
||||||
if pin_name != '': #pin['name'] != '':
|
if pin_name != '': #pin['name'] != '':
|
||||||
pin_subname = '<small>({})</small>'.format(pin_name) #pin['name'])
|
pin_subname = '<small>({})</small>'.format(pin_name) #pin['name'])
|
||||||
# pin_subname_text = '({})'.format(pin['name'])
|
|
||||||
pin_name = 'BCM {} {}'.format(bcm, pin_subname)
|
pin_name = 'BCM {} {}'.format(bcm, pin_subname)
|
||||||
# pin_text_name = 'BCM {} {}'.format(bcm, pin_subname_text)
|
|
||||||
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('Wiring Pi pin {}'.format(wiringpi))
|
||||||
# alternates.append(render_alternate('wiringpi','Wiring Pi pin {}'.format(wiringpi)))
|
|
||||||
|
|
||||||
#print(pin_type)
|
|
||||||
|
|
||||||
pin_url = base_url + slugify('pin{}_{}'.format(pin_num,pin_url))
|
pin_url = base_url + slugify('pin{}_{}'.format(pin_num,pin_url))
|
||||||
|
|
||||||
#print(selected_url)
|
|
||||||
selected = ''
|
selected = ''
|
||||||
|
|
||||||
if base_url + selected_url == pin_url:
|
if base_url + selected_url == pin_url:
|
||||||
|
@ -337,7 +311,7 @@ def render_pin(pin_num, selected_url, overlay=None):
|
||||||
def render_nav(url, overlay=None):
|
def render_nav(url, overlay=None):
|
||||||
html_odd = ''
|
html_odd = ''
|
||||||
html_even = ''
|
html_even = ''
|
||||||
for odd in range(1,len(pins),2):
|
for odd in range(1,len(pinout.pins),2):
|
||||||
html_odd += render_pin(odd, url,overlay)
|
html_odd += render_pin(odd, url,overlay)
|
||||||
html_even += render_pin(odd+1,url,overlay)
|
html_even += render_pin(odd+1,url,overlay)
|
||||||
|
|
||||||
|
@ -347,33 +321,36 @@ def render_nav(url, overlay=None):
|
||||||
{}</ul>'''.format(html_odd, html_even)
|
{}</ul>'''.format(html_odd, html_even)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
db = json.load(open('src/{}/pi-pinout.json'.format(lang)))
|
|
||||||
|
|
||||||
pins = db['pins']
|
|
||||||
|
|
||||||
overlays = map(load_overlay,overlays)
|
overlays = map(load_overlay,overlays)
|
||||||
|
|
||||||
for url, name in select_overlays:
|
for url, name in select_overlays:
|
||||||
overlays_html += '<option value="{}">{}</option>'.format(url, name)
|
overlays_html += '<option value="{}">{}</option>'.format(url, name)
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
Manually add the index page as 'pinout', this is due to how the
|
||||||
|
website is currently structured with /pinout as the index
|
||||||
|
and all other pages in /pinout/
|
||||||
|
|
||||||
|
serve.py will mirror this structure for testing.
|
||||||
|
'''
|
||||||
pages['pinout'] = {}
|
pages['pinout'] = {}
|
||||||
pages['pinout']['rendered_html'] = render_overlay_page({'name':'Index','long_description':load_md('description/index.md')})
|
pages['pinout']['rendered_html'] = render_overlay_page({'name':'Index','long_description':load_md('description/index.md')})
|
||||||
navs['pinout'] = render_nav('pinout')
|
navs['pinout'] = render_nav('pinout')
|
||||||
|
|
||||||
print('Rendering pin pages...')
|
print('Rendering pin pages...')
|
||||||
|
|
||||||
for pin in range(1,len(pins)+1):
|
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)
|
||||||
pin_nav = render_nav(pin_url)
|
pin_nav = render_nav(pin_url)
|
||||||
pin_html = template.replace('{{nav}}',pin_nav).replace('{{content}}',pin_html)
|
pin_html = pinout.render_html(template,
|
||||||
pin_html = pin_html.replace('{{resource_url}}',resource_url)
|
nav = pin_nav,
|
||||||
pin_html = pin_html.replace('{{overlays}}',overlays_html).replace('{{v}}',str(int(time.time())))
|
content = pin_html,
|
||||||
pin_html = pin_html.replace('{{description}}',default_desc)
|
resource_url = resource_url,
|
||||||
pin_html = pin_html.replace('{{title}}',pin_title + title_suffix)
|
overlays = overlays_html,
|
||||||
|
description = pinout.settings['default_desc'],
|
||||||
|
title = pin_title + pinout.settings['title_suffix']
|
||||||
|
)
|
||||||
print('Outputting page {}'.format(pin_url))
|
print('Outputting page {}'.format(pin_url))
|
||||||
|
|
||||||
with open(os.path.join('output',lang,'pinout','{}.html'.format(pin_url)),'w') as f:
|
with open(os.path.join('output',lang,'pinout','{}.html'.format(pin_url)),'w') as f:
|
||||||
|
@ -388,19 +365,22 @@ for url in pages:
|
||||||
nav = navs[url]
|
nav = navs[url]
|
||||||
|
|
||||||
if not 'description' in pages[url]:
|
if not 'description' in pages[url]:
|
||||||
pages[url]['description'] = default_desc
|
pages[url]['description'] = pinout.settings['default_desc']
|
||||||
|
|
||||||
if 'name' in pages[url]:
|
if 'name' in pages[url]:
|
||||||
pages[url]['name'] = pages[url]['name'] + title_suffix
|
pages[url]['name'] = pages[url]['name'] + pinout.settings['title_suffix']
|
||||||
else:
|
else:
|
||||||
pages[url]['name'] = default_title
|
pages[url]['name'] = pinout.settings['default_title']
|
||||||
|
|
||||||
|
html = pinout.render_html(template,
|
||||||
|
nav = nav,
|
||||||
|
content = content,
|
||||||
|
overlays = overlays_html,
|
||||||
|
resource_url = resource_url,
|
||||||
|
description = pages[url]['description'],
|
||||||
|
title = pages[url]['name']
|
||||||
|
)
|
||||||
print('Outputting page {}'.format(url))
|
print('Outputting page {}'.format(url))
|
||||||
html = template.replace('{{nav}}',nav).replace('{{content}}',content)
|
|
||||||
html = html.replace('{{resource_url}}',resource_url).replace('{{overlays}}',overlays_html)
|
|
||||||
html = html.replace('{{v}}',str(int(time.time())))
|
|
||||||
html = html.replace('{{description}}',pages[url]['description'])
|
|
||||||
html = html.replace('{{title}}',pages[url]['name'])
|
|
||||||
|
|
||||||
if url != 'pinout':
|
if url != 'pinout':
|
||||||
url = os.path.join('pinout',url)
|
url = os.path.join('pinout',url)
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import markdown
|
||||||
|
|
||||||
|
DB_FILE = 'pi-pinout.json'
|
||||||
|
SETTINGS_FILE = 'settings.json'
|
||||||
|
|
||||||
|
pins = None
|
||||||
|
settings = None
|
||||||
|
|
||||||
|
def render_html(*args, **kwargs):
|
||||||
|
html = args[0]
|
||||||
|
kwargs['v'] = str(int(time.time()))
|
||||||
|
for key in kwargs:
|
||||||
|
html = html.replace('{{' + key + '}}', kwargs[key])
|
||||||
|
return html
|
||||||
|
|
||||||
|
def bcm_to_physical(pin):
|
||||||
|
for idx in pins:
|
||||||
|
compare_pin = pins[idx]
|
||||||
|
if 'scheme' in compare_pin:
|
||||||
|
if 'bcm' in compare_pin['scheme']:
|
||||||
|
if compare_pin['scheme']['bcm'] == int(pin):
|
||||||
|
#print("Mapping BCM{} to {}".format(pin, str(idx)))
|
||||||
|
return str(idx)
|
||||||
|
|
||||||
|
def physical_to_bcm(pin):
|
||||||
|
pin = pins[pin]
|
||||||
|
if 'scheme' in pin:
|
||||||
|
if 'bcm' in pin['scheme']:
|
||||||
|
return str(pin['scheme']['bcm'])
|
||||||
|
return None
|
||||||
|
|
||||||
|
def physical_to_wiringpi(pin):
|
||||||
|
pin = pins[pin]
|
||||||
|
if 'scheme' in pin:
|
||||||
|
if 'wiringpi' in pin['scheme']:
|
||||||
|
return str(pin['scheme']['wiringpi'])
|
||||||
|
return None
|
||||||
|
|
||||||
|
def physical_to(pin, scheme='bcm'):
|
||||||
|
if scheme in ['bcm','wiringpi']:
|
||||||
|
pin = pins[pin]
|
||||||
|
if 'scheme' in pin:
|
||||||
|
if scheme in pin['scheme']:
|
||||||
|
return str(pin['scheme'][scheme])
|
||||||
|
elif scheme == 'physical':
|
||||||
|
return pin
|
||||||
|
return None
|
||||||
|
|
||||||
|
def load(lang='en-GB'):
|
||||||
|
global pins, settings
|
||||||
|
db = json.load(open('src/{}/{}'.format(lang,DB_FILE)))
|
||||||
|
settings = json.load(open('src/{}/{}'.format(lang,SETTINGS_FILE)))
|
||||||
|
pins = db['pins']
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,4 @@
|
||||||
jQuery(document).ready(function(){
|
jQuery(document).ready(function(){
|
||||||
/*var History = window.History;
|
|
||||||
|
|
||||||
var homepage = jQuery('article.page_index').index();
|
|
||||||
var pincount = 40;
|
|
||||||
|
|
||||||
History.Adapter.bind(window,'statechange',function(){
|
|
||||||
var State = History.getState();
|
|
||||||
var url = State.url.replace('http://pi.gadgetoid.com','');
|
|
||||||
|
|
||||||
console.log(State);
|
|
||||||
if( url == '/pinout' )
|
|
||||||
{
|
|
||||||
jQuery('h1').click();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
jQuery('a[href="' + url + '"]').click();
|
|
||||||
}
|
|
||||||
})*/
|
|
||||||
|
|
||||||
$('pre').addClass('prettyprint').addClass('linenums');
|
$('pre').addClass('prettyprint').addClass('linenums');
|
||||||
|
|
||||||
|
@ -30,76 +11,10 @@ jQuery(document).ready(function(){
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
/*jQuery('#pages').cycle({
|
$.gaat({
|
||||||
timeout:0,
|
trackExternal: true,
|
||||||
slideExpr:'article',
|
trackDownload: false,
|
||||||
startingSlide:homepage,
|
trackFTP: false
|
||||||
speed:200,
|
})
|
||||||
containerResize:0
|
|
||||||
});*/
|
|
||||||
|
|
||||||
/*jQuery('.legend li a').on('click',function(e){
|
|
||||||
e.preventDefault();
|
|
||||||
jQuery('nav#gpio li').removeClass('legend active');
|
|
||||||
var title = jQuery(this).attr('title');
|
|
||||||
var url = jQuery(this).attr('href');
|
|
||||||
|
|
||||||
jQuery('span.default').show();
|
|
||||||
jQuery('span.alternate').hide();
|
|
||||||
|
|
||||||
var legend = jQuery(this).parent().attr('class');
|
|
||||||
var page = jQuery('article.page_' + legend).index();
|
|
||||||
var pins = [];
|
|
||||||
if( jQuery(this).parent().data('pins') ){
|
|
||||||
pins = jQuery(this).parent().data('pins').split(',');
|
|
||||||
}
|
|
||||||
|
|
||||||
jQuery('span.' + legend).show().parent().parent().addClass('legend').find('span.default').hide();
|
|
||||||
|
|
||||||
var x = pins.length;
|
|
||||||
while(x--){
|
|
||||||
jQuery('.pin' + pins[x]).addClass('legend');
|
|
||||||
}
|
|
||||||
jQuery('#pages').cycle(page);
|
|
||||||
|
|
||||||
History.pushState({legend:jQuery(this).attr('class'),url:jQuery(this).attr('href')}, 'Raspberry Pi Pinout - ' + title, url)
|
|
||||||
});
|
|
||||||
|
|
||||||
function showPage(object){
|
|
||||||
var url;
|
|
||||||
var page;
|
|
||||||
|
|
||||||
jQuery('span.default').show();
|
|
||||||
jQuery('span.alternate').hide();
|
|
||||||
jQuery('nav#gpio li').removeClass('legend active');
|
|
||||||
|
|
||||||
url = object.attr('href').split('/');
|
|
||||||
url = url[url.length-1];
|
|
||||||
|
|
||||||
page = jQuery('article.' + url).index();
|
|
||||||
|
|
||||||
jQuery('#pages').cycle(page);
|
|
||||||
|
|
||||||
object.parent().addClass('active');
|
|
||||||
title = 'Pin ' + object.find('span.default').text().replace(' ',': ');
|
|
||||||
History.pushState({pin:page,url:object.attr('href')}, title, object.attr('href'));
|
|
||||||
}
|
|
||||||
|
|
||||||
jQuery('nav#gpio ul.bottom a').on('click',function(e){
|
|
||||||
e.preventDefault();showPage(jQuery(this));});
|
|
||||||
jQuery('nav#gpio ul.top a').on('click',function(e){
|
|
||||||
e.preventDefault();showPage(jQuery(this));});
|
|
||||||
|
|
||||||
jQuery('h1').on('click',function(){
|
|
||||||
jQuery('span.default').show();
|
|
||||||
jQuery('span.alternate').hide();
|
|
||||||
jQuery('nav#gpio li').removeClass('legend active');
|
|
||||||
jQuery('#pages').cycle(homepage);
|
|
||||||
History.pushState({pin:homepage,url:'http://pi.gadgetoid.com/pinout'}, 'Raspberry Pi Pinout', '/pinout');
|
|
||||||
});
|
|
||||||
|
|
||||||
url = window.location.href.replace('http://pi.gadgetoid.com/','/');
|
|
||||||
|
|
||||||
jQuery('a[href="' + url + '"]').click();
|
|
||||||
*/
|
|
||||||
});
|
});
|
||||||
|
|
7
serve.py
7
serve.py
|
@ -1,10 +1,15 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
from flask import Flask, send_from_directory
|
from flask import Flask, redirect, send_from_directory
|
||||||
import sys
|
import sys
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
lang = 'en-GB'
|
lang = 'en-GB'
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def redirect_to_pinout():
|
||||||
|
return redirect('/pinout')
|
||||||
|
|
||||||
|
|
||||||
@app.route("/resources/<path:filename>")
|
@app.route("/resources/<path:filename>")
|
||||||
def custom_static(filename):
|
def custom_static(filename):
|
||||||
return send_from_directory(basedir + 'resources/', filename)
|
return send_from_directory(basedir + 'resources/', filename)
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"default_desc":"The comprehensive Raspberry Pi GPIO Pinout guide for the original Raspberry Pi, B+ and Pi 2",
|
||||||
|
"default_title":"Raspberry Pi GPIO Pinout - Pi 1, B+, Pi 2",
|
||||||
|
"title_suffix":" at Raspberry Pi GPIO Pinout"
|
||||||
|
}
|
Loading…
Reference in New Issue