rest_api.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import logging
  2. from base64 import b64encode
  3. from copy import deepcopy
  4. from os import environ, urandom
  5. from flask import Flask, Response, jsonify, render_template, request
  6. from scriptshifter.tables import list_tables, load_table
  7. from scriptshifter.trans import transliterate
  8. logger = logging.getLogger(__name__)
  9. def create_app():
  10. flask_env = environ.get("TXL_APP_MODE", "production")
  11. app = Flask(__name__)
  12. app.config.update({
  13. "ENV": flask_env,
  14. "SECRET_KEY": environ.get("TXL_FLASK_SECRET", b64encode(urandom(64))),
  15. # Prod requires the application to be behind a web server, or static
  16. # files won't be served directly by Flask using this option.
  17. "USE_X_SENDFILE": flask_env == "production",
  18. "JSON_AS_ASCII": False,
  19. "JSONIFY_PRETTYPRINT_REGULAR": True,
  20. })
  21. return app
  22. app = create_app()
  23. @app.route("/", methods=["GET"])
  24. def index():
  25. return render_template("index.html", languages=list_tables())
  26. @app.route("/health", methods=["GET"])
  27. def health_check():
  28. return "I'm alive!\n"
  29. @app.route("/languages", methods=["GET"])
  30. def list_languages():
  31. return jsonify(list_tables())
  32. @app.route("/table/<lang>")
  33. def dump_table(lang):
  34. """
  35. Dump parsed transliteration table for a language.
  36. """
  37. tbl = deepcopy(load_table(lang))
  38. for sec_name in ("roman_to_script", "script_to_roman"):
  39. if sec_name in tbl:
  40. for hname, fn_defs in tbl[sec_name].get("hooks", {}).items():
  41. tbl[sec_name]["hooks"][hname] = [
  42. (fn.__name__, kw) for (fn, kw) in fn_defs]
  43. return jsonify(tbl)
  44. @app.route("/transliterate", methods=["POST"])
  45. def transliterate_form():
  46. """ UI version of the `trans` endpoint. Passes everything via form. """
  47. return transliterate_req(
  48. request.form["lang"], request.form.get("r2s", False))
  49. @app.route("/trans/<lang>/r2s", methods=["POST"], defaults={"r2s": True})
  50. @app.route("/trans/<lang>", methods=["POST"])
  51. def transliterate_req(lang, r2s=False):
  52. in_txt = request.form["text"]
  53. capitalize = request.form.get("capitalize", False)
  54. if not len(in_txt):
  55. return ("No input text provided! ", 400)
  56. try:
  57. out = transliterate(in_txt, lang, r2s, capitalize)
  58. except (NotImplementedError, ValueError) as e:
  59. return (str(e), 400)
  60. rsp = Response(out, mimetype="text/plain")
  61. rsp.headers["Content-Type"] = "text/plain; charset=utf-8"
  62. return rsp