| |
| |
| |
| |
| |
| |
|
|
| import argparse |
| import json |
| import os |
|
|
| import nbformat |
| from bs4 import BeautifulSoup |
| from nbconvert import HTMLExporter, ScriptExporter |
|
|
|
|
| TEMPLATE = """const CWD = process.cwd(); |
| |
| const React = require('react'); |
| const Tutorial = require(`${{CWD}}/core/Tutorial.js`); |
| |
| class TutorialPage extends React.Component {{ |
| render() {{ |
| const {{config: siteConfig}} = this.props; |
| const {{baseUrl}} = siteConfig; |
| return <Tutorial baseUrl={{baseUrl}} tutorialID="{}"/>; |
| }} |
| }} |
| |
| module.exports = TutorialPage; |
| |
| """ |
|
|
| JS_SCRIPTS = """ |
| <script |
| src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"> |
| </script> |
| <script |
| src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"> |
| </script> |
| """ |
|
|
|
|
| def gen_tutorials(repo_dir: str) -> None: |
| """Generate HTML tutorials for PyTorch3D Docusaurus site from Jupyter notebooks. |
| |
| Also create ipynb and py versions of tutorial in Docusaurus site for |
| download. |
| """ |
| with open(os.path.join(repo_dir, "website", "tutorials.json"), "r") as infile: |
| tutorial_config = json.loads(infile.read()) |
|
|
| tutorial_ids = {x["id"] for v in tutorial_config.values() for x in v} |
|
|
| for tid in tutorial_ids: |
| print("Generating {} tutorial".format(tid)) |
|
|
| |
| ipynb_in_path = os.path.join( |
| repo_dir, "docs", "tutorials", "{}.ipynb".format(tid) |
| ) |
| with open(ipynb_in_path, "r") as infile: |
| nb_str = infile.read() |
| nb = nbformat.reads(nb_str, nbformat.NO_CONVERT) |
|
|
| |
| nb["metadata"]["kernelspec"]["display_name"] = "python3" |
|
|
| exporter = HTMLExporter() |
| html, meta = exporter.from_notebook_node(nb) |
|
|
| |
| soup = BeautifulSoup(html, "html.parser") |
| nb_meat = soup.find("div", {"id": "notebook-container"}) |
| del nb_meat.attrs["id"] |
| nb_meat.attrs["class"] = ["notebook"] |
| html_out = JS_SCRIPTS + str(nb_meat) |
|
|
| |
| html_out_path = os.path.join( |
| repo_dir, "website", "_tutorials", "{}.html".format(tid) |
| ) |
| with open(html_out_path, "w") as html_outfile: |
| html_outfile.write(html_out) |
|
|
| |
| script = TEMPLATE.format(tid) |
| js_out_path = os.path.join( |
| repo_dir, "website", "pages", "tutorials", "{}.js".format(tid) |
| ) |
| with open(js_out_path, "w") as js_outfile: |
| js_outfile.write(script) |
|
|
| |
| ipynb_out_path = os.path.join( |
| repo_dir, "website", "static", "files", "{}.ipynb".format(tid) |
| ) |
| with open(ipynb_out_path, "w") as ipynb_outfile: |
| ipynb_outfile.write(nb_str) |
| exporter = ScriptExporter() |
| script, meta = exporter.from_notebook_node(nb) |
| py_out_path = os.path.join( |
| repo_dir, "website", "static", "files", "{}.py".format(tid) |
| ) |
| with open(py_out_path, "w") as py_outfile: |
| py_outfile.write(script) |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser( |
| description="Generate JS, HTML, ipynb, and py files for tutorials." |
| ) |
| parser.add_argument( |
| "--repo_dir", metavar="path", required=True, help="PyTorch3D repo directory." |
| ) |
| args = parser.parse_args() |
| gen_tutorials(args.repo_dir) |
|
|