Statalist The Stata Listserver


[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

Re: st: RE: Creating HTML from SMCL log file including graphics - revised log2html.ado


From   "David Elliott" <dcelliott@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: RE: Creating HTML from SMCL log file including graphics - revised log2html.ado
Date   Thu, 18 May 2006 22:12:06 -0300

Per Nick's admonishment above, I enclose a derivative of log2html
called grlog2html (For GRaphical log to html) and wish to acknowledge
that the bulk of this routine was created by Kit Baum, Nick Cox and
Bill Rising.  I added a section to generate image tags allowing graphs
that had been exported to png files to be displayed in the HTML
output.  The additional code is clearly marked and I encourage any
interested persons (especially better coders than I am) to have a go
at it.  The program's default behaviour should be identical with
log2html.  To activate graph image tagging, include the graphs
argument which may be abbreviated to gr.

I'd also like to apologize to Nick and his co-authors and to the
Statalist for submitting this using the same name which was against
protocol.

"Never attribute to malice what can be explained by stupidity" - Hanlon's Razor

DCE

X--- revised grlog2html.ado  code follows ---X

*! grlog2html 1.2.8  cfb/njc/br/dce 08may2006
*! log2html 1.2.8  cfb/njc/br 09feb2005
*! log2html 1.2.7  cfb/njc/br 12oct2004
*! log2html 1.2.6  cfb/njc/br 2oct2003
*! log2html 1.2.5  cfb/njc/br 17Jun2003
*! log2html 1.2.0  cfb/njc  3Mar2003
*! log2html 1.1.1  cfb/njc  17Dec2001
program grlog2html
  version 8.0
  syntax anything(name=smclfile id="The name of a .smcl logfile is")  ///
  [, ERASE replace TItle(str) INput(str) Result(str) BG(str)  ///
	LINEsize(numlist max=1 int >=40 <=255) ///
  TExt(str) ERRor(str) PERcentsize(integer 100) BOLD CSS(str) ///
	SCHeme(str) GRaphs]
// ###########Note addition of a GRaphs switch###########
  // syntax processing

  if "`css'" != "" & `"`input'`result'`text'`error'`bg'`scheme'"' != "" {
      di as err "if CSS is specified, you may not specify any colors"
      exit 198
  }

  if "`scheme'" != "" {
      if `"`input'`result'`text'`error'`bg'"' != "" {
          di as err ///
      "if a scheme is specified, you may not specify any colors"
          exit 198
      }

      local names   "bg     input  result text   error"
      local cblack  "000000 ffffff ffff00 00ff00 ff0000"
      local cwhite  "ffffff 000000 000000 000000 ff0000"
      local cblue   "000090 ffffff ffff00 00ff00 ff0000"
      local cugly   "ff00ff 9999ff ff99ff 00ff00 cccc00"
      local cyellow "ffffcc cc00cc 0000cc 000000 ff0000"

      local cnt 1
      foreach name of local names {
          local `name' : word `cnt++' of `c`scheme''
      }
      if "`bg'"=="" {
          display as error "scheme `scheme' does not exist!
Available schemes are "
          display as error "  black, white, blue, and yellow."
          exit 198
      }

   }

  else {
      if "`input'" == ""  local input "CC6600"
      if "`result'" == "" local result "000099"
      if "`text'" == ""   local text "000000"
      if "`error'" == ""  local error "dd0000"
      if "`bg'" == ""     local bg "ffffff"
      else {
          if "`bg'" == "gray" | "`bg'" == "grey" {
              local bg "cccccc"
          }
      }
  }

  if `percentsize' <= 0 {
      display as error "percentsize() must be an integer larger than zero"
      exit 198
  }

  // filenames and handles

  tempname hi ho
  tempfile htmlfile
  local origfile `smclfile'
  if (!index(lower("`origfile'"),".smcl")) {
      local origfile  "`origfile'.smcl"
      }
  local smclfile : subinstr local smclfile ".smcl" ""
  local smclfile : subinstr local smclfile ".SMCL" ""
  local smclfile : subinstr local smclfile `"""' "", all /* '"' (for
fooling emacs) */
  local smclfile : subinstr local smclfile "`" "", all
  local smclfile : subinstr local smclfile "'" "", all
  local outfile `"`smclfile'.html"'
  if "`linesize'" != "" local ll "ll(`linesize')"
  qui log html `"`origfile'"' `"`htmlfile'"', `replace' yebf whbf `ll'

  // line-by-line processing

  file open `hi' using `"`htmlfile'"', r
  file open `ho' using `"`outfile'"', w `replace'
  file write `ho'  _n
  file write `ho' "<html>" _n "<head>" _n
  if `"`title'"' ~= "" {
      file write `ho' `"<title>`title'</title>"' _n
  }
  file write `ho' `"<meta http-equiv="Content-type"
content="text/html; charset=iso-8859-1">"' _newline
  file write `ho' `"<meta http-equiv="Content-Style-Type"
content="text/css">"' _newline
  if "`css'" == "" {
      file write `ho' `"<style type="text/css">"' _newline
      file write `ho' "BODY{background-color: `bg';" _newline
      file write `ho' `"    font-family: monaco, "courier new",
monospace;"' _newline
      if `percentsize' != 100 {
          file write `ho' "font-size:`percentsize'%;" _newline
      }
      file write `ho' "     color: #`text'}" _newline
      if "`bold'" != "" {
          file write `ho' ".input, .result, .error{font-weight:
bold}" _newline
      }
      file write `ho' ".input {color: #`input'}" _newline
      file write `ho' ".result{color: #`result'}" _newline
      file write `ho' ".error{color: #`error'}" _newline
      file write `ho' "</style>" _newline
  }
  else {
      file write `ho' `"<link rel="stylesheet" href="`css'">"' _newline
  }
  file write `ho' "</head>" _newline
  file write `ho' "<body>" _newline
  if `"`title'"' != "" {
      file write `ho' `"<h2>`title'</h2>"' _n
  }

  file read `hi' line

  local cprev = 0

  while r(eof) == 0 {

      // change <p> (which should be a div) to a <br><br>
      local line : ///
  subinstr local line "<p>" "<br><br>", all

      local line: ///
  subinstr local line "<b>. " "<span class=input>. ", count(local c)

      // catch continuation lines
      local word1 : word 1 of `"`line'"'
      if substr(`"`word1'"',1,7) == "<b>&gt;" & `cprev' {
          local line : ///
  subinstr local line "<b>" "<span class=input>", count(local c)
          }
      else {
          local line: ///
  subinstr local line "<b>" "<span class=result>", all
          }

      local line: subinstr local line "</b>" "</span>", all

      // check for error number
      if substr(`"`word1'"',1,2) == "r(" {
          if real(substr(`"`word1'"',3,index(`"`word1'"',")")-3)) < . {
               local line `"<div class=error> `line' </div>"'
          }
      }

// ###########Graphic inclusion routine starts here###########
  if "`graphs'" != "" {
      if regexm(`"`line'"',"file.*written in PNG format") { //check
if png was written
          local gr_name : word 2 of `line'
          if regexm(`"`gr_name'"',"(.*\\.*)") {  //backslash
              local gr_name = ///
              word(subinstr(`"`gr_name'"',"\"," ",.),-1)
              }
          if regexm(`"`gr_name'"',"(.*/.*)") {  //forward slash
              local gr_name = ///
              word(subinstr(`"`gr_name'"',"/"," ",.),-1)
              }
          if regexm(`"`gr_name'"',".*png")==0 { //add .png if missing
              local gr_name = `"`gr_name'.png"'
          }
          local line "<img src="`gr_name'" alt="`gr_name'" />"
     }
}
// ###########and finishes here###########

      file write `ho' `"`macval(line)'"' _n
      local cprev = `c'
      file read `hi' line
  }

  file write `ho' "</body>" _n "</html>" _n
   file close `ho'

  di _n `"HTML log file `outfile' created"'
  if "`erase'" ~= "" {
      erase `"`origfile'"'
      }
end

X--- code ends ---X

On 5/18/06, Nick Cox <n.j.cox@durham.ac.uk> wrote:
Please change your program name immediately.

-log2html- is an existing program by Kit
Baum, Bill Rising and myself.

The FAQ is explicit on etiquette here (6.4)

"... anything placed in the SSC Archive is tacitly put
in the public domain. In practice, you can probably take
anything published in either medium and modify it as you
will -- especially if you do that privately -- but publicly
we recommend that unless you are the original author, you
should change the name of the program, take all blame for
any limitations your changes produce, and imply that a suitably
large portion of the credit for the program belongs to
the original authors."

I want to make it completely clear to the Stata
community that you have not
sought, and have not received, permission to take over our
program.

Conversely, I, and I expect my co-authors, will be
delighted if you can build on our work and improve it,
and for everyone's clarity you must do that in the
way indicated.

Nick
n.j.cox@durham.ac.uk

David Elliott

> *This may appear as a double post to some but my original post did not
> seem to make it to the http://www.stata.com/statalist/archive/2006-05/
> archive so it may be lost in cyberspace*
>
> Revised log2html.ado (BETA)
>
> Please find below a revision of a routine that takes a smcl log file
> and converts it to HTML.  I have added a component that will add <img>
> tags to the HTML output to display png graphs that have been exported.
>
> Requirements:
>
> (1) Graphs must have been successfully exported with -graph export
> *.png- or -graph export *, as(png)-
> (2) The png graphs, logfile, and html file must all be in the
> same directory
> (3) Graphs are not included by default and must be specified using the
> graphs option which can be abbreviated to gr
>
> Notes:
> (1) If the HTML file is moved, all referenced graphs must be moved as
> well or else the links will break.
> (2) The routine *should* work for *nix style paths with forward
> slashes but has not been tested in that environment.
> (3) If someone has a better way to pop a filename off the end of a
> path, or a way to implement relative addressing to graphics files in
> other than the logfile directory, please offer suggestions.
>
> X--- revised log2html.ado  code follows ---X
>
> *! log2html 1.2.8  cfb/njc/br/dce 08may2006
> *! log2html 1.2.8  cfb/njc/br 09feb2005
> *! log2html 1.2.7  cfb/njc/br 12oct2004
> *! log2html 1.2.6  cfb/njc/br 2oct2003
> *! log2html 1.2.5  cfb/njc/br 17Jun2003
> *! log2html 1.2.0  cfb/njc  3Mar2003
> *! log2html 1.1.1  cfb/njc  17Dec2001
> program log2html
>     version 8.0
>     syntax anything(name=smclfile id="The name of a .smcl
> logfile is")  ///
>     [, ERASE replace TItle(str) INput(str) Result(str) BG(str)
> LINEsize(numlist max=1 int >=40 <=255) ///
>     TExt(str) ERRor(str) PERcentsize(integer 100) BOLD CSS(str)
> SCHeme(str) GRaphs]
> // ###########Note addition of a GRaphs switch###########
>     // syntax processing
>
>     if "`css'" != "" & `"`input'`result'`text'`error'
> `bg'`scheme'"' != "" {
>         di as err "if CSS is specified, you may not specify
> any colors"
>         exit 198
>     }
>
>     if "`scheme'" != "" {
>         if `"`input'`result'`text'`error'`bg'"' != "" {
>             di as err ///
>         "if a scheme is specified, you may not specify any colors"
>             exit 198
>         }
>
>         local names   "bg     input  result text   error"
>         local cblack  "000000 ffffff ffff00 00ff00 ff0000"
>         local cwhite  "ffffff 000000 000000 000000 ff0000"
>         local cblue   "000090 ffffff ffff00 00ff00 ff0000"
>         local cugly   "ff00ff 9999ff ff99ff 00ff00 cccc00"
>         local cyellow "ffffcc cc00cc 0000cc 000000 ff0000"
>
>         local cnt 1
>         foreach name of local names {
>             local `name' : word `cnt++' of `c`scheme''
>         }
>         if "`bg'"=="" {
>             display as error "scheme `scheme' does not exist!
> Available schemes are "
>             display as error "  black, white, blue, and yellow."
>             exit 198
>         }
>
>      }
>
>     else {
>         if "`input'" == ""  local input "CC6600"
>         if "`result'" == "" local result "000099"
>         if "`text'" == ""   local text "000000"
>         if "`error'" == ""  local error "dd0000"
>         if "`bg'" == ""     local bg "ffffff"
>         else {
>             if "`bg'" == "gray" | "`bg'" == "grey" {
>                 local bg "cccccc"
>             }
>         }
>     }
>
>     if `percentsize' <= 0 {
>         display as error "percentsize() must be an integer
> larger than zero"
>         exit 198
>     }
>
>     // filenames and handles
>
>     tempname hi ho
>     tempfile htmlfile
>     local origfile `smclfile'
>     if (!index(lower("`origfile'"),".smcl")) {
>         local origfile  "`origfile'.smcl"
>         }
>     local smclfile : subinstr local smclfile ".smcl" ""
>     local smclfile : subinstr local smclfile ".SMCL" ""
>     local smclfile : subinstr local smclfile `"""' "", all /* '"' (for
> fooling emacs) */
>     local smclfile : subinstr local smclfile "`" "", all
>     local smclfile : subinstr local smclfile "'" "", all
>     local outfile `"`smclfile'.html"'
>     if "`linesize'" != "" local ll "ll(`linesize')"
>     qui log html `"`origfile'"' `"`htmlfile'"', `replace'
> yebf whbf `ll'
>
>     // line-by-line processing
>
>     file open `hi' using `"`htmlfile'"', r
>     file open `ho' using `"`outfile'"', w `replace'
>     file write `ho'  _n
>     file write `ho' "<html>" _n "<head>" _n
>     if `"`title'"' ~= "" {
>         file write `ho' `"<title>`title'</title>"' _n
>     }
>     file write `ho' `"<meta http-equiv="Content-type"
> content="text/html; charset=iso-8859-1">"' _newline
>     file write `ho' `"<meta http-equiv="Content-Style-Type"
> content="text/css">"' _newline
>     if "`css'" == "" {
>         file write `ho' `"<style type="text/css">"' _newline
>         file write `ho' "BODY{background-color: `bg';" _newline
>         file write `ho' `"    font-family: monaco, "courier new",
> monospace;"' _newline
>         if `percentsize' != 100 {
>             file write `ho' "font-size:`percentsize'%;" _newline
>         }
>         file write `ho' "     color: #`text'}" _newline
>         if "`bold'" != "" {
>             file write `ho' ".input, .result, .error{font-weight:
> bold}" _newline
>         }
>         file write `ho' ".input {color: #`input'}" _newline
>         file write `ho' ".result{color: #`result'}" _newline
>         file write `ho' ".error{color: #`error'}" _newline
>         file write `ho' "</style>" _newline
>     }
>     else {
>         file write `ho' `"<link rel="stylesheet"
> href="`css'">"' _newline
>     }
>     file write `ho' "</head>" _newline
>     file write `ho' "<body>" _newline
>     if `"`title'"' != "" {
>         file write `ho' `"<h2>`title'</h2>"' _n
>     }
>
>     file read `hi' line
>
>     local cprev = 0
>
>     while r(eof) == 0 {
>
>         // change <p> (which should be a div) to a <br><br>
>         local line : ///
>     subinstr local line "<p>" "<br><br>", all
>
>         local line: ///
>     subinstr local line "<b>. " "<span class=input>. ", count(local c)
>
>         // catch continuation lines
>         local word1 : word 1 of `"`line'"'
>         if substr(`"`word1'"',1,7) == "<b>&gt;" & `cprev' {
>             local line : ///
>     subinstr local line "<b>" "<span class=input>", count(local c)
>             }
>         else {
>             local line: ///
>     subinstr local line "<b>" "<span class=result>", all
>             }
>
>         local line: subinstr local line "</b>" "</span>", all
>
>         // check for error number
>         if substr(`"`word1'"',1,2) == "r(" {
>             if
> real(substr(`"`word1'"',3,index(`"`word1'"',")")-3)) < . {
>                  local line `"<div class=error> `line' </div>"'
>             }
>         }
>
> // ###########Graphic inclusion routine starts here###########
>     if "`graphs'" != "" {
>         if regexm(`"`line'"',"file.*written in PNG format") { //check
> if png was written
>             local gr_name : word 2 of `line'
>             if regexm(`"`gr_name'"',"(.*\\.*)") {  //backslash
>                 local gr_name = ///
>                 word(subinstr(`"`gr_name'"',"\"," ",.),-1)
>                 }
>             if regexm(`"`gr_name'"',"(.*/.*)") {  //forward slash
>                 local gr_name = ///
>                 word(subinstr(`"`gr_name'"',"/"," ",.),-1)
>                 }
>             if regexm(`"`gr_name'"',".*png")==0 { //add .png
> if missing
>                 local gr_name = `"`gr_name'.png"'
>             }
>             local line "<img src="`gr_name'" alt="`gr_name'" />"
>        }
> }
> // ###########and finishes here###########
>
>         file write `ho' `"`macval(line)'"' _n
>         local cprev = `c'
>         file read `hi' line
>     }
>
>     file write `ho' "</body>" _n "</html>" _n
>      file close `ho'
>
>     di _n `"HTML log file `outfile' created"'
>     if "`erase'" ~= "" {
>         erase `"`origfile'"'
>         }
> end
>
> X--- code ends ---X
> Remember to have the extra carriage return after the end statement or
> you will get an unexpected end of file error ;-)
>

*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/


--
David Elliott

*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/



© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index