%D \module
%D   [       file=verb-js,
%D        version=1998.02.07,
%D          title=\CONTEXT\ Verbatim Macros,
%D       subtitle=Pretty \JAVASCRIPT\ Verbatim,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{ConTeXt Verbatim Macros / Pretty JavaScript Verbatim}

%D In \CONTEXT\ we support \JAVASCRIPT\ inclusion in \PDF\
%D documents and thereby enter the field of authoring. Of
%D course we also want to pretty print such scripts, that look
%D like:
%D
%D \startJS
%D alfa = beta*2 ;       // both alfa and beta are numbers // indeed
%D if (odd(alfa))
%D   { do_something() }
%D else
%D   { do_nothing() }    /* As we can see /* in this example */ there
%D how_about(alfa) ;        is no fi needed. Also no semicolons are
%D or_about(beta) ;         needed after a right brace. */
%D \stopJS
%D
%D Because \JAVASCRIPT\ looks much like \PERL, we will use
%D a slightly adapted \PERL\ visualization. First we load the
%D \PERL\ module:

\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi

\unprotect

%D The main difference between the \JAVASCRIPT\ and \PERL\
%D interpreters concern comments. Where \TEX, \METAPOST\ and
%D \PERL\ have one comment symbol (\type{%}, \type{%} and
%D \type{#}), \JAVA\ has the one line comment sequence
%D \type{//} and the multi line comment delimiters \type{/*}
%D and \type{*/}.
%D
%D We need a counter to keep track of multi line comment
%D nesting.

\newcount\JScommentlevel

%D We handle both \type{%} and \type{#} a bit different:

\gdef\JSsetspecials%
  {\PLsetspecials
   \setpretty`\#=32
   \setpretty`\%=41
   \setpretty`\/=43
   \setpretty`\*=44 }

%D We also need a few more handlers: one for \type{//} and
%D \type{/*} and one for \type{*/}.

\gdef\JSsethandlers%
  {\PLsethandlers
   \installprettyhandler 43 \JStypefourthree
   \installprettyhandler 44 \JStypefourfour }

%D We can inherit most of the settings:

\gdef\JSsetcontrols%
  {\PLsetcontrols
   \def\flushrestofverbatimline%
     {\endPLtypesix
      \ifcase\JScommentlevel \inPLcommentfalse \fi
      \PLverbosefalse
      \PLverboseskipped=0}}

\gdef\JSsetvariables
  {\PLsetvariables
   \global\JScommentlevel=0 }

\gdef\setupprettyJStype%
  {\def\prettyidentifier{JS}%
   \let\PLidentifiers=\JSidentifiers
   \let\PLvariables=\JSvariables
   \JSsetvariables
   \JSsetcontrols
   \JSsethandlers
   \JSsetspecials
   \PLsetdiagnostics}

%D The main complication is that we have to look upto four
%D characters ahead. Such macros are hard to understand but
%D they do work!

\gdef\JStypefourthree%
  {\handlenextnextpretty\doJStypefourthree\PLtypefourtwo}

\gdef\doJStypefourthree#1#2%
  {\getprettydata{#2}%
   \ifnum\prettytype=43
     \let\next=\dodoJStypefourthree
   \else\ifnum\prettytype=44
     \global\advance\JScommentlevel by 1
     \global\inPLcommenttrue
     \PLverbosecorrection
     \let\next=\JStogglecomment
   \else
     \let\next=\PLtypefourtwo
   \fi\fi
   \next{#1}#2}

\gdef\JStogglecomment#1#2%
  {\ifnum\JScommentlevel=1
     \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
   \else
     \getpretties{#1}{#2}%
   \fi}

\gdef\dodoJStypefourthree% #1%
  {\endPLtypesix
   \handlenextnextpretty\dododoJStypefourthree\dodododoPLtypefourthree}

\gdef\dododoJStypefourthree%
  {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoJStypefourthree}

\gdef\dodododoJStypefourthree#1#2%
  {\ifinPLcomment
     \getpretties{#1}{#2}%
   \else
     \global\inPLcommenttrue
     \PLverbosecorrection
     \ifnaturaltextext
       \let\next\naturaltextext
     \else
       \def\next{\beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty}%
     \fi
     \expandafter\next
   \fi}

\gdef\JStypefourfour%
  {\handlenextnextpretty\doJStypefourfour\PLtypefourtwo}

\gdef\doJStypefourfour#1#2%
  {\getprettydata{#2}%
   \ifnum\prettytype=43
     \JStogglecomment{#1}#2%
     \global\advance\JScommentlevel by -1
     \ifcase\JScommentlevel \global\inPLcommentfalse \fi
   \else
     \endPLtypesix
     \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
     \expandafter#2%
   \fi}

%D We need different (less) reserved words. This list replaces
%D the \PERL\ one.

\useprettyidentifiers \JSidentifiers \JSsetspecials
  abstract boolean break byte case catch char class const
  continue default delete do double else extends false final
  finally float for function goto if implements import in
  instanceof int interface long native new null package
  private protected public return short static super switch
  synchronized this throw throws transient true try var void
  while with

\useprettyidentifiers \JSvariables \JSsetspecials
  not-yet-defined

\protect \endinput
