@@ -118,13 +118,35 @@ def iframe_url_builder_jupyter_hub_host(layout):
118118 }
119119
120120
121+ def iframe_url_builder_google_colab (layout ):
122+ from google .colab .output import eval_js
123+
124+ server = layout .server
125+ url_base = eval_js (f"google.colab.kernel.proxyPort({ server .port } )" )
126+ if url_base .endswith ("/" ):
127+ url_base = url_base [:- 1 ]
128+
129+ src = f"{ url_base } /index.html?ui={ layout .template_name } &reconnect=auto"
130+ elem_id = f"{ server .name } _{ layout ._template_name } "
131+
132+ return {
133+ "id" : elem_id ,
134+ "src" : src ,
135+ "style" : layout .iframe_style ,
136+ ** layout .iframe_attrs ,
137+ }
138+
139+
121140def get_iframe_builder (name = "default" ):
122141 if isinstance (name , Callable ):
123142 return name
124143
125144 # Try to detect JupyterHub automatically
126- if name == "default" and "JUPYTERHUB_SERVICE_PREFIX" in os .environ :
127- name = "jupyter-hub"
145+ if name == "default" :
146+ if "JUPYTERHUB_SERVICE_PREFIX" in os .environ :
147+ name = "jupyter-hub"
148+ if "COLAB_RELEASE_TAG" in os .environ or "COLAB_BACKEND_VERSION" in os .environ :
149+ name = "google-colab"
128150
129151 builder_type = os .environ .get ("TRAME_IFRAME_BUILDER" , name )
130152 builder = iframe_url_builder_default
@@ -135,6 +157,8 @@ def get_iframe_builder(name="default"):
135157 builder = iframe_url_builder_jupyter_extension
136158 elif builder_type == "jupyter-hub" :
137159 builder = iframe_url_builder_jupyter_hub
160+ elif builder_type == "google-colab" :
161+ builder = iframe_url_builder_google_colab
138162 elif builder_type == "jupyter-hub-host" :
139163 builder = iframe_url_builder_jupyter_hub_host
140164
0 commit comments