1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- try:
- from urllib.request import urlopen
- except ImportError:
- from urllib import urlopen
- import os
- import io
- from docutils.parsers.rst import directives
- from pelican.rstdirectives import Pygments
- def fetch(gid, filename, typ):
- if not os.path.exists('.gists'):
- os.mkdir('.gists')
- key = os.path.join('.gists', ("%s/%s/%s" % (typ, gid, filename)).replace('/', ';'))
- if os.path.isfile(key):
- print('LOAD-CACHED:', key)
- return io.open(key, encoding='utf8').read()
- else:
- if typ == 'gist':
- url = 'https://gist.githubusercontent.com/%s/raw/%s' % (gid, filename)
- elif typ == 'github':
- url = 'https://raw.githubusercontent.com/%s/%s' % (gid, filename)
- else:
- raise RuntimeError(typ)
- print('FETCHING:', url)
- fp = urlopen(url)
- if fp.getcode() != 200:
- print('FAILED TO FETCH:', url)
- print(' status code:', fp.getcode())
- print(' response:')
- try:
- print(fp.read())
- finally:
- raise SystemExit()
- data = fp.read()
- with open(key, 'wb') as fh:
- fh.write(data)
- return data.decode('utf8')
- class Gist(Pygments):
- """ Embed Github Gist Snippets in rst text
- GIST_ID and FILENAME are required.
- Usage:
- .. gist:: GIST_ID FILENAME
- """
- required_arguments = 1
- optional_arguments = 2
- has_content = False
- gist_type = 'gist'
- def run(self):
- gist = self.arguments[0]
- filename = self.arguments[1] if len(self.arguments) > 1 else ''
- language = self.arguments[2] if len(self.arguments) > 2 else None
- self.arguments = [language]
- self.content = fetch(gist, filename, self.gist_type).splitlines()
- return super(Gist, self).run()
- class Github(Gist):
- gist_type = 'github'
- def register():
- directives.register_directive('gist', Gist)
- directives.register_directive('github', Github)
|