rest_api.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import logging
  2. from base64 import b64encode
  3. from copy import deepcopy
  4. from os import environ, urandom
  5. from flask import Flask, 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. logging.basicConfig(level=environ.get("TXL_LOGLEVEL", logging.INFO))
  10. def create_app():
  11. flask_env = environ.get("TXL_APP_MODE", "production")
  12. app = Flask(__name__)
  13. app.config.update({
  14. "ENV": flask_env,
  15. "SECRET_KEY": environ.get("TXL_FLASK_SECRET", b64encode(urandom(64))),
  16. "JSON_AS_ASCII": False,
  17. "JSONIFY_PRETTYPRINT_REGULAR": True,
  18. })
  19. return app
  20. app = create_app()
  21. @app.route("/", methods=["GET"])
  22. def index():
  23. return render_template("index.html", languages=list_tables())
  24. @app.route("/health", methods=["GET"])
  25. def health_check():
  26. return "I'm alive!\n"
  27. @app.route("/languages", methods=["GET"])
  28. def list_languages():
  29. return jsonify(list_tables())
  30. @app.route("/table/<lang>")
  31. def dump_table(lang):
  32. """
  33. Dump parsed transliteration table for a language.
  34. """
  35. tbl = deepcopy(load_table(lang))
  36. for sec_name in ("roman_to_script", "script_to_roman"):
  37. if sec_name in tbl:
  38. for hname, fn_defs in tbl[sec_name].get("hooks", {}).items():
  39. tbl[sec_name]["hooks"][hname] = [
  40. (fn.__name__, kw) for (fn, kw) in fn_defs]
  41. return jsonify(tbl)
  42. @app.route("/options/<lang>", methods=["GET"])
  43. def get_options(lang):
  44. """
  45. Get extra options for a table.
  46. """
  47. tbl = load_table(lang)
  48. return jsonify(tbl.get("options", []))
  49. @app.route("/trans", methods=["POST"])
  50. def transliterate_req():
  51. lang = request.form["lang"]
  52. in_txt = request.form["text"]
  53. capitalize = request.form.get("capitalize", False)
  54. t_dir = request.form.get("t_dir", "s2r")
  55. if t_dir not in ("s2r", "r2s"):
  56. return f"Invalid direction: {t_dir}", 400
  57. if not len(in_txt):
  58. return ("No input text provided! ", 400)
  59. options = request.form.get("options", {})
  60. logger.debug(f"Extra options: {options}")
  61. try:
  62. out, warnings = transliterate(in_txt, lang, t_dir, options, capitalize)
  63. except (NotImplementedError, ValueError) as e:
  64. return (str(e), 400)
  65. return {"output": out, "warnings": warnings}