X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fmiscellaneous-1.1.0%2Fpublish.m;fp=octave_packages%2Fmiscellaneous-1.1.0%2Fpublish.m;h=88a00505f6f77926b8644688899547895e23ff26;hp=0000000000000000000000000000000000000000;hb=c880e8788dfc484bf23ce13fa2787f2c6bca4863;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/miscellaneous-1.1.0/publish.m b/octave_packages/miscellaneous-1.1.0/publish.m new file mode 100644 index 0000000..88a0050 --- /dev/null +++ b/octave_packages/miscellaneous-1.1.0/publish.m @@ -0,0 +1,335 @@ +## Copyright (C) 2010 Fotios Kasolis +## +## This program is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free Software +## Foundation; either version 3 of the License, or (at your option) any later +## version. +## +## This program is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +## details. +## +## You should have received a copy of the GNU General Public License along with +## this program; if not, see . + +## -*- texinfo -*- +## @deftypefn {Function File} {} publish (@var{filename}) +## @deftypefnx {Function File} {} publish (@var{filename}, @var{options}) +## Produces latex reports from scripts. +## +## @example +## publish (@var{my_script}) +## @end example +## +## @noindent +## where the argument is a string that contains the file name of +## the script we want to report. +## +## If two arguments are given, they are interpreted as follows. +## +## @example +## publish (@var{filename}, [@var{option}, @var{value}, ...]) +## @end example +## +## @noindent +## The following options are available: +## +## @itemize @bullet +## @item format +## +## the only available format values are the strings `latex' and +## `html'. +## +## @item +## imageFormat: +## +## string that specifies the image format, valid formats are `pdf', +## `png', and `jpg'(or `jpeg'). +## +## @item +## showCode: +## +## boolean value that specifies if the source code will be included +## in the report. +## +## @item +## evalCode: +## +## boolean value that specifies if execution results will be included +## in the report. +## +## @end itemize +## +## Default @var{options} +## +## @itemize @bullet +## @item format = latex +## +## @item imageFormat = pdf +## +## @item showCode = 1 +## +## @item evalCode = 1 +## +## @end itemize +## +## Remarks +## +## @itemize @bullet +## @item Any additional non-valid field is removed without +## notification. +## +## @item To include several figures in the resulting report you must +## use figure with a unique number for each one of them. +## +## @item You do not have to save the figures manually, publish will +## do it for you. +## +## @item The functions works only for the current path and no way ... +## to specify other path is allowed. +## +## @end itemize +## +## Assume you have the script `myscript.m' which looks like +## +## @example +## @group +## x = 0:0.1:pi; +## y = sin(x) +## figure(1) +## plot(x,y); +## figure(2) +## plot(x,y.^2); +## @end group +## @end example +## +## You can then call publish with default @var{options} +## +## @example +## publish("myscript") +## @end example +## @end deftypefn + +function publish (file_name, varargin) + + if ((nargin < 1) || (rem (numel (varargin), 2) != 0)) + print_usage (); + endif + + if (!strcmp (file_name(end-1:end), ".m")) + ifile = strcat (file_name, ".m"); + ofile = strcat (file_name, ".tex"); + else + ifile = file_name; + ofile = strcat (file_name(1:end-1), "tex"); + endif + + if (exist (ifile, "file") != 2) + error ("File %s does not exist.", ifile); + endif + + options = set_default (struct ()); + options = read_options (varargin, "op1", "format imageFormat showCode evalCode", "default", options); + + if (strcmpi (options.format, "latex")) + create_latex (ifile, ofile, options); + elseif strcmpi(options.format, "html") + create_html (ifile, options); + endif + +endfunction + +function def_options = set_default (options); + + if (!isfield (options, "format")) + def_options.format = "latex"; + elseif (!ischar (options.format)) + error("Option format must be a string."); + else + valid_formats={"latex", "html"}; + validity_test = strcmpi (valid_formats, options.format); + if (isempty (find (validity_test))) + error ("The supplied format is not currently supported."); + else + def_options.format = options.format; + endif + endif + + if (! isfield (options, "imageFormat")) + def_options.imageFormat = "pdf"; + elseif (! ischar(options.imageFormat)) + error("Option imageFormat must be a string."); + else + valid_formats = {"pdf", "png", "jpg", "jpeg"}; + validity_test = strcmpi (valid_formats, options.imageFormat); + if (isempty (find (validity_test))) + error ("The supplied image format is not available."); + else + def_options.imageFormat = options.imageFormat; + endif + endif + + if (!isfield (options,"showCode")) + def_options.showCode = true; + elseif (!isbool (options.showCode)) + error ("Option showCode must be a boolean."); + else + def_options.showCode = options.showCode; + endif + + if (!isfield (options,"evalCode")) + def_options.evalCode = true; + elseif (!isbool (options.evalCode)) + error ("Option evalCode must be a boolean."); + else + def_options.evalCode = options.evalCode; + endif +endfunction + +function create_html (ifile, options) + + ofile = strcat (ifile(1:end-1), "html"); + html_start = "\n\n"; + html_end = "\n\n"; + + if options.showCode + section1_title = "

Source code

\n"; + fid = fopen (ifile, "r"); + source_code = fread (fid, "*char")'; + fclose(fid); + else + section1_title = ""; + source_code = ""; + endif + + if options.evalCode + section2_title = "

Execution results

\n"; + oct_command = strcat ("octave> ", ifile(1:end-2), "\n"); + script_result = exec_script (ifile); + else + section2_title = ""; + oct_command = ""; + script_result = ""; + endif + + [section3_title, disp_fig] = exec_print (ifile, options); + + final_document = strcat (html_start, section1_title, "\n", source_code,"\n",... + "\n", section2_title, oct_command, script_result,... + "", section3_title, disp_fig, html_end); + + + fid = fopen (ofile, "w"); + fputs (fid, final_document); + fclose (fid); + +endfunction + +function create_latex (ifile, ofile, options) + latex_preamble = "\ +\\documentclass[a4paper,12pt]{article}\n\ +\\usepackage{listings}\n\ +\\usepackage{graphicx}\n\ +\\usepackage{color}\n\ +\\usepackage[T1]{fontenc}\n\ +\\definecolor{lightgray}{rgb}{0.9,0.9,0.9}\n"; + + listing_source_option = "\ +\\lstset{\n\ +language = Octave,\n\ +basicstyle =\\footnotesize,\n\ +numbers = left,\n\ +numberstyle = \\footnotesize,\n\ +backgroundcolor=\\color{lightgray},\n\ +frame=single,\n\ +tabsize=2,\n\ +breaklines=true}\n"; + + listing_exec_option = "\ +\\lstset{\n\ +language = Octave,\n\ +basicstyle =\\footnotesize,\n\ +numbers = none,\n\ +backgroundcolor=\\color{white},\n\ +frame=none,\n\ +tabsize=2,\n\ +breaklines=true}\n"; + + if options.showCode + section1_title = strcat ("\\section*{Source code: \\texttt{", ifile, "}}\n"); + source_code = strcat ("\\lstinputlisting{", ifile, "}\n"); + else + section1_title = ""; + source_code = ""; + endif + + if options.evalCode + section2_title = "\\section*{Execution results}\n"; + oct_command = strcat ("octave> ", ifile(1:end-2), "\n"); + script_result = exec_script (ifile); + else + section2_title = ""; + oct_command = ""; + script_result = ""; + endif + + [section3_title, disp_fig] = exec_print (ifile, options); + + final_document = strcat (latex_preamble, listing_source_option, + "\\begin{document}\n", + section1_title, source_code, + section2_title, listing_exec_option, + "\\begin{lstlisting}\n", + oct_command, script_result, + "\\end{lstlisting}\n", + section3_title, + "\\begin{center}\n", + disp_fig, + "\\end{center}\n", + "\\end{document}"); + + fid = fopen (ofile, "w"); + fputs(fid, final_document); + fclose(fid); +endfunction + +function script_result = exec_script (ifile) + diary publish_tmp_script.txt + eval (ifile(1:end-2)) + diary off + fid = fopen ("publish_tmp_script.txt", 'r'); + script_result = fread (fid, '*char')'; + fclose(fid); + delete ("publish_tmp_script.txt"); +endfunction + +function [section3_title, disp_fig] = exec_print (ifile, options) + figures = findall (0, "type", "figure"); + section3_title = ""; + disp_fig = ""; + if (!isempty (figures)) + for nfig = 1:length (figures) + figure (figures(nfig)); + print (sprintf ("%s%d.%s", ifile(1:end-2), nfig, options.imageFormat), + sprintf ("-d%s", options.imageFormat), "-color"); + if (strcmpi (options.format, "html")); + section3_title = "

Generated graphics

\n"; + disp_fig = strcat (disp_fig, ""); + elseif (strcmpi (options.format, "latex")) + section3_title = "\\section*{Generated graphics}\n"; + disp_fig = strcat (disp_fig, "\\includegraphics[scale=0.6]{", ifile(1:end-2), + sprintf("%d",nfig), "}\n"); + endif + endfor + endif +endfunction + +# TODO +# * ADD VARARGIN FOR ADDITIONAL FILES SOURCES TO BE INLCUDED AS +# APPENDICES (THIS SOLVES THE PROBLEM OF FUNCTIONS SINCE YOU CAN +# PUT THE FUNCTION CALL IN SCRIPT CALL PUBLISH(SCRIPT) AND ADD +# THE FUNCTIONS CODE AS APPENDIX) +# +# * KNOWN PROBLEM: THE COMMENTING LINES IN HTML