172 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| import os
 | |
| import uuid
 | |
| #from datetime import datetime
 | |
| #import pytz
 | |
| from flask import Flask, url_for, render_template, send_from_directory, jsonify, make_response
 | |
| from flaskext.markdown import Markdown
 | |
| import markdown
 | |
| import markdown.extensions.fenced_code
 | |
| import markdown.extensions.codehilite
 | |
| import markdown.extensions.toc
 | |
| from markdown.extensions.toc import TocExtension
 | |
| from pygments.formatters import HtmlFormatter
 | |
| 
 | |
| app = Flask(__name__)
 | |
| Markdown(app)
 | |
| 
 | |
| def make_tree(path="templates/content"):
 | |
|     if '/' in path:
 | |
|         tree = dict(name=path, children=[], type="directory")
 | |
|     else:
 | |
|         pass
 | |
|     try: lst = os.listdir(path)
 | |
|     except OSError:
 | |
|         pass #ignore errors
 | |
|     else:
 | |
|         lst.sort()
 | |
|         for name in lst:
 | |
|             fn = os.path.join(path, name)
 | |
|             if os.path.isdir(fn) and not fn.endswith(".git"):
 | |
|                 tree['children'].append(make_tree(fn))
 | |
|             else:
 | |
|                 if fn.endswith('.md') and not name == "README.md":
 | |
|                     tree['children'].append(dict(name=fn))
 | |
|     return tree
 | |
| 
 | |
| def cut_path_tree(tree, subdir, file_ending):
 | |
|     for key, val in tree.items():
 | |
|         if isinstance(val, list):
 | |
|             for item in val:
 | |
|                 item["name"] = item["name"][len(subdir):]
 | |
|                 if item["name"].endswith(file_ending):
 | |
|                     item["name"] = item["name"][:-len(file_ending)]
 | |
|                 if isinstance(item, dict):
 | |
|                     cut_path_tree(item, subdir, file_ending)
 | |
|     return tree
 | |
| 
 | |
| def cut_filetype_tree(tree, filetype):
 | |
|     for key, val in tree.items():
 | |
|         if isinstance(val, list):
 | |
|             for item in val:
 | |
|                 if item["name"].endswith(filetype):
 | |
|                     item["name"] = item["name"][:-len(filetype)]
 | |
|                     if isinstance(item, dict):
 | |
|                         cut_filetype_tree(item, filetype)
 | |
|     return tree
 | |
| 
 | |
| def list_files(path):
 | |
|     doc_files = []
 | |
|     for root, dirs, files in os.walk(path):
 | |
|         for file in files:
 | |
|             if file.endswith(".md") and not ".git" in root:
 | |
|                 doc_files.append(os.path.join(root,file))
 | |
|     return doc_files
 | |
| #
 | |
| #def dir_structure():
 | |
| #    for root, dirs, files in os.walk("./templates/content"):
 | |
| #        if len(files) != 0:
 | |
| #            print(root.split('/')[3:],  [file[:-3] for file in files if file.endswith('.md')])
 | |
| #
 | |
| #def test_def():
 | |
| #    for i,line in enumerate(l):
 | |
| #        if len(line[0]) > 0:
 | |
| #            dic[str(line[0][-1])] = line[-1]
 | |
| #            result = {}
 | |
| #            curr = result
 | |
| #            for p in line[0]:
 | |
| #                curr = curr.setdefault(p, {})
 | |
| #def other_test_def():
 | |
| #    for root, dirs, files in os.walk("templates/content"):
 | |
| #    #print(root[18:].split('/')[0])
 | |
| ##    print(root, files)
 | |
| #        key = root[18:].split('/')[0]
 | |
| #        d[key] = [file[:-3] for file in files]
 | |
| 
 | |
| def build_index(path, file_ending):
 | |
|     searchable = dict(index=[]) 
 | |
|     file_list = list_files(path) 
 | |
|     for item in file_list:
 | |
|         if item.endswith(file_ending):
 | |
|             with open(item, 'r') as _f:
 | |
|                 data = _f.readlines()
 | |
|                 data[0] = data[0].strip('# \n')
 | |
|                 #searchable[data[0]] = [''.join(data), item[len(path):-len(file_ending)]]
 | |
|                 searchable["index"].append(dict(uri=item[len(path):-len(file_ending)] + '.html', title=data[0],tags=[],content=''.join(data), description=""))
 | |
|                 #searchable[str(uuid.uuid1())] = (dict(href=item[len(path):-len(file_ending)], title=data[0],tags=[],content=''.join(data)))
 | |
|         if isinstance(item, dict):
 | |
|            build_index(item)
 | |
|     return searchable
 | |
| 
 | |
| @app.route('/index.json')
 | |
| def index():
 | |
|     searchable = build_index("templates/content", ".md")
 | |
|     #searchable = dict(index=[ dict(title="Smp_000020", uri="/geneexp/sm/Smp_000020.1/",content="bifunctional protein NCOAT", tags=[], description=""), dict(title="Smp_000030",uri="/geneexp/sm/Smp_000030.1/",content="26s proteasome regulatory particle subunit", tags=[], description="")])
 | |
|     response = make_response(searchable)
 | |
|     response.headers["Content-Type"] = "application/json"
 | |
|     #response.headers["Content-Encoding"] = "gzip"
 | |
|     response.cache_control.max_age = 420
 | |
|     return response
 | |
| 
 | |
| @app.route('/', defaults={'path': 'README'})
 | |
| @app.route('/<path:path>.html')
 | |
| def content(path="README"):
 | |
|     with open(os.path.join(app.root_path, f'templates/content/{path}.md'), "r") as _f:
 | |
|         md_file = _f.read()
 | |
|         if not md_file.startswith("[TOC]"):
 | |
|             md_file = "[TOC]\n" + md_file
 | |
|     md_template_string = markdown.markdown(md_file, extensions=["fenced_code", "codehilite", "toc", TocExtension(toc_class="column column-3", title=""), "mdx_math"],
 | |
|             extension_configs={"mdx_math": {"enable_dollar_delimiter": True}})
 | |
|     formatter = HtmlFormatter(style="material", full=True, cssclass="codehilite")
 | |
|     css_string = formatter.get_style_defs()
 | |
|     md_css_string = "<style>" + css_string + "</style>"
 | |
|     md_template = md_css_string + md_template_string
 | |
|     #return md_templateresponse = make_response(searchable)
 | |
|     res = render_template("documentation.html", md_doc=md_template, tree=
 | |
|             cut_path_tree(
 | |
|             make_tree("templates/content"), "templates/content", ".md")
 | |
|             )
 | |
|     response = make_response(res)
 | |
|     response.headers["Content-Type"]: "text/html; charset=utf-8"
 | |
|     return response
 | |
| 
 | |
| 
 | |
| #@app.route('/blog/<blog_item>/index.html')
 | |
| #def blog(blog_item, _date=meta_data):
 | |
| #    return render_template(f"blog/{blog_item}/index.html", _date=meta_data[blog_item], )
 | |
| 
 | |
| #@app.route("/about.html")
 | |
| #def about():
 | |
| #    return render_template("about.html")
 | |
| #
 | |
| #@app.route("/contact.html")
 | |
| #def contact():
 | |
| #    return render_template("contact.html")
 | |
| 
 | |
| 
 | |
| @app.route('/favicon.ico')
 | |
| def favicon():
 | |
|     return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico')
 | |
| 
 | |
| #@app.errorhandler(404)
 | |
| #def page_not_found(_error):
 | |
| #    return render_template("/status_code/404.html"), 404
 | |
| #
 | |
| #@app.errorhandler(400)
 | |
| #def bad_request(_error):
 | |
| #    return render_template("/status_code/400.html"), 400
 | |
| #
 | |
| #@app.errorhandler(500)
 | |
| #def internal_server_error(_error):
 | |
| #    return render_template("/status_code/500.html"), 500
 | |
| 
 | |
| with app.test_request_context():
 | |
|     #print(url_for("content"))
 | |
|     #print(url_for("about"))
 | |
| #    print(url_for("contact"))
 | |
|     #print(url_for("rss"))
 | |
|     #print(url_for("static", filename="stylesheet.css"))
 | |
|     #print(meta_data)
 | |
|     print(url_for("content", md_file="enumeration/windows/bloodhound"))
 |