%D \module
%D   [       file=verb-pas,
%D        version=1999.12.09,
%D          title=\CONTEXT\ Verbatim Macros,
%D       subtitle=Pretty \PASCAL\ and \MODULA\ Verbatim,
%D         author=Berend de Boer,
%D           date=\currentdate,
%D      copyright={Berend de Boer \& Hans Hagen}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

% This module will be cleaned up a bit in the process of more
% flexible verbatim options.

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

%D Typeset Pascal(-like) code:
%D
%D \startbuffer
%D \startPAS
%D program Hello;
%D
%D begin
%D   writeln('hello world.');
%D end.
%D \stopPAS
%D \stopbuffer
%D
%D Berend's preferences:
%D
%D \startbuffer[setup]
%D \setuptyping
%D   [DELPHI]
%D   [palet=,icommand=\bf,vcommand=,ccommand=\it]
%D \stopbuffer

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

\unprotect

\doglobal\newif\ifinPASbracketcomment
\doglobal\newif\ifinPASslashstarcomment
\doglobal\newif\ifinPASslashslashcomment


\gdef\PASsetspecials%
  {\PLsetspecials
   \setpretty`\#=32
   \setpretty`\%=41
   \setpretty`\:=41
   \setpretty`\/=43
   \setpretty`\*=44
   \setpretty`\{=45 \setpretty`\}=46 }

\gdef\PASsethandlers%
  {\PLsethandlers
   \installprettyhandler 43 \PAStypefourthree
   \installprettyhandler 44 \PAStypefourfour
   \installprettyhandler 45 \PAStypefourfive
   \installprettyhandler 46 \PAStypefoursix }

\gdef\PASsetcontrols%
  {\PLsetcontrols
   \def\flushrestofverbatimline%
     {\endPLtypesix
      \ifinPASslashslashcomment
        \PASstopslashslashcomment
      \fi
      \PLverbosefalse
      \PLverboseskipped=0}}

\gdef\PASsetvariables
  {\PLsetvariables
   \global\inPASbracketcommentfalse
   \global\inPASslashstarcommentfalse
   \global\inPASslashslashcommentfalse}

\gdef\setupprettyPAStype%
  {\def\prettyidentifier{PAS}%
   \let\PLidentifiers=\PASidentifiers
   \let\PLvariables=\PASvariables
   \PASsetvariables
   \PASsetcontrols
   \PASsethandlers
   \PASsetspecials
   \PLsetdiagnostics}

% the // and /* comments

\gdef\PAStypefourthree%
  {\handlenextnextpretty\doPAStypefourthree\PLtypefourtwo}

\gdef\doPAStypefourthree#1#2%
  {\endPLtypesix
   \ifinPLcomment
     \let\next=\PLtypefourtwo
   \else
     \ifinPLsingle
       \let\next=\PLtypefourtwo
     \else
       \getprettydata{#2}%
       \ifnum\prettytype=43
         \PLverbosecorrection
         \let\next=\PASstartslashslashcomment
       \else\ifnum\prettytype=44
         \PLverbosecorrection
         \let\next=\PASstartslashstarcomment
       \else
         \let\next=\PLtypefourtwo
       \fi\fi
     \fi
   \fi
   \next{#1}#2}

\gdef\PASstartslashstarcomment#1#2%
  {\global\inPLcommenttrue
   \global\inPASslashstarcommenttrue
   \prettynaturalfont
   \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty}

\gdef\PASstopslashstarcomment#1#2%
  {\beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
   \verbatimfont
   \global\inPLcommentfalse
   \global\inPASslashstarcommentfalse}

\gdef\PASstartslashslashcomment#1#2%
  {\global\inPLcommenttrue
   \global\inPASslashslashcommenttrue
   \prettynaturalfont
   \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty}

\gdef\PASstopslashslashcomment%
  {\verbatimfont
   \inPLcommentfalse
   \inPASslashslashcommentfalse}

% \gdef\dodoPAStypefourthree% #1%
%   {\endPLtypesix
%    \handlenextnextpretty\dododoPAStypefourthree\dodododoPLtypefourthree}

% \gdef\dododoPAStypefourthree%
%   {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoPAStypefourthree}

% \gdef\dodododoPAStypefourthree#1#2%
%   {\ifinPLcomment
%      \getpretties{#1}{#2}%
%    \else
%      \global\inPLcommenttrue
%      \PLverbosecorrection
%      \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
%    \fi}

\gdef\PAStypefourfour%
  {\handlenextnextpretty\doPAStypefourfour\PLtypefourtwo}

\gdef\doPAStypefourfour#1#2%
  {\ifinPASslashstarcomment
     \getprettydata{#2}%
     \ifnum\prettytype=43
       \PASstopslashstarcomment{#1}#2%
     \else
       \endPLtypesix
       \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
       \expandafter#2%
     \fi
   \else
     \endPLtypesix
     \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
     \expandafter#2%
   \fi}


% the { and } comments
% we assume { is closed by } and do not follow the braindead Standard
% Pascal standard in this respect
% Note: brackets are not output correctly if natural font is \tf.
% Therefore natural font is default to \tttf now (Hans is this ok??)
% You have to use postscript fonts it seems to get brackets in that case.

\gdef\PAStypefourfive#1%
  {\endPLtypesix
   \ifinPLcomment
     \getpretty{#1}%
   \else
     \ifinPLsingle
       \getpretty{#1}%
     \else
       \global\inPLcommenttrue
       \global\inPASbracketcommenttrue
       \prettynaturalfont
       \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
     \fi
   \fi}

\gdef\PAStypefoursix#1%
  {\endPLtypesix
   \ifinPASbracketcomment
     \prettynaturalfont\beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
     \verbatimfont
     \global\inPLcommentfalse
     \global\inPASbracketcommentfalse
   \else
     \getpretty{#1}%
   \fi}


% Standard Pascal keywords (ISO/IEC 7185)

\useprettyidentifiers \PASidentifiers \PASsetspecials
  and array begin case const div do downto else end file
  for function goto if in label mod nil not of or packed
  procedure program record repeat set then to type until
  var while with

% Standard Pascal directives (ISO/IEC 7185)

\useprettyidentifiers \PASidentifiers \PASsetspecials
  forward

% Extended Pascal keywords (ISO/IEC 10206)

\useprettyidentifiers \PASidentifiers \PASsetspecials
  and_then bindable export import module only or_else
  otherwise pow protected qualified restricted

% Extended Pascal directives (ISO/IEC 10206)

\useprettyidentifiers \PASidentifiers \PASsetspecials
  implementation interface

% Object Pascal keywords (draft September 20, 1993)

\useprettyidentifiers \PASidentifiers \PASsetspecials
  abstract class constructor destructor inherited is
  property view

% Object Pascal directives (draft September 20, 1993)

\useprettyidentifiers \PASidentifiers \PASsetspecials
  override

% Delphi keywords

\useprettyidentifiers \PASidentifiers \PASsetspecials
  as asm dispinterface except exports finalization finally
  initialization inline library object out raise resourcestring
  shl shr string threadvar try unit uses xor

% Delphi directives
% the read and write directive have been skipped
% as they're pretty common procedure calls too

\useprettyidentifiers \PASidentifiers \PASsetspecials
  absolute assembler automated cdecl contains default dispid
  dynamic external far implements index message name near
  nodefault overload override package pascal private protected
  public published readonly register reintroduce requires
  resident safecall stdcall stored virtual writeonly

\useprettyidentifiers \PASvariables \PASsetspecials
  not-yet-defined

\protect \endinput
