Mercurial > forge
view main/miscellaneous/inst/publish.m @ 9636:b688d8814e55 octave-forge
publish: fix bug due to incorrectly named variables
author | carandraug |
---|---|
date | Mon, 12 Mar 2012 15:16:22 +0000 |
parents | 8a3a1c787d24 |
children | 958b9eb659a8 |
line wrap: on
line source
## Copyright (C) 2010 Fotios Kasolis <fotios.kasolis@gmail.com> ## ## 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 <http://www.gnu.org/licenses/>. ## -*- 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 = "<html>\n<body>\n"; html_end = "</body>\n</html>\n"; if options.showCode section1_title = "<h2>Source code</h2>\n"; fid = fopen (ifile, "r"); source_code = fread (fid, "*char")'; fclose(fid); else section1_title = ""; source_code = ""; endif if options.evalCode section2_title = "<h2>Execution results</h2>\n"; oct_command = strcat ("<listing>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, "<listing>\n", source_code,"\n",... "</listing>\n", section2_title, oct_command, script_result,... "</listing>", 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'); scriptResult = 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 = "<h2>Generated graphics</h2>\n"; disp_fig = strcat (disp_fig, "<img src=\"", ifile(1:end-2), sprintf ("%d", nfig), ".", options.imageFormat, "\"/>"); 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 % TO DO % 1) MOVE PRINT TO FUNCTION (DONE) % 2) REMOVE PATH RELATED THINGS SINCE IT IS NOT AS TRIVIAL TO DO (DONE) % 3) 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) % 4) KNOWN PROBLEM: THE COMMENTING LINES IN HTML