Last active
June 3, 2022 04:20
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- 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><table class="highlight tab-size js-file-line-container"><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><pre><span class="pl-pds">'</span></span>)[<span class="pl-c1">1</span>].split(<span class="pl-s"><span class="pl-pds">'</span></pre><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></table><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><tr><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><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>"></td><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><td id="LC<span class="pl-c1">{line_number}</span>" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">{line}</span></td><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></tr><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">></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> <filename> 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