blob: 1a64654f65ef6b27861712b06e5b57f09790076d [file] [log] [blame]
###############################################################################
# #
# Lout @PodSetup package for formatting Pod programs #
# #
# Jeffrey H. Kingston #
# 25 March 2000 #
# #
# This package uses a filtered body parameter to convert Pod source #
# code into Lout source. The filter program is prg2lout, which is #
# distributed with Lout and should be compiled and installed wherever #
# Lout itself is. #
# #
###############################################################################
export @Pod
def @PodSetup
named pipe { } # pipe through this first
named style
named @OrIfPlain left x right y
{ @BackEnd @Case { PlainText @Yield y else @Yield x } }
{ varying @OrIfPlain fixed } # print style
# the following options apply when style is "fixed"
named fixedtextfont { Courier Base -1p } # text font
named fixedtextbreak { adjust 1.0vx hyphen } # text para breaking
named fixedverbatimfont { Courier Base } # verbatim font
named fixedtabin { 8 } # tab interval
named fixedtabout { 8s } # tab width
named fixedlinenumbersfont { } # line numbers font
named fixedlinenumbersformat right @Body{ @Body } # line numbers format
named fixedparagap { 1.0v } # gap between paras
named fixedlistgap { 1.0v } # gap within lists
named fixedlistindent { 0s } # list label indent
named fixedlistrightindent { 0s } # list right indent
named fixedlistlabelwidth { 2.0f } # default label space
named fixedlistlabelfont { } # list label font
named fixedlistlabelformat right @Body { @Body } # list label format
named fixedaheadfont { Bold +4p } # =head1 font
named fixedaheadbreak { lines 1.1vx } # =head1 para break
named fixedaheadformat right @Body { //1v @Body } # =head1 format
named fixedbheadfont { Bold +2p } # =head2 font
named fixedbheadbreak { lines 1.1vx } # =head2 para break
named fixedbheadformat right @Body { @Body } # =head2 format
named fixedcheadfont { Bold } # =head3 font
named fixedcheadbreak { lines 1.1vx } # =head3 para break
named fixedcheadformat right @Body { @Body } # =head3 format
named fixeditalicfont { Slope } # font of I<>
named fixeditalicformat right @Body { @Body } # format of I<>
named fixedboldfont { Bold } # font of B<>
named fixedboldformat right @Body { @Body } # format of B<>
named fixedcodefont { Base } # font of C<>
named fixedcodeformat right @Body { @Body } # format of C<>
named fixedfilefont { Slope } # font of F<>
named fixedfileformat right @Body { @Body } # format of F<>
named fixedlinkfont { Slope } # font of L<>
named fixedlinkformat right @Body { @Underline @Body } # format of L<>
named fixedindexfont { Slope } # font of X<>
named fixedindexformat right @Body { @Body } # format of X<>
# the following options apply when style is "varying"
named varyingtextfont { Times Base } # text font
named varyingtextbreak { adjust 1.0vx hyphen } # text para breaking
named varyingverbatimfont { Courier Base -1p } # verbatim font
named varyingtabin { 8 } # tab interval
named varyingtabout { 8s } # tab width
named varyinglinenumbersfont { } # line numbers font
named varyinglinenumbersformat right @Body{ @Body } # line numbers format
named varyingparagap { 1.0v } # gap between paras
named varyinglistgap { 1.0v } # gap within lists
named varyinglistindent { 0s } # list label indent
named varyinglistrightindent { 0s } # list right indent
named varyinglistlabelwidth { 2.0f } # default label space
named varyinglistlabelfont { } # list label font
named varyinglistlabelformat right @Body { @Body } # list label format
named varyingaheadfont { Bold +4p } # =head1 font
named varyingaheadbreak { lines 1.1vx } # =head1 para break
named varyingaheadformat right @Body{ //1v @Body } # =head1 format
named varyingbheadfont { Bold +2p } # =head2 font
named varyingbheadbreak { lines 1.1vx } # =head2 para break
named varyingbheadformat right @Body{ @Body } # =head2 format
named varyingcheadfont { Bold } # =head3 font
named varyingcheadbreak { lines 1.1vx } # =head3 para break
named varyingcheadformat right @Body{ @Body } # =head3 format
named varyingitalicfont { Slope } # font of I<>
named varyingitalicformat right @Body { @Body } # format of I<>
named varyingboldfont { Bold } # font of B<>
named varyingboldformat right @Body { @Body } # format of B<>
named varyingcodefont { Courier Base -1p } # font of C<>
named varyingcodeformat right @Body { @Body } # format of C<>
named varyingfilefont { Slope } # font of F<>
named varyingfileformat right @Body { @Body } # format of F<>
named varyinglinkfont { Slope } # font of L<>
named varyinglinkformat right @Body { @Underline @Body } # format of L<>
named varyingindexfont { Slope } # font of X<>
named varyingindexformat right @Body{ @Body } # format of X<>
# the following options apply when style is "symbol"
named symboltextfont { Times Base } # text font
named symboltextbreak { adjust 1.0vx hyphen } # text para breaking
named symbolverbatimfont { Courier Base -1p } # verbatim font
named symboltabin { 8 } # tab interval
named symboltabout { 8s } # tab width
named symbollinenumbersfont { } # line numbers font
named symbollinenumbersformat right @Body { @Body } # line numbers format
named symbolparagap { 1.0v } # gap between paras
named symbollistgap { 1.0v } # gap within lists
named symbollistindent { 0s } # list label indent
named symbollistrightindent { 0s } # list right indent
named symbollistlabelwidth { 2.0f } # default label space
named symbollistlabelfont { } # list label font
named symbollistlabelformat right @Body { @Body } # list label format
named symbolaheadfont { Bold +4p } # =head1 font
named symbolaheadbreak { lines 1.1vx } # =head1 para break
named symbolaheadformat right @Body { //1v @Body } # =head1 format
named symbolbheadfont { Bold +2p } # =head2 font
named symbolbheadbreak { lines 1.1vx } # =head2 para break
named symbolbheadformat right @Body { @Body } # =head2 format
named symbolcheadfont { Bold } # =head3 font
named symbolcheadbreak { lines 1.1vx } # =head3 para break
named symbolcheadformat right @Body { @Body } # =head3 format
named symbolitalicfont { Slope } # font of I<>
named symbolitalicformat right @Body{ @Body } # format of I<>
named symbolboldfont { Bold } # font of B<>
named symbolboldformat right @Body { @Body } # format of B<>
named symbolcodefont { Courier Base -1p } # font of C<>
named symbolcodeformat right @Body { @Body } # format of C<>
named symbolfilefont { Slope } # font of F<>
named symbolfileformat right @Body { @Body } # format of F<>
named symbollinkfont { Slope } # font of L<>
named symbollinkformat right @Body { @Underline @Body } # format of L<>
named symbolindexfont { Slope } # font of X<>
named symbolindexformat right @Body { @Body } # format of X<>
@Begin
export
@PV @PPG @PLG @PLI @PLRI @PLLW @PLL @PHA @PHB @PHC
@PFI @PFB @PFC @PFF @PFL @PFX @A "$>" @PL
def @Pod
named style { style } # style
named pipe { pipe } # pipe through this
named textfont { dft } # text font
named textbreak { dft } # text para breaking
named verbatimfont { dft } # verbatim font
named tabin { dft } # tab interval
named tabout { dft } # tab width
named linenumbersfont { dft } # line numbers font
named paragap { dft } # gap between paras
named listgap { dft } # gap within lists
named listindent { dft } # list label indent
named listrightindent { dft } # list right indent
named listlabelwidth { dft } # default label space
named listlabelfont { dft } # list label font
named aheadfont { dft } # =head1 font
named aheadbreak { dft } # =head1 para break
named bheadfont { dft } # =head2 font
named bheadbreak { dft } # =head2 para break
named cheadfont { dft } # =head3 font
named cheadbreak { dft } # =head3 para break
named italicfont { dft } # font of I<>
named boldfont { dft } # font of B<>
named codefont { dft } # font of C<>
named filefont { dft } # font of F<>
named linkfont { dft } # font of L<>
named indexfont { dft } # font of X<>
body @Body # filtered, see below
@Begin
def @Test # returns x unless x is dft
left x
named iffixed {}
named ifvarying {}
named ifsymbol {}
{
x @Case {
dft @Yield {
style @Case {
fixed @Yield { iffixed }
varying @Yield { ifvarying }
symbol @Yield { ifsymbol }
}
}
else @Yield x
}
}
def @Else # returns x, or y if x is dft
left x
right y
{
x @Case {
dft @Yield y
else @Yield x
}
}
def @InitTab
{
tabin @Test
iffixed { fixedtabin }
ifvarying { varyingtabin }
ifsymbol { symboltabin }
}
def @InitTabWidth
{
tabout @Test
iffixed { fixedtabout }
ifvarying { varyingtabout }
ifsymbol { symboltabout }
}
def @Filter
{
pipe @Case {
"" @Yield {
"prg2lout -r -lPod" -i{@FilterIn} -o{@FilterOut} -e{@FilterErr}
-t{@InitTab} -T{@InitTabWidth}
}
else @Yield {
"cat" @FilterIn "|" pipe "|"
"prg2lout -r -lPod" -o{@FilterOut}
-e{@FilterErr} -t{@InitTab} -T{@InitTabWidth}
}
}
}
def @InitFont
{
textfont @Test
iffixed { fixedtextfont }
ifvarying { varyingtextfont }
ifsymbol { symboltextfont }
}
def @InitBreak
{
textbreak @Test
iffixed { fixedtextbreak }
ifvarying { varyingtextbreak }
ifsymbol { symboltextbreak }
}
def printverbatim
right x
{
def verbfont
{
verbatimfont @Test
iffixed { fixedverbatimfont }
ifvarying { varyingverbatimfont }
ifsymbol { symbolverbatimfont }
}
def verbatimstrut { @VContract { 0.5v @High ^/ / 0.5v @High } }
@OneCol verbfont @Font x |0io verbatimstrut
}
macro @PV { // printverbatim }
def paragraphgap
{
paragap @Test
iffixed { fixedparagap }
ifvarying { varyingparagap }
ifsymbol { symbolparagap }
}
macro @PPG { //paragraphgap }
def @PLG
{
listgap @Test
iffixed { fixedlistgap }
ifvarying { varyinglistgap }
ifsymbol { symbollistgap }
}
def @PLI
{
listindent @Test
iffixed { fixedlistindent }
ifvarying { varyinglistindent }
ifsymbol { symbollistindent }
}
def @PLRI
{
listrightindent @Test
iffixed { fixedlistrightindent }
ifvarying { varyinglistrightindent }
ifsymbol { symbollistrightindent }
}
def @PLLW right x
{
def defaultwidth
{
listlabelwidth @Test
iffixed { fixedlistlabelwidth }
ifvarying { varyinglistlabelwidth }
ifsymbol { symbollistlabelwidth }
}
def givenwidth
{
style @Case {
fixed @Yield { x"s" }
varying @Yield { x"f" }
symbol @Yield { x"f" }
}
}
x @Case {
"" @Yield defaultwidth
else @Yield givenwidth
}
}
def @PLL right x
{
def bullet
{
@BackEnd @Case {
PlainText @Yield "*"
else @Yield @Char "bullet"
}
}
def value
{
x @Case {
"*" @Yield bullet
else @Yield x
}
}
style @Case {
fixed @Yield fixedlistlabelformat {
{ listlabelfont @Else fixedlistlabelfont } @Font value }
varying @Yield varyinglistlabelformat {
{ listlabelfont @Else varyinglistlabelfont } @Font value }
symbol @Yield symbollistlabelformat {
{ listlabelfont @Else symbollistlabelfont } @Font value }
}
}
def @PHA right x
{
style @Case {
fixed @Yield fixedaheadformat {
{ aheadfont @Else fixedaheadfont } @Font
{ aheadbreak @Else fixedaheadbreak } @Break x }
varying @Yield varyingaheadformat {
{ aheadfont @Else varyingaheadfont } @Font
{ aheadbreak @Else varyingaheadbreak } @Break x }
symbol @Yield symbolaheadformat {
{ aheadfont @Else symbolaheadfont } @Font
{ aheadbreak @Else varyingaheadbreak } @Break x }
}
}
def @PHB right x
{
style @Case {
fixed @Yield fixedbheadformat {
{ bheadfont @Else fixedbheadfont } @Font
{ bheadbreak @Else fixedbheadbreak } @Break x }
varying @Yield varyingbheadformat {
{ bheadfont @Else varyingbheadfont } @Font
{ bheadbreak @Else varyingbheadbreak } @Break x }
symbol @Yield symbolbheadformat {
{ bheadfont @Else symbolbheadfont } @Font
{ bheadbreak @Else varyingbheadbreak } @Break x }
}
}
def @PHC right x
{
style @Case {
fixed @Yield fixedcheadformat {
{ cheadfont @Else fixedcheadfont } @Font
{ cheadbreak @Else fixedcheadbreak } @Break x }
varying @Yield varyingcheadformat {
{ cheadfont @Else varyingcheadfont } @Font
{ cheadbreak @Else varyingcheadbreak } @Break x }
symbol @Yield symbolcheadformat {
{ cheadfont @Else symbolcheadfont } @Font
{ cheadbreak @Else varyingcheadbreak } @Break x }
}
}
def @PFI right x
{
style @Case {
fixed @Yield fixeditalicformat {
{ italicfont @Else fixeditalicfont } @Font x }
varying @Yield varyingitalicformat {
{ italicfont @Else varyingitalicfont } @Font x }
symbol @Yield symbolitalicformat {
{ italicfont @Else symbolitalicfont } @Font x }
}
}
def @PFB right x
{
style @Case {
fixed @Yield fixedboldformat {
{ boldfont @Else fixedboldfont } @Font x }
varying @Yield varyingboldformat {
{ boldfont @Else varyingboldfont } @Font x }
symbol @Yield symbolboldformat {
{ boldfont @Else symbolboldfont } @Font x }
}
}
def @PFC right x
{
style @Case {
fixed @Yield fixedcodeformat {
{ codefont @Else fixedcodefont } @Font x }
varying @Yield varyingcodeformat {
{ codefont @Else varyingcodefont } @Font x }
symbol @Yield symbolcodeformat {
{ codefont @Else symbolcodefont } @Font x }
}
}
def @PFF right x
{
style @Case {
fixed @Yield fixedfileformat {
{ filefont @Else fixedfilefont } @Font x }
varying @Yield varyingfileformat {
{ filefont @Else varyingfilefont } @Font x }
symbol @Yield symbolfileformat {
{ filefont @Else symbolfilefont } @Font x }
}
}
def @PFL right x
{
style @Case {
fixed @Yield fixedlinkformat {
{ linkfont @Else fixedlinkfont } @Font x }
varying @Yield varyinglinkformat {
{ linkfont @Else varyinglinkfont } @Font x }
symbol @Yield symbollinkformat {
{ linkfont @Else symbollinkfont } @Font x }
}
}
def @PFX right x
{
style @Case {
fixed @Yield fixedindexformat {
{ indexfont @Else fixedindexfont } @Font x }
varying @Yield varyingindexformat {
{ indexfont @Else varyingindexfont } @Font x }
symbol @Yield symbolindexformat {
{ indexfont @Else symbolindexfont } @Font x }
}
}
def @A # get characters from the Adobe Symbol font
left sym
right x
{
style @Case {
symbol @Yield { { Symbol Base } @Font @Char sym }
else @Yield { x }
}
}
macro "$>" { {} & }
def pl # for formatting line numbers
right x
{
def strut { @VContract { 0.5v @High ^/ / 0.5v @High } }
strut & style @Case {
fixed @Yield fixedlinenumbersformat {
{ linenumbersfont @Else fixedlinenumbersfont } @Font x
}
varying @Yield varyinglinenumbersformat {
{ linenumbersfont @Else varyinglinenumbersfont } @Font x
}
symbol @Yield symbollinenumbersformat {
{ linenumbersfont @Else symbollinenumbersfont } @Font x
}
}
}
macro @PL { // pl }
@InitFont @Font @InitBreak @Break @Body
@End @Pod
@End @PodSetup