allow to not host plotly from local file

This commit is contained in:
SimonDanisch 2018-10-04 15:20:21 +02:00
parent 63bc3a2b88
commit 3c2cfa333c
6 changed files with 66 additions and 36 deletions

1
.gitignore vendored
View File

@ -6,3 +6,4 @@ examples/.ipynb_checkpoints/*
examples/meetup/.ipynb_checkpoints/* examples/meetup/.ipynb_checkpoints/*
deps/plotly-latest.min.js deps/plotly-latest.min.js
deps/build.log deps/build.log
deps/deps.jl

19
deps/build.jl vendored
View File

@ -1,8 +1,21 @@
#TODO: download https://cdn.plot.ly/plotly-latest.min.js to deps/ if it doesn't exist #TODO: download https://cdn.plot.ly/plotly-latest.min.js to deps/ if it doesn't exist
file_path = ""
local_fn = joinpath(dirname(@__FILE__), "plotly-latest.min.js") if get(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL", "true") == "true"
if !isfile(local_fn) global file_path
local_fn = joinpath(dirname(@__FILE__), "plotly-latest.min.js")
if !isfile(local_fn)
@info("Cannot find deps/plotly-latest.min.js... downloading latest version.") @info("Cannot find deps/plotly-latest.min.js... downloading latest version.")
download("https://cdn.plot.ly/plotly-latest.min.js", local_fn) download("https://cdn.plot.ly/plotly-latest.min.js", local_fn)
@show local_fn isfile(local_fn)
if isfile(local_fn)
file_path = local_fn
end
else
file_path = local_fn
end
end
open("deps.jl", "w") do io
println(io, "const plotly_local_file_path = $(repr(file_path))")
end end

View File

@ -18,6 +18,12 @@ import JSON
using Requires using Requires
if isfile(joinpath(@__DIR__, "..", "deps", "deps.jl"))
include(joinpath(@__DIR__, "..", "deps", "deps.jl"))
else
error("Plots not build, please run Pkg.build(\"Plots\")")
end
export export
grid, grid,
bbox, bbox,

View File

@ -71,15 +71,12 @@ end
# -------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------
const plotly_remote_file_path = "https://cdn.plot.ly/plotly-latest.min.js"
if isfile(plotly_local_file_path) && isijulia()
const _plotly_js_path = joinpath(dirname(@__FILE__), "..", "..", "deps", "plotly-latest.min.js") _js_code = open(read, plotly_local_file_path, "r")
const _plotly_js_path_remote = "https://cdn.plot.ly/plotly-latest.min.js" # borrowed from https://github.com/plotly/plotly.py/blob/2594076e29584ede2d09f2aa40a8a195b3f3fc66/plotly/offline/offline.py#L64-L71 c/o @spencerlyon2
_js_script = """
_js_code = open(read, _plotly_js_path, "r")
# borrowed from https://github.com/plotly/plotly.py/blob/2594076e29584ede2d09f2aa40a8a195b3f3fc66/plotly/offline/offline.py#L64-L71 c/o @spencerlyon2
_js_script = """
<script type='text/javascript'> <script type='text/javascript'>
define('plotly', function(require, exports, module) { define('plotly', function(require, exports, module) {
$(_js_code) $(_js_code)
@ -88,10 +85,8 @@ _js_script = """
window.Plotly = Plotly; window.Plotly = Plotly;
}); });
</script> </script>
""" """
# if we're in IJulia call setupnotebook to load js and css
# if we're in IJulia call setupnotebook to load js and css
if isijulia()
display("text/html", _js_script) display("text/html", _js_script)
end end
@ -102,8 +97,6 @@ end
using UUIDs using UUIDs
push!(_initialized_backends, :plotly) push!(_initialized_backends, :plotly)
# ---------------------------------------------------------------- # ----------------------------------------------------------------
const _plotly_legend_pos = KW( const _plotly_legend_pos = KW(
@ -115,7 +108,7 @@ const _plotly_legend_pos = KW(
:bottomright => [1., 0.], :bottomright => [1., 0.],
:topright => [1., 1.], :topright => [1., 1.],
:topleft => [0., 1.] :topleft => [0., 1.]
) )
plotly_legend_pos(pos::Symbol) = get(_plotly_legend_pos, pos, [1.,1.]) plotly_legend_pos(pos::Symbol) = get(_plotly_legend_pos, pos, [1.,1.])
plotly_legend_pos(v::Tuple{S,T}) where {S<:Real, T<:Real} = v plotly_legend_pos(v::Tuple{S,T}) where {S<:Real, T<:Real} = v
@ -882,11 +875,9 @@ plotly_series_json(plt::Plot) = JSON.json(plotly_series(plt))
# ---------------------------------------------------------------- # ----------------------------------------------------------------
const _use_remote = Ref(false)
function html_head(plt::Plot{PlotlyBackend}) function html_head(plt::Plot{PlotlyBackend})
jsfilename = _use_remote[] ? _plotly_js_path_remote : ("file://" * _plotly_js_path) local_file = ("file://" * plotly_local_file_path)
# "<script src=\"$(joinpath(dirname(@__FILE__),"..","..","deps","plotly-latest.min.js"))\"></script>" jsfilename = use_local_dependencies[] ? local_file : plotly_remote_file_path
"<script src=\"$jsfilename\"></script>" "<script src=\"$jsfilename\"></script>"
end end

View File

@ -42,8 +42,14 @@ function write_temp_html(plt::AbstractPlot)
end end
function standalone_html_window(plt::AbstractPlot) function standalone_html_window(plt::AbstractPlot)
old = use_local_dependencies[] # save state to restore afterwards
# if we open a browser ourself, we can host local files, so we
# when we have a local plotly downloaded this is the way to go!
use_local_dependencies[] = isfile(plotly_local_file_path)
filename = write_temp_html(plt) filename = write_temp_html(plt)
open_browser_window(filename) open_browser_window(filename)
# restore for other backends
use_local_dependencies[] = old
end end
# uses wkhtmltopdf/wkhtmltoimage: http://wkhtmltopdf.org/downloads.html # uses wkhtmltopdf/wkhtmltoimage: http://wkhtmltopdf.org/downloads.html

View File

@ -1,4 +1,7 @@
const use_local_dependencies = Ref(false)
function __init__() function __init__()
if isdefined(Main, :PLOTS_DEFAULTS) if isdefined(Main, :PLOTS_DEFAULTS)
if haskey(Main.PLOTS_DEFAULTS, :theme) if haskey(Main.PLOTS_DEFAULTS, :theme)
theme(Main.PLOTS_DEFAULTS[:theme]) theme(Main.PLOTS_DEFAULTS[:theme])
@ -27,10 +30,11 @@ function __init__()
# --------------------------------------------------------- # ---------------------------------------------------------
# IJulia # IJulia
# --------------------------------------------------------- # ---------------------------------------------------------
use_local = false
@require IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" begin @require IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" begin
if IJulia.inited if IJulia.inited
# IJulia is more stable with local file
use_local = isfile(plotly_local_file_path)
""" """
Add extra jupyter mimetypes to display_dict based on the plot backed. Add extra jupyter mimetypes to display_dict based on the plot backed.
@ -80,4 +84,13 @@ function __init__()
ENV["MPLBACKEND"] = "Agg" ENV["MPLBACKEND"] = "Agg"
end end
end end
if haskey(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL")
use_local = ENV["PLOTS_HOST_DEPENDENCY_LOCAL"] == "true"
use_local_dependencies[] = isfile(plotly_local_file_path) && use_local
if use_local && !isfile(plotly_local_file_path)
@warn("PLOTS_HOST_DEPENDENCY_LOCAL is set to true, but no local plotly file found. run Pkg.build(\"Plots\") and make sure PLOTS_HOST_DEPENDENCY_LOCAL is set to true")
end
else
use_local_dependencies[] = use_local
end
end end