ruler-0.4.0.0: src/ARule/PrettyPrintAG.cag
%%[1 ag
-------------------------------------------------------------------------
-- ARule's PP
-------------------------------------------------------------------------
ATTR AllARule AGARuleItf [ | | pp USE {>-<} {empty} : PP_Doc ]
SEM ARule
| Rule lhs . pp = "SEM" >#< pp (head @ndNmL) -- >#< "--" >#< ppCommas' @info
>-< indent atLhs2texDist ("|" >#< @rlNm >|< indent atLhs2texDist @eqns.pp)
SEM AEqn
| Eqn lhs . pp = let (w1,w2) = fromJust @lhs.mbDstWd
w = w1 + w2 + atDstFillLen
cmb l r = if @dest.isComposite
then if @dest.dstWd > w - atLhs2texDist
then l >-< strWhite w >|< r
else l >|< strWhite (w - @dest.dstWd) >|< r
else l >|< r
in cmb @dest.pp ("=" >|< strWhite atLhs2texDist >|< @val.pp)
| Err lhs . pp = "ERR" >#< @expr.pp
SEM AEqnDest
| Many lhs . pp = ppParensCommas @dests.ppL
SEM AExpr
| Expr lhs . pp = exprNeedPar ParCtxtOther nmUnk @expr.self @expr.pp
SEM AEqnDests [ | | ppL: {[PP_Doc]} ]
| Cons lhs . ppL = @hd.pp : @tl.ppL
| Nil lhs . ppL = []
-------------------------------------------------------------------------
-- Context of ANm
-------------------------------------------------------------------------
SEM AEqnDest
| One anm . isDest = True
-------------------------------------------------------------------------
-- ARule max column width info, for tabular like PP
-------------------------------------------------------------------------
ATTR AllARuleButARule [ mbDstWd: {Maybe (Int,Int)} | | mxDstNdWd, mxDstAtWd USE {`max`} {0}: Int ]
SEM ARule
| Rule loc . mbDstWd = Just (@eqns.mxDstNdWd,@eqns.mxDstAtWd)
SEM AEqnDest
| Many dests . mbDstWd = Nothing
-------------------------------------------------------------------------
-- ARule dest width info, for lining up multidestination AEqn
-------------------------------------------------------------------------
ATTR AEqnDest [ | | dstWd: Int ]
ATTR AEqnDests [ | | dstWdL: {[Int]} ]
SEM AEqnDest
| Many lhs . dstWd = sum @dests.dstWdL + length @dests.dstWdL + 1
| One lhs . dstWd = @anm.mxDstNdWd + @anm.mxDstAtWd + (if @anm.mxDstNdWd > 0 then 1 else 0)
SEM AEqnDests
| Cons lhs . dstWdL = @hd.dstWd : @tl.dstWdL
| Nil lhs . dstWdL = []
-------------------------------------------------------------------------
-- Node name of AEqnDest in an AEqn, for emitting only first of a series of same node names
-------------------------------------------------------------------------
ATTR AEqnDest AEqn [ | | ndStr: String ]
ATTR AEqnDest AEqn AEqns [ mbPrevNdStr: {Maybe String} | | ]
SEM AEqnDest
| Many lhs . ndStr = "??"
SEM AEqn
| Err lhs . ndStr = "??"
SEM AEqns
| Cons tl . mbPrevNdStr = fmap (const @hd.ndStr) @lhs.mbDstWd
SEM ARule
| Rule loc . mbPrevNdStr = Nothing
SEM AEqnDests
| Cons loc . mbPrevNdStr = Nothing
SEM AEqnDest
| Many loc . mbPrevNdStr = Nothing
-------------------------------------------------------------------------
-- Kind of lhs of eqn, composite?
-------------------------------------------------------------------------
ATTR AEqnDest [ | | isComposite: Bool ]
SEM AEqnDest
| Many lhs . isComposite = True
| One lhs . isComposite = False
%%]