diff --git a/.gitignore b/.gitignore index 27009d8..4c2d777 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /venv __pycache__ +/data/doc diff --git a/requirements.txt b/requirements.txt index 97e4624..865daa4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,41 @@ -click==8.1.3 -colorama==0.4.5 -Flask==2.2.2 -importlib-metadata==4.12.0 -itsdangerous==2.1.2 -Jinja2==3.1.2 -MarkupSafe==2.1.1 -Werkzeug==2.2.2 -zipp==3.8.1 +alabaster==0.7.12 +Babel==2.10.3 +certifi==2022.6.15 +charset-normalizer==2.1.0 +click==8.1.3 +colorama==0.4.5 +docutils==0.17.1 +Flask==2.2.2 +idna==3.3 +imagesize==1.4.1 +importlib-metadata==4.12.0 +itsdangerous==2.1.2 +Jinja2==3.1.2 +linkify-it-py==2.0.0 +markdown-it-py==2.1.0 +MarkupSafe==2.1.1 +mdit-py-plugins==0.3.0 +mdurl==0.1.1 +myst-parser==0.18.0 +packaging==21.3 +pkg_resources==0.0.0 +Pygments==2.12.0 +pyparsing==3.0.9 +pytz==2022.2 +PyYAML==6.0 +requests==2.28.1 +snowballstemmer==2.2.0 +Sphinx==5.1.1 +sphinx-rtd-theme==1.0.0 +sphinxcontrib-applehelp==1.0.2 +sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-htmlhelp==2.0.0 +sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-svg2pdfconverter==1.2.0 +typing_extensions==4.3.0 +uc-micro-py==1.0.1 +urllib3==1.26.11 +Werkzeug==2.2.2 +zipp==3.8.1 diff --git a/src/api/document.py b/src/api/document.py index 0d1dc25..dc52911 100644 --- a/src/api/document.py +++ b/src/api/document.py @@ -1,8 +1,18 @@ from flask import Blueprint, request +from markupsafe import escape +from web_utils.get_arg import get_arg + +from data.document import Document bp = Blueprint('document', __name__, url_prefix='/api/doc') @bp.route('/build') def build(): - return '

Building '+request.args.get('doc')+'@'+request.args.get('branch')+' ...

' + doc_name = get_arg('doc') + branch = get_arg('branch', 'master') + + doc = Document(doc_name, branch) + output = doc.build() + + return output.replace('\n', '
') diff --git a/src/app.py b/src/app.py index 85069a7..be16c7e 100644 --- a/src/app.py +++ b/src/app.py @@ -1,10 +1,15 @@ +import os from flask import Flask +import data.document def create_app(): - app = Flask(__name__) + app = Flask(__name__) + + src_path = os.path.dirname(os.path.realpath(__file__)) + data.document.set_document_root(os.path.realpath(src_path+'/../data/doc')) - from api import document - app.register_blueprint(document.bp) + from api import document + app.register_blueprint(document.bp) - return app + return app diff --git a/src/data/document.py b/src/data/document.py new file mode 100644 index 0000000..d4ada63 --- /dev/null +++ b/src/data/document.py @@ -0,0 +1,43 @@ +import os +from subprocess import Popen, PIPE, STDOUT + +document_root = None + +class Document: + def __init__(self, doc_name, branch = 'master'): + self.doc_name = doc_name + self.branch = branch + + #print(get_document_root()) + #print(doc_name) + #print(branch) + + doc_path = os.path.realpath(get_document_root()+'/'+doc_name+'/'+branch) + if not doc_path.startswith(get_document_root()): + raise Exception("Invalid document path for '"+doc_name+"'@'"+branch) + + self.doc_path = doc_path + + def build(self): + #venv_path = os.getenv('VIRTUAL_ENV') + cmd = "sphinx-build -M html \""+self.doc_path + "/source\" \""+self.doc_path+"/build\"" + p = Popen(cmd, stdout = PIPE, stderr = STDOUT, shell = True) + outputStr = "" + for line in p.stdout: + outputStr += line.decode() + + p.wait() + + if p.returncode != 0: + raise Exception("Build failed ("+str(p.returncode)+")\n"+outputStr) + + return outputStr + +def set_document_root(dir): + global document_root + document_root = dir + +def get_document_root(): + global document_root + return document_root + diff --git a/src/web_utils/get_arg.py b/src/web_utils/get_arg.py new file mode 100644 index 0000000..063d1cd --- /dev/null +++ b/src/web_utils/get_arg.py @@ -0,0 +1,11 @@ +from flask import request + +def get_arg(arg_name, default_value = None): + result = request.args.get(arg_name) + if result == None: + if default_value == None: + raise Exception("Missing query string parameter '"+arg_name+"'") + else: + return default_value + return result +