factor/basis/prettyprint/backend/backend.factor

210 lines
5.4 KiB
Factor
Raw Normal View History

2008-01-30 02:10:58 -05:00
! Copyright (C) 2003, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays byte-arrays byte-vectors generic
2008-04-30 17:11:55 -04:00
hashtables io assocs kernel math namespaces sequences strings
sbufs io.styles vectors words prettyprint.config
prettyprint.sections quotations io io.files math.parser effects
classes.tuple math.order classes.tuple.private classes
2008-08-01 15:29:48 -04:00
combinators colors ;
2007-09-20 18:09:08 -04:00
IN: prettyprint.backend
GENERIC: pprint* ( obj -- )
2008-06-08 16:32:55 -04:00
M: effect pprint* effect>string "(" swap ")" 3append text ;
2007-09-20 18:09:08 -04:00
: ?effect-height ( word -- n )
stack-effect [ effect-height ] [ 0 ] if* ;
: ?start-group ( word -- )
?effect-height 0 > [ start-group ] when ;
: ?end-group ( word -- )
?effect-height 0 < [ end-group ] when ;
\ >r hard "break-before" set-word-prop
\ r> hard "break-after" set-word-prop
! Atoms
: word-style ( word -- style )
2007-10-05 01:08:34 -04:00
dup "word-style" word-prop >hashtable [
[
2008-06-08 16:32:55 -04:00
[ presented set ]
[
[ parsing-word? ] [ delimiter? ] [ t eq? ] tri or or
[ bold font-style set ] when
] bi
2007-10-05 01:08:34 -04:00
] bind
] keep ;
2007-09-20 18:09:08 -04:00
: word-name* ( word -- str )
name>> "( no name )" or ;
2007-09-20 18:09:08 -04:00
: pprint-word ( word -- )
dup record-vocab
dup word-name* swap word-style styled-text ;
: pprint-prefix ( word quot -- )
<block swap pprint-word call block> ; inline
M: word pprint*
2008-06-08 16:32:55 -04:00
dup parsing-word? [
2007-09-20 18:09:08 -04:00
\ POSTPONE: [ pprint-word ] pprint-prefix
] [
2008-06-08 16:32:55 -04:00
{
[ "break-before" word-prop line-break ]
[ pprint-word ]
[ ?start-group ]
[ ?end-group ]
[ "break-after" word-prop line-break ]
} cleave
2007-09-20 18:09:08 -04:00
] if ;
M: real pprint* number>string text ;
M: f pprint* drop \ f pprint-word ;
! Strings
: ch>ascii-escape ( ch -- str )
H{
2008-02-11 15:19:47 -05:00
{ CHAR: \a CHAR: a }
2008-02-02 00:07:19 -05:00
{ CHAR: \e CHAR: e }
{ CHAR: \n CHAR: n }
{ CHAR: \r CHAR: r }
{ CHAR: \t CHAR: t }
{ CHAR: \0 CHAR: 0 }
{ CHAR: \\ CHAR: \\ }
{ CHAR: \" CHAR: \" }
2007-09-20 18:09:08 -04:00
} at ;
: unparse-ch ( ch -- )
2008-02-02 00:07:19 -05:00
dup ch>ascii-escape [ "\\" % ] [ ] ?if , ;
2007-09-20 18:09:08 -04:00
: do-string-limit ( str -- trimmed )
string-limit get [
dup length margin get > [
margin get 3 - head "..." append
] when
] when ;
: string-style ( obj -- hash )
[
presented set
2008-08-01 15:29:48 -04:00
T{ rgba f 0.3 0.3 0.3 1.0 } foreground set
2007-09-20 18:09:08 -04:00
] H{ } make-assoc ;
2007-12-03 19:19:18 -05:00
: unparse-string ( str prefix suffix -- str )
[ >r % do-string-limit [ unparse-ch ] each r> % ] "" make ;
2007-09-20 18:09:08 -04:00
2007-12-03 19:19:18 -05:00
: pprint-string ( obj str prefix suffix -- )
2007-09-20 18:09:08 -04:00
unparse-string swap string-style styled-text ;
2007-12-03 19:19:18 -05:00
M: string pprint*
dup "\"" "\"" pprint-string ;
2007-09-20 18:09:08 -04:00
2007-12-03 19:19:18 -05:00
M: sbuf pprint*
dup "SBUF\" " "\"" pprint-string ;
2007-09-20 18:09:08 -04:00
2007-12-03 19:19:18 -05:00
M: pathname pprint*
dup string>> "P\" " "\"" pprint-string ;
2007-09-20 18:09:08 -04:00
! Sequences
: nesting-limit? ( -- ? )
nesting-limit get dup [ pprinter-stack get length < ] when ;
: present-text ( str obj -- )
presented associate styled-text ;
: check-recursion ( obj quot -- )
nesting-limit? [
drop
"~" over class name>> "~" 3append
2007-09-20 18:09:08 -04:00
swap present-text
] [
over recursion-check get memq? [
drop "~circularity~" swap present-text
] [
over recursion-check get push
call
recursion-check get pop*
] if
] if ; inline
: do-length-limit ( seq -- trimmed n/f )
length-limit get dup [
over length over [-]
dup zero? [ 2drop f ] [ >r head r> ] if
] when ;
: pprint-elements ( seq -- )
2007-10-05 01:08:34 -04:00
do-length-limit >r
[ pprint* ] each
2007-09-20 18:09:08 -04:00
r> [ "~" swap number>string " more~" 3append text ] when* ;
GENERIC: pprint-delims ( obj -- start end )
M: quotation pprint-delims drop \ [ \ ] ;
M: curry pprint-delims drop \ [ \ ] ;
M: compose pprint-delims drop \ [ \ ] ;
2007-09-20 18:09:08 -04:00
M: array pprint-delims drop \ { \ } ;
M: byte-array pprint-delims drop \ B{ \ } ;
2008-04-30 17:11:55 -04:00
M: byte-vector pprint-delims drop \ BV{ \ } ;
2007-09-20 18:09:08 -04:00
M: vector pprint-delims drop \ V{ \ } ;
M: hashtable pprint-delims drop \ H{ \ } ;
M: tuple pprint-delims drop \ T{ \ } ;
M: wrapper pprint-delims drop \ W{ \ } ;
M: callstack pprint-delims drop \ CS{ \ } ;
GENERIC: >pprint-sequence ( obj -- seq )
M: object >pprint-sequence ;
2008-01-30 00:13:47 -05:00
M: vector >pprint-sequence ;
2008-04-30 17:11:55 -04:00
M: byte-vector >pprint-sequence ;
M: curry >pprint-sequence ;
M: compose >pprint-sequence ;
2007-09-20 18:09:08 -04:00
M: hashtable >pprint-sequence >alist ;
M: tuple >pprint-sequence tuple>array ;
M: wrapper >pprint-sequence wrapped>> 1array ;
2007-09-20 18:09:08 -04:00
M: callstack >pprint-sequence callstack>array ;
GENERIC: pprint-narrow? ( obj -- ? )
M: object pprint-narrow? drop f ;
M: array pprint-narrow? drop t ;
M: vector pprint-narrow? drop t ;
M: hashtable pprint-narrow? drop t ;
M: tuple pprint-narrow? drop t ;
: pprint-object ( obj -- )
[
<flow
dup pprint-delims >r pprint-word
dup pprint-narrow? <inset
>pprint-sequence pprint-elements
block> r> pprint-word block>
] check-recursion ;
2007-09-20 18:09:08 -04:00
M: object pprint* pprint-object ;
M: curry pprint*
dup quot>> callable? [ pprint-object ] [
"( invalid curry )" swap present-text
] if ;
M: compose pprint*
dup [ first>> callable? ] [ second>> callable? ] bi and
[ pprint-object ] [
"( invalid compose )" swap present-text
] if ;
2007-09-20 18:09:08 -04:00
M: wrapper pprint*
dup wrapped>> word? [
<block \ \ pprint-word wrapped>> pprint-word block>
2007-09-20 18:09:08 -04:00
] [
pprint-object
] if ;
2008-03-26 04:57:48 -04:00
M: tuple-layout pprint*
"( tuple layout )" swap present-text ;