doc_demo.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. """
  2. 文档中示例代码在线运行
  3. ^^^^^^^^^^^^^^^^
  4. """
  5. from pywebio import start_server
  6. from pywebio.input import *
  7. from pywebio.output import *
  8. from pywebio.session import *
  9. from os import path, listdir
  10. from functools import partial
  11. here_dir = path.dirname(path.abspath(__file__))
  12. def gen_snippets(code):
  13. code = code.replace('# ..demo-only', '')
  14. code = '\n'.join(i for i in code.splitlines() if '# ..doc-only' not in i)
  15. parts = code.split('\n## ----\n')
  16. for p in parts:
  17. yield p.strip('\n')
  18. def run_code(code, scope):
  19. with use_scope(scope):
  20. exec(code, globals())
  21. IMPORT_CODE = """from pywebio.input import *
  22. from pywebio.output import *
  23. from pywebio.session import *
  24. """
  25. def copytoclipboard(code):
  26. run_js("navigator.clipboard.writeText(text)", text=code)
  27. toast('已复制')
  28. def handle_code(code, title):
  29. if title:
  30. put_markdown('## %s' % title)
  31. for p in gen_snippets(code):
  32. with use_scope() as scope:
  33. put_code(p, 'python')
  34. put_buttons(['运行', '复制代码'], onclick=[
  35. partial(run_code, code=p, scope=scope),
  36. partial(copytoclipboard, code=IMPORT_CODE + p)
  37. ])
  38. put_markdown('----')
  39. hold()
  40. def get_app():
  41. app = {}
  42. try:
  43. demos = listdir(path.join(here_dir, 'doc_domes'))
  44. except Exception:
  45. demos = []
  46. demo_infos = []
  47. for name in demos:
  48. code = open(path.join(here_dir, 'doc_domes', name)).read()
  49. title, code = code.split('\n\n', 1)
  50. app[name] = partial(handle_code, code=code, title=title)
  51. demo_infos.append([name, title])
  52. index_html = "<ul>"
  53. for name, title in demo_infos:
  54. index_html += '''<li> <a href="javascript:WebIO.openApp('{name}', true)">{name}</a>: {desc} </li>\n'''.format(
  55. name=name, desc=title)
  56. index_html += "</ul>"
  57. def index():
  58. put_markdown('# PyWebIO Document Code Example Index')
  59. put_html(index_html)
  60. app['index'] = index
  61. return app
  62. if __name__ == '__main__':
  63. start_server(get_app(), debug=True, port=8080)