From e20025315d6766452dbf514b4af9fe84ab341200 Mon Sep 17 00:00:00 2001 From: Matti Pastell Date: Thu, 4 Dec 2014 21:54:56 +0200 Subject: [PATCH] Changed chunk options to follow Knitr's naming * Implemented dpi and fig_witdth and fig_height for Gadfly and Winston --- .gitignore | 6 ++- examples/winston_sample.mdw | 2 +- examples/winston_sample.pdf | Bin 66172 -> 0 bytes src/JuliaReport.jl | 56 +++++++++++++-------------- src/config.jl | 75 ++++++++++++++++++++++++++++-------- src/formatters.jl | 47 ++++++++++++++-------- src/gadfly.jl | 18 +++++++-- src/winston.jl | 4 +- 8 files changed, 142 insertions(+), 66 deletions(-) delete mode 100644 examples/winston_sample.pdf diff --git a/.gitignore b/.gitignore index dd2907c..9dd5f62 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,12 @@ test.jl -examples/*/*.png +examples/figures/ examples/*.md +examples/*.pdf examples/*.html tmp/ .idea *.*~ +*.aux +*.log +*.out diff --git a/examples/winston_sample.mdw b/examples/winston_sample.mdw index fa98a28..ee5fe55 100644 --- a/examples/winston_sample.mdw +++ b/examples/winston_sample.mdw @@ -33,7 +33,7 @@ p = plot(t, sinc(t)) You can also include a plot with caption and hide the code: -<>= +<>= p = plot(cumsum(randn(1000, 1))) xlabel("x") ylabel("sinc(x)") diff --git a/examples/winston_sample.pdf b/examples/winston_sample.pdf deleted file mode 100644 index 7dac66982d44c6acefc11364bc6002840a4e23df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66172 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 diff --git a/src/JuliaReport.jl b/src/JuliaReport.jl index cf99534..c2a379a 100644 --- a/src/JuliaReport.jl +++ b/src/JuliaReport.jl @@ -1,6 +1,5 @@ module JuliaReport using Compat -import Base: display, writemime #Contains report global properties type Report <: Display @@ -10,15 +9,13 @@ type Report <: Display basename::String formatdict pending_code::String - figdir::String - executed::Array cur_result::String fignum::Int figures::Array cur_chunk::Dict function Report() - new("", false, "", "", Any[], "", "", Any[], "", 1, Any[], @compat Dict{Symbol, Any}()) + new("", false, "", "", Any[], "", "", 1, Any[], @compat Dict{Symbol, Any}()) end end @@ -29,7 +26,7 @@ const supported_mime_types = [MIME"image/png", MIME"text/plain"] -function display(doc::Report, data) +function Base.display(doc::Report, data) for m in supported_mime_types if mimewritable(m(), data) display(doc, m(), data) @@ -48,23 +45,25 @@ module ReportSandBox end -function weave(source ; doctype = "pandoc", plotlib="PyPlot", informat="noweb", figdir = "figures", figformat = nothing) +function weave(source ; doctype = "pandoc", plotlib="PyPlot", informat="noweb", fig_path = "figures", fig_ext = nothing) cwd, fname = splitdir(abspath(source)) basename = splitext(fname)[1] formatdict = formats[doctype].formatdict - figformat == nothing || (formatdict[:figfmt] = figformat) + fig_ext == nothing || (rcParams[:chunk_defaults][:fig_ext] = fig_ext) + + #report = Report(source, false, cwd, basename, formatdict, "", figdir) report.source = source report.cwd = cwd report.basename = basename - report.figdir = figdir + rcParams[:chunk_defaults][:fig_path] = fig_path report.formatdict = formatdict if plotlib == nothing - rcParams[:chunk][:defaultoptions][:fig] = false + rcParams[:chunk_defaults][:fig] = false else l_plotlib = lowercase(plotlib) if l_plotlib == "winston" @@ -76,6 +75,10 @@ function weave(source ; doctype = "pandoc", plotlib="PyPlot", informat="noweb", elseif l_plotlib == "gadfly" eval(parse("""include(Pkg.dir("JuliaReport","src","gadfly.jl"))""")) rcParams[:plotlib] = "Gadfly" + if rcParams[:chunk_defaults][:fig_ext] != ".png" + rcParams[:chunk_defaults][:fig_ext] = ".png" + warn("Saving figures as .png with Gadfly") + end end end @@ -152,19 +155,19 @@ function run(parsed) if chunk[:type] == "code" #print(chunk["content"]) info("Weaving chunk $(chunk[:number]) from line $(chunk[:start_line])") - defaults = copy(rcParams[:chunk][:defaultoptions]) + defaults = copy(rcParams[:chunk_defaults]) options = copy(chunk[:options]) try - options = merge(rcParams[:chunk][:defaultoptions], options) + options = merge(rcParams[:chunk_defaults], options) catch - options = rcParams[:chunk][:defaultoptions] + options = rcParams[:chunk_defaults] warn("Invalid format for chunk options line: $(chunk[:start_line])") end merge!(chunk, options) delete!(chunk, :options) - chunk[:evaluate] || (chunk[:result] = ""; continue) #Do nothing if eval is false + chunk[:eval] || (chunk[:result] = ""; continue) #Do nothing if eval is false report.fignum = 1 report.cur_result = "" @@ -197,15 +200,14 @@ end function savefigs_pyplot(chunk) fignames = String[] - ext = report.formatdict[:figfmt] - figpath = joinpath(report.cwd, report.figdir) + ext = report.formatdict[:fig_ext] + figpath = joinpath(report.cwd, chunk[:fig_path]) isdir(figpath) || mkdir(figpath) chunkid = (chunk[:name] == nothing) ? chunk[:number] : chunk[:name] #Iterate over all open figures, save them and store names for fig = plt.get_fignums() - full_name = joinpath(report.cwd, report.figdir, "$(report.basename)_$(chunkid)_$fig$ext") - rel_name = "$(report.figdir)/$(report.basename)_$(chunkid)_$fig$ext" #Relative path is used in output - savefig(full_name) + full_name, rel_name = get_figname(report, chunk, fignum=fig) + savefig(full_name, dpi=chunk[:dpi]) push!(fignames, rel_name) plt.draw() plt.close() @@ -215,22 +217,20 @@ end -function display(report::Report, m::MIME"text/plain", data) +function Base.display(report::Report, m::MIME"text/plain", data) s = reprmime(m, data) report.cur_result *= s - push!(report.executed, s) end -function get_figname(report::Report, chunk) - figpath = joinpath(report.cwd, report.figdir) +function get_figname(report::Report, chunk; fignum = nothing) + figpath = joinpath(report.cwd, chunk[:fig_path]) isdir(figpath) || mkdir(figpath) - ext = report.formatdict[:figfmt] - fig = report.fignum - chunk = report.cur_chunk - chunkid = (chunk[:name] == nothing) ? chunk[:number] : chunk[:name] - full_name = joinpath(report.cwd, report.figdir, "$(report.basename)_$(chunkid)_$fig$ext") - rel_name = "$(report.figdir)/$(report.basename)_$(chunkid)_$fig$ext" #Relative path is used in output + ext = chunk[:fig_ext] + fignum == nothing && (fignum = report.fignum) + chunkid = (chunk[:name] == nothing) ? chunk[:number] : chunk[:name] + full_name = joinpath(report.cwd, chunk[:fig_path], "$(report.basename)_$(chunkid)_$(fignum)$ext") + rel_name = "$(chunk[:fig_path])/$(report.basename)_$(chunkid)_$(fignum)$ext" #Relative path is used in output return full_name, rel_name end diff --git a/src/config.jl b/src/config.jl index 79c0ba8..d9992dc 100644 --- a/src/config.jl +++ b/src/config.jl @@ -1,25 +1,70 @@ const rcParams = - @compat Dict{Symbol,Any}(:figdir=> "figures", + @compat Dict{Symbol,Any}( :plotlib => "PyPlot", - :storeresults=> false, - :cachedir=> "cache", - :chunk=> - Dict{Symbol,Any}(:defaultoptions=> - Dict{Symbol,Any}(:echo=> true, - :results=> "verbatim", + :storeresults => false, + :chunk_defaults => Dict{Symbol,Any}(:echo=> true, + :results=> "markup", :fig=> true, :include=> true, - :evaluate=> true, - :caption=> false, + :eval => true, + :fig_cap=> false, + :fig_width => 8, #Size in inches + :fig_height => 6, + :fig_path=> "figures", + :out_width=> nothing, #Defined separately for each format + :out_height=> nothing, + :fig_ext => ".png", + :dpi => 200, :term=> false, :name=> nothing, :wrap=> true, - :f_pos=> "htpb", - :f_size=> (8, 6), - :f_env=> nothing, - :f_spines=> true, - :complete=> true, + :fig_pos=> nothing, + :fig_env=> nothing, :engine=> "julia", :option_string=> "") ) - ) + + + + +# Working towards Knitr compatible options, implemented options are added to defaultoptions dictionary above +# and work in progress stays here, options from https://github.com/yihui/knitr/blob/master/R/defaults.R +# If you need a particular options, consider implementing it and making a pull request. + +#tidy = FALSE, +#tidy.opts = NULL, +#collapse = FALSE +#prompt = FALSE +#highlight = TRUE +#strip.white = TRUE +#size = 'normalsize' +#background = '#F7F7F7', +#cache = FALSE +#cache.path = 'cache/' +#cache.vars = NULL +#cache.lazy = TRUE, +#dependson = NULL +#autodep = FALSE, +#fig.keep = 'high' +#fig.show = 'asis' +#fig.align = 'default' +#dev = NULL +#dev.args = NULL +#fig.ext = NULL +#fig.scap = NULL +#fig.lp = 'fig:' +#fig.subcap = NULL, +#out.extra = NULL +#fig.retina = 1, +#external = TRUE +#sanitize = FALSE +#interval = 1 +#aniopts = 'controls,loop', +#warning = TRUE +#error = TRUE +#message = TRUE, +#render = NULL, +#ref.label = NULL +#child = NULL +#split = FALSE +#purl = TRUE diff --git a/src/formatters.jl b/src/formatters.jl index 6194fd1..b9d0b41 100644 --- a/src/formatters.jl +++ b/src/formatters.jl @@ -5,15 +5,27 @@ function format(executed, doctype) formatted = String[] docformat = formats[doctype] #@show docformat + + #Complete format dictionaries with defaults formatdict = docformat.formatdict get!(formatdict, :termstart, formatdict[:codestart]) get!(formatdict, :termend, formatdict[:codeend]) + get!(formatdict, :out_width, nothing) + get!(formatdict, :out_height, nothing) + get!(formatdict, :fig_pos, nothing) + get!(formatdict, :fig_env, nothing) + for chunk in copy(executed) if chunk[:type] == "doc" push!(formatted, chunk[:content]) else + #Fill undefined options with format specific defaults + chunk[:out_width] == nothing && (chunk[:out_width] = docformat.formatdict[:out_width]) + chunk[:fig_env] == nothing && (chunk[:fig_env] = docformat.formatdict[:fig_env]) + chunk[:fig_pos] == nothing && (chunk[:fig_pos] = docformat.formatdict[:fig_pos]) + #Format code result = format_codechunk(chunk, formatdict) @@ -34,7 +46,7 @@ end function format_codechunk(chunk, formatdict) - if !chunk[:evaluate] + if !chunk[:eval] if chunk[:echo] result = "$(formatdict[:codestart])$(chunk[:content])$(formatdict[:codeend])" return result @@ -59,10 +71,10 @@ function format_codechunk(chunk, formatdict) if (strip(chunk[:result])!= "") && (chunk[:results] != "hidden") #@show chunk - if chunk[:results] != "verbatim" + if chunk[:results] != "markup" haskey(formatdict, :indent) && (chunk[:result] = indent(chunk[:result])) result *= "$(chunk[:result])" - elseif chunk[:results] == "verbatim" + elseif chunk[:results] == "markup" result *= "$(formatdict[:outputstart])$(chunk[:result])\n$(formatdict[:outputend])\n" end end @@ -98,9 +110,11 @@ const tex = Tex(@compat Dict{Symbol,Any}(:codestart => "\\begin{juliacode}", :codeend => "\\end{juliacode}", :outputstart => "\\begin{juliaout}", :outputend => "\\end{juliaout}", - :figfmt => ".pdf", + :fig_ext => ".pdf", :extension =>"tex", - :width => "\\linewidth", + :out_width=> "\\linewidth", + :fig_env=> "figure", + :fig_pos => "htpb", :doctype => "tex" )) @@ -110,9 +124,11 @@ const texminted = Tex(@compat Dict{Symbol,Any}(:codestart => "\\begin{minted}[ma :outputend => "\\end{minted}", :termstart=> "\\begin{minted}[fontsize=\\footnotesize, xleftmargin=0.5em, mathescape]{julia}", :termend => "\\end{minted}", - :figfmt => ".pdf", + :fig_ext => ".pdf", :extension =>"tex", - :width => "\\linewidth", + :out_width => "\\linewidth", + :fig_env=> "figure", + :fig_pos => "htpb", :doctype => "texminted" )) @@ -124,19 +140,20 @@ const pandoc = Pandoc(@compat Dict{Symbol,Any}(:codestart => "~~~~{.julia}", :codeend=>"~~~~~~~~~~~~~\n\n", :outputstart=>"~~~~{.julia}", :outputend=>"~~~~~~~~~~~~~\n\n", - :figfmt=>".png", + :fig_ext=>".png", :extension=>"md", - :width=>"15 cm", :doctype=>"pandoc" )) function formatfigures(chunk, docformat::Tex) fignames = chunk[:figure] - caption = chunk[:caption] - width = get!(chunk, :width, docformat.formatdict[:width]) - f_pos = chunk[:f_pos] - f_env = chunk[:f_env] + caption = chunk[:fig_cap] + width = chunk[:out_width] + + + f_pos = chunk[:fig_pos] + f_env = chunk[:fig_env] result = "" figstring = "" @@ -144,6 +161,7 @@ function formatfigures(chunk, docformat::Tex) result *= """\\begin{$f_env}\n""" end + for fig = fignames figstring *= "\\includegraphics[width= $width]{$fig}\n" end @@ -172,8 +190,7 @@ end function formatfigures(chunk, docformat::Pandoc) fignames = chunk[:figure] - caption = chunk[:caption] - width = get!(chunk, :width, docformat.formatdict[:width]) + caption = chunk[:fig_cap] result = "" figstring = "" diff --git a/src/gadfly.jl b/src/gadfly.jl index 4fefc06..594a736 100644 --- a/src/gadfly.jl +++ b/src/gadfly.jl @@ -3,8 +3,14 @@ using Gadfly Gadfly.set_default_plot_format(:png) #Captures figures -function display(report::Report, m::MIME"image/png", data) +function Base.display(report::Report, m::MIME"image/png", p::Plot) chunk = report.cur_chunk + + if chunk[:fig_ext] != ".png" + chunk[:fig_ext] + warn("Saving figures as .png with Gadfly") + end + full_name, rel_name = get_figname(report, chunk) docformat = formats[report.formatdict[:doctype]] @@ -21,7 +27,11 @@ function display(report::Report, m::MIME"image/png", data) end report.fignum += 1 - out = open(full_name, "w") - writemime(out, m, data) - close(out) + + #TODO other formats + r = chunk[:dpi]/96 #Relative to Gadfly default 96dpi + draw(PNG(full_name, chunk[:fig_width]inch*r, chunk[:fig_height]inch*r ), p) + #out = open(full_name, "w") + #writemime(out, m, data) + #close(out) end diff --git a/src/winston.jl b/src/winston.jl index 103a2dc..c48ff56 100644 --- a/src/winston.jl +++ b/src/winston.jl @@ -1,6 +1,6 @@ using Winston -function display(report::Report, m::MIME"image/png", data) +function Base.display(report::Report, m::MIME"image/png", data) chunk = report.cur_chunk full_name, rel_name = get_figname(report, chunk) @@ -19,7 +19,7 @@ function display(report::Report, m::MIME"image/png", data) end #TODO get width and height from chunk options, after implementing Knitr compatible options - savefig(data, full_name, width=2000, height=800) + savefig(data, full_name, width=chunk[:fig_width]*chunk[:dpi], height=chunk[:fig_height]*chunk[:dpi]) report.fignum += 1 #out = open(full_name, "w") #writemime(out, m, data)