#!/usr/bin/env python3 import sys import sqlite3 import mistune import argparse class SqliteMarkdownRenderer(mistune.Renderer): def __init__(self, conn): super(SqliteMarkdownRenderer, self).__init__() self.conn = conn def block_code(self, code, lang): if lang and lang.strip().lower() == 'sql': # remove comment lines core = code.strip() code = '\n'.join( [line.strip() for line in code.split('\n') if not (line.strip().startswith('#') or not line.strip())]) core = code.strip() sys.stderr.write("executing: {}\n".format(code.strip())) cursor = self.conn.cursor() result = cursor.execute(code) ret = "" if cursor.description is None: ret = "(empty result)" else: ret += "
{} | \n".format(k[0]) ret += "|||
---|---|---|---|
(no rows returned) | |||
{} | \n'.format(v, v) elif type(v) == str and v.startswith("10."): ret += '{} | \n'.format(v, v) elif type(v) == str and v.startswith("PMC") and v[3:].isdigit(): ret += '{} | \n'.format(v, v) else: ret += '{} | \n'.format(v) ret += "
QUERY: {}\n
' + ret + "
" + code + "
\n"
def main():
parser = argparse.ArgumentParser()
parser.add_argument("markdown_file",
default=sys.stdin, type=argparse.FileType('rt'))
parser.add_argument("sqlite_db_path",
type=str)
args = parser.parse_args()
conn = sqlite3.connect(args.sqlite_db_path)
renderer = SqliteMarkdownRenderer(conn)
markdown = mistune.Markdown(renderer=renderer)
print(markdown(args.markdown_file.read()))
if __name__ == '__main__':
main()