-
Notifications
You must be signed in to change notification settings - Fork 794
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update show based on simple web-server rather than altair_viewer
- Loading branch information
Showing
2 changed files
with
92 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
import webbrowser | ||
from http.server import BaseHTTPRequestHandler, HTTPServer | ||
from typing import Union, Iterable, Optional | ||
|
||
|
||
def open_html_in_browser( | ||
html: Union[str, bytes], | ||
using: Union[str, Iterable[str], None] = None, | ||
port: Optional[int] = None, | ||
): | ||
""" | ||
Display an html document in a web browser without creating a temp file. | ||
Instantiates a simple http server and uses the webbrowser module to | ||
open the server's URL | ||
Based on | ||
Parameters | ||
---------- | ||
html: str | ||
HTML string to display | ||
using: str or iterable of str | ||
Name of the web browser to open (e.g. "chrome", "firefox", etc.). | ||
If an iterable, choose the first browser available on the system. | ||
If none, choose the system default browser. | ||
port: int | ||
Port to use. Defaults to a random port | ||
""" | ||
# Encode html to bytes | ||
if isinstance(html, str): | ||
html_bytes = html.encode("utf8") | ||
else: | ||
html_bytes = html | ||
|
||
browser = None | ||
|
||
if using is None: | ||
browser = webbrowser.get(None) | ||
else: | ||
# normalize using to an iterable | ||
if isinstance(using, str): | ||
using = [using] | ||
|
||
for browser_key in using: | ||
try: | ||
browser = webbrowser.get(browser_key) | ||
if browser is not None: | ||
break | ||
except webbrowser.Error: | ||
pass | ||
|
||
if browser is None: | ||
raise ValueError("Failed to locate a browser with name in " + str(using)) | ||
|
||
class OneShotRequestHandler(BaseHTTPRequestHandler): | ||
def do_GET(self): | ||
self.send_response(200) | ||
self.send_header("Content-type", "text/html") | ||
self.end_headers() | ||
|
||
bufferSize = 1024 * 1024 | ||
for i in range(0, len(html_bytes), bufferSize): | ||
self.wfile.write(html_bytes[i : i + bufferSize]) | ||
|
||
def log_message(self, format, *args): | ||
# Silence stderr logging | ||
pass | ||
|
||
# Use specified port if provided, otherwise choose a random port (port value of 0) | ||
server = HTTPServer( | ||
("127.0.0.1", port if port is not None else 0), OneShotRequestHandler | ||
) | ||
browser.open("http://127.0.0.1:%s" % server.server_port) | ||
server.handle_request() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters