Skip to content

Instantly share code, notes, and snippets.

@gaqzi
Last active June 3, 2022 04:20
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gaqzi/687493193c6cf1003b599c981c393d91 to your computer and use it in GitHub Desktop.
Save gaqzi/687493193c6cf1003b599c981c393d91 to your computer and use it in GitHub Desktop.
A way to re-use the GitHub syntax highlighter for your own site. Send it through their API, use their stylesheet and done.
#!/usr/bin/env python
# Takes the path to a local file and formats it using GitHub's raw Markdown API,
# then converts the returned HTML to their table format.
from pathlib import Path
from sys import argv
import requests # $ pip install requests
def make_markdown_from_source_file(file):
suffix = Path(file).suffix.replace('.', '', 1)
with open(file, 'r') as f:
return '```{suffix}\n{body}```'.format(suffix=suffix, body=f.read())
def render_markdown(markdown):
return requests.post(
'https://api.github.com/markdown/raw',
markdown,
headers={
'content-type': 'text/x-markdown'
}
).text
def convert_to_table_layout(rendered_markdown):
ret = ['<table class="highlight tab-size js-file-line-container">']
line_number = 1
body = rendered_markdown.split('<pre>')[1].split('</pre>')[0]
for line in body.split('\n'):
ret.append(_add_line(line, line_number))
line_number += 1
ret.append('</table>')
return '\n'.join(ret)
def _add_line(line, line_number):
return (
'<tr>'
'<td id="L{line_number}" class="blob-num js-line-number" data-line-number="{line_number}"></td>'
'<td id="LC{line_number}" class="blob-code blob-code-inner js-file-line">{line}</td>'
'</tr>'
).format(line_number=line_number, line=line)
if __name__ == '__main__':
if not len(argv) > 1:
print('{0} <filename> to highlight'.format(__file__))
exit(1)
file = Path(argv[1])
if not file.exists():
print("'{0}' does not exist.".format(file))
print(convert_to_table_layout(render_markdown(make_markdown_from_source_file(file))))
<!-- This is gfm-formatter.py run through itself -->
<html>
<head>
<!-- you'll need to style fonts etc yourself -->
<link rel="stylesheet" type="text/css" href="github-light.css"> <!-- from: https://github.com/primer/github-syntax-light/blob/master/lib/github-light.css -->
</head>
<body>
<table class="highlight tab-size js-file-line-container">
<tr><td id="L1" class="blob-num js-line-number" data-line-number="1"></td><td id="LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">#</span>!/usr/bin/env python</span></td></tr>
<tr><td id="L2" class="blob-num js-line-number" data-line-number="2"></td><td id="LC2" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L3" class="blob-num js-line-number" data-line-number="3"></td><td id="LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">from</span> pathlib <span class="pl-k">import</span> Path</td></tr>
<tr><td id="L4" class="blob-num js-line-number" data-line-number="4"></td><td id="LC4" class="blob-code blob-code-inner js-file-line"><span class="pl-k">from</span> sys <span class="pl-k">import</span> argv</td></tr>
<tr><td id="L5" class="blob-num js-line-number" data-line-number="5"></td><td id="LC5" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L6" class="blob-num js-line-number" data-line-number="6"></td><td id="LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> requests</td></tr>
<tr><td id="L7" class="blob-num js-line-number" data-line-number="7"></td><td id="LC7" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L8" class="blob-num js-line-number" data-line-number="8"></td><td id="LC8" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L9" class="blob-num js-line-number" data-line-number="9"></td><td id="LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">read_markdown_from_source_file</span>(<span class="pl-smi">file</span>):</td></tr>
<tr><td id="L10" class="blob-num js-line-number" data-line-number="10"></td><td id="LC10" class="blob-code blob-code-inner js-file-line"> suffix <span class="pl-k">=</span> Path(<span class="pl-v">file</span>).suffix.replace(<span class="pl-s"><span class="pl-pds">'</span>.<span class="pl-pds">'</span></span>, <span class="pl-s"><span class="pl-pds">'</span><span class="pl-pds">'</span></span>, <span class="pl-c1">1</span>)</td></tr>
<tr><td id="L11" class="blob-num js-line-number" data-line-number="11"></td><td id="LC11" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L12" class="blob-num js-line-number" data-line-number="12"></td><td id="LC12" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">with</span> <span class="pl-c1">open</span>(<span class="pl-v">file</span>, <span class="pl-s"><span class="pl-pds">'</span>r<span class="pl-pds">'</span></span>) <span class="pl-k">as</span> f:</td></tr>
<tr><td id="L13" class="blob-num js-line-number" data-line-number="13"></td><td id="LC13" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-s"><span class="pl-pds">'</span>```<span class="pl-c1">{suffix}</span><span class="pl-cce">\n</span><span class="pl-c1">{body}</span>```<span class="pl-pds">'</span></span>.format(<span class="pl-v">suffix</span><span class="pl-k">=</span>suffix, <span class="pl-v">body</span><span class="pl-k">=</span>f.read())</td></tr>
<tr><td id="L14" class="blob-num js-line-number" data-line-number="14"></td><td id="LC14" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L15" class="blob-num js-line-number" data-line-number="15"></td><td id="LC15" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L16" class="blob-num js-line-number" data-line-number="16"></td><td id="LC16" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">render_markdown</span>(<span class="pl-smi">markdown</span>):</td></tr>
<tr><td id="L17" class="blob-num js-line-number" data-line-number="17"></td><td id="LC17" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> requests.post(</td></tr>
<tr><td id="L18" class="blob-num js-line-number" data-line-number="18"></td><td id="LC18" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">'</span>https://api.github.com/markdown/raw<span class="pl-pds">'</span></span>,</td></tr>
<tr><td id="L19" class="blob-num js-line-number" data-line-number="19"></td><td id="LC19" class="blob-code blob-code-inner js-file-line"> markdown,</td></tr>
<tr><td id="L20" class="blob-num js-line-number" data-line-number="20"></td><td id="LC20" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">headers</span><span class="pl-k">=</span>{</td></tr>
<tr><td id="L21" class="blob-num js-line-number" data-line-number="21"></td><td id="LC21" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">'</span>content-type<span class="pl-pds">'</span></span>: <span class="pl-s"><span class="pl-pds">'</span>text/x-markdown<span class="pl-pds">'</span></span></td></tr>
<tr><td id="L22" class="blob-num js-line-number" data-line-number="22"></td><td id="LC22" class="blob-code blob-code-inner js-file-line"> }</td></tr>
<tr><td id="L23" class="blob-num js-line-number" data-line-number="23"></td><td id="LC23" class="blob-code blob-code-inner js-file-line"> ).text</td></tr>
<tr><td id="L24" class="blob-num js-line-number" data-line-number="24"></td><td id="LC24" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L25" class="blob-num js-line-number" data-line-number="25"></td><td id="LC25" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L26" class="blob-num js-line-number" data-line-number="26"></td><td id="LC26" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">convert_to_table_layout</span>(<span class="pl-smi">rendered_markdown</span>):</td></tr>
<tr><td id="L27" class="blob-num js-line-number" data-line-number="27"></td><td id="LC27" class="blob-code blob-code-inner js-file-line"> ret <span class="pl-k">=</span> [<span class="pl-s"><span class="pl-pds">'</span>&lt;table class="highlight tab-size js-file-line-container"&gt;<span class="pl-pds">'</span></span>]</td></tr>
<tr><td id="L28" class="blob-num js-line-number" data-line-number="28"></td><td id="LC28" class="blob-code blob-code-inner js-file-line"> line_number <span class="pl-k">=</span> <span class="pl-c1">1</span></td></tr>
<tr><td id="L29" class="blob-num js-line-number" data-line-number="29"></td><td id="LC29" class="blob-code blob-code-inner js-file-line"> body <span class="pl-k">=</span> rendered_markdown.split(<span class="pl-s"><span class="pl-pds">'</span>&lt;pre&gt;<span class="pl-pds">'</span></span>)[<span class="pl-c1">1</span>].split(<span class="pl-s"><span class="pl-pds">'</span>&lt;/pre&gt;<span class="pl-pds">'</span></span>)[<span class="pl-c1">0</span>]</td></tr>
<tr><td id="L30" class="blob-num js-line-number" data-line-number="30"></td><td id="LC30" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> line <span class="pl-k">in</span> body.split(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span>):</td></tr>
<tr><td id="L31" class="blob-num js-line-number" data-line-number="31"></td><td id="LC31" class="blob-code blob-code-inner js-file-line"> ret.append(_add_line(line, line_number))</td></tr>
<tr><td id="L32" class="blob-num js-line-number" data-line-number="32"></td><td id="LC32" class="blob-code blob-code-inner js-file-line"> line_number <span class="pl-k">+=</span> <span class="pl-c1">1</span></td></tr>
<tr><td id="L33" class="blob-num js-line-number" data-line-number="33"></td><td id="LC33" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L34" class="blob-num js-line-number" data-line-number="34"></td><td id="LC34" class="blob-code blob-code-inner js-file-line"> ret.append(<span class="pl-s"><span class="pl-pds">'</span>&lt;/table&gt;<span class="pl-pds">'</span></span>)</td></tr>
<tr><td id="L35" class="blob-num js-line-number" data-line-number="35"></td><td id="LC35" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L36" class="blob-num js-line-number" data-line-number="36"></td><td id="LC36" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span>.join(ret)</td></tr>
<tr><td id="L37" class="blob-num js-line-number" data-line-number="37"></td><td id="LC37" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L38" class="blob-num js-line-number" data-line-number="38"></td><td id="LC38" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L39" class="blob-num js-line-number" data-line-number="39"></td><td id="LC39" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">_add_line</span>(<span class="pl-smi">line</span>, <span class="pl-smi">line_number</span>):</td></tr>
<tr><td id="L40" class="blob-num js-line-number" data-line-number="40"></td><td id="LC40" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> (</td></tr>
<tr><td id="L41" class="blob-num js-line-number" data-line-number="41"></td><td id="LC41" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">'</span>&lt;tr&gt;<span class="pl-pds">'</span></span></td></tr>
<tr><td id="L42" class="blob-num js-line-number" data-line-number="42"></td><td id="LC42" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">'</span>&lt;td id="L<span class="pl-c1">{line_number}</span>" class="blob-num js-line-number" data-line-number="<span class="pl-c1">{line_number}</span>"&gt;&lt;/td&gt;<span class="pl-pds">'</span></span></td></tr>
<tr><td id="L43" class="blob-num js-line-number" data-line-number="43"></td><td id="LC43" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">'</span>&lt;td id="LC<span class="pl-c1">{line_number}</span>" class="blob-code blob-code-inner js-file-line"&gt;<span class="pl-c1">{line}</span>&lt;/td&gt;<span class="pl-pds">'</span></span></td></tr>
<tr><td id="L44" class="blob-num js-line-number" data-line-number="44"></td><td id="LC44" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">'</span>&lt;/tr&gt;<span class="pl-pds">'</span></span></td></tr>
<tr><td id="L45" class="blob-num js-line-number" data-line-number="45"></td><td id="LC45" class="blob-code blob-code-inner js-file-line"> ).format(<span class="pl-v">line_number</span><span class="pl-k">=</span>line_number, <span class="pl-v">line</span><span class="pl-k">=</span>line)</td></tr>
<tr><td id="L46" class="blob-num js-line-number" data-line-number="46"></td><td id="LC46" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L47" class="blob-num js-line-number" data-line-number="47"></td><td id="LC47" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L48" class="blob-num js-line-number" data-line-number="48"></td><td id="LC48" class="blob-code blob-code-inner js-file-line"><span class="pl-k">if</span> <span class="pl-c1">__name__</span> <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>__main__<span class="pl-pds">'</span></span>:</td></tr>
<tr><td id="L49" class="blob-num js-line-number" data-line-number="49"></td><td id="LC49" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> <span class="pl-c1">len</span>(argv) <span class="pl-k">&gt;</span> <span class="pl-c1">1</span>:</td></tr>
<tr><td id="L50" class="blob-num js-line-number" data-line-number="50"></td><td id="LC50" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-c1">{0}</span> &lt;filename&gt; to highlight<span class="pl-pds">'</span></span>.format(<span class="pl-c1">__file__</span>))</td></tr>
<tr><td id="L51" class="blob-num js-line-number" data-line-number="51"></td><td id="LC51" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">exit</span>(<span class="pl-c1">1</span>)</td></tr>
<tr><td id="L52" class="blob-num js-line-number" data-line-number="52"></td><td id="LC52" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L53" class="blob-num js-line-number" data-line-number="53"></td><td id="LC53" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span> <span class="pl-k">=</span> Path(argv[<span class="pl-c1">1</span>])</td></tr>
<tr><td id="L54" class="blob-num js-line-number" data-line-number="54"></td><td id="LC54" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> <span class="pl-v">file</span>.exists():</td></tr>
<tr><td id="L55" class="blob-num js-line-number" data-line-number="55"></td><td id="LC55" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">"</span>'<span class="pl-c1">{0}</span>' does not exist.<span class="pl-pds">"</span></span>.format(<span class="pl-v">file</span>))</td></tr>
<tr><td id="L56" class="blob-num js-line-number" data-line-number="56"></td><td id="LC56" class="blob-code blob-code-inner js-file-line"></td></tr>
<tr><td id="L57" class="blob-num js-line-number" data-line-number="57"></td><td id="LC57" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(</td></tr>
<tr><td id="L58" class="blob-num js-line-number" data-line-number="58"></td><td id="LC58" class="blob-code blob-code-inner js-file-line"> convert_to_table_layout(</td></tr>
<tr><td id="L59" class="blob-num js-line-number" data-line-number="59"></td><td id="LC59" class="blob-code blob-code-inner js-file-line"> render_markdown(</td></tr>
<tr><td id="L60" class="blob-num js-line-number" data-line-number="60"></td><td id="LC60" class="blob-code blob-code-inner js-file-line"> read_markdown_from_source_file(<span class="pl-v">file</span>)</td></tr>
<tr><td id="L61" class="blob-num js-line-number" data-line-number="61"></td><td id="LC61" class="blob-code blob-code-inner js-file-line"> )</td></tr>
<tr><td id="L62" class="blob-num js-line-number" data-line-number="62"></td><td id="LC62" class="blob-code blob-code-inner js-file-line"> )</td></tr>
<tr><td id="L63" class="blob-num js-line-number" data-line-number="63"></td><td id="LC63" class="blob-code blob-code-inner js-file-line"> )</td></tr>
</table>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment