2009-01-28 01:30:30 -05:00
|
|
|
! Copyright (C) 2006, 2009 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: arrays combinators documents fry kernel math sequences
|
2009-02-16 02:03:34 -05:00
|
|
|
unicode.categories accessors ;
|
2009-01-28 01:30:30 -05:00
|
|
|
IN: documents.elements
|
|
|
|
|
|
|
|
GENERIC: prev-elt ( loc document elt -- newloc )
|
|
|
|
GENERIC: next-elt ( loc document elt -- newloc )
|
|
|
|
|
|
|
|
: prev/next-elt ( loc document elt -- start end )
|
|
|
|
[ prev-elt ] [ next-elt ] 3bi ;
|
|
|
|
|
|
|
|
: elt-string ( loc document elt -- string )
|
|
|
|
[ prev/next-elt ] [ drop ] 2bi doc-range ;
|
|
|
|
|
|
|
|
: set-elt-string ( string loc document elt -- )
|
|
|
|
[ prev/next-elt ] [ drop ] 2bi set-doc-range ;
|
|
|
|
|
|
|
|
SINGLETON: char-elt
|
|
|
|
|
2009-01-28 15:54:13 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2009-01-28 01:30:30 -05:00
|
|
|
: (prev-char) ( loc document quot -- loc )
|
|
|
|
{
|
|
|
|
{ [ pick { 0 0 } = ] [ 2drop ] }
|
|
|
|
{ [ pick second zero? ] [ drop [ first 1- ] dip line-end ] }
|
|
|
|
[ call ]
|
|
|
|
} cond ; inline
|
|
|
|
|
|
|
|
: (next-char) ( loc document quot -- loc )
|
|
|
|
{
|
|
|
|
{ [ 2over doc-end = ] [ 2drop ] }
|
|
|
|
{ [ 2over line-end? ] [ 2drop first 1+ 0 2array ] }
|
|
|
|
[ call ]
|
|
|
|
} cond ; inline
|
|
|
|
|
2009-01-28 15:54:13 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2009-01-28 01:30:30 -05:00
|
|
|
M: char-elt prev-elt
|
|
|
|
drop [ drop -1 +col ] (prev-char) ;
|
|
|
|
|
|
|
|
M: char-elt next-elt
|
|
|
|
drop [ drop 1 +col ] (next-char) ;
|
|
|
|
|
|
|
|
SINGLETON: one-char-elt
|
|
|
|
|
|
|
|
M: one-char-elt prev-elt 2drop ;
|
|
|
|
|
|
|
|
M: one-char-elt next-elt 2drop ;
|
|
|
|
|
2009-01-28 15:54:13 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2009-01-28 01:30:30 -05:00
|
|
|
: (word-elt) ( loc document quot -- loc )
|
|
|
|
pick [
|
|
|
|
[ [ first2 swap ] dip doc-line ] dip call
|
|
|
|
] dip =col ; inline
|
|
|
|
|
2009-02-16 02:03:34 -05:00
|
|
|
: ((word-elt)) ( n seq -- n seq ? )
|
|
|
|
2dup ?nth blank? ;
|
2009-01-28 01:30:30 -05:00
|
|
|
|
|
|
|
: break-detector ( ? -- quot )
|
|
|
|
'[ blank? _ xor ] ; inline
|
|
|
|
|
2009-02-16 02:03:34 -05:00
|
|
|
: (prev-word) ( col str ? -- col )
|
|
|
|
break-detector find-last-from drop ?1+ ;
|
2009-01-28 01:30:30 -05:00
|
|
|
|
2009-02-16 02:03:34 -05:00
|
|
|
: (next-word) ( col str ? -- col )
|
|
|
|
[ break-detector find-from drop ] [ drop length ] 2bi or ;
|
2009-01-28 01:30:30 -05:00
|
|
|
|
2009-01-28 15:54:13 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2009-01-28 01:30:30 -05:00
|
|
|
SINGLETON: one-word-elt
|
|
|
|
|
|
|
|
M: one-word-elt prev-elt
|
|
|
|
drop
|
2009-02-16 02:03:34 -05:00
|
|
|
[ [ 1- ] dip f (prev-word) ] (word-elt) ;
|
2009-01-28 01:30:30 -05:00
|
|
|
|
|
|
|
M: one-word-elt next-elt
|
|
|
|
drop
|
2009-02-16 02:03:34 -05:00
|
|
|
[ f (next-word) ] (word-elt) ;
|
2009-01-28 01:30:30 -05:00
|
|
|
|
|
|
|
SINGLETON: word-elt
|
|
|
|
|
|
|
|
M: word-elt prev-elt
|
|
|
|
drop
|
|
|
|
[ [ [ 1- ] dip ((word-elt)) (prev-word) ] (word-elt) ]
|
|
|
|
(prev-char) ;
|
|
|
|
|
|
|
|
M: word-elt next-elt
|
|
|
|
drop
|
|
|
|
[ [ ((word-elt)) (next-word) ] (word-elt) ]
|
|
|
|
(next-char) ;
|
|
|
|
|
|
|
|
SINGLETON: one-line-elt
|
|
|
|
|
|
|
|
M: one-line-elt prev-elt
|
|
|
|
2drop first 0 2array ;
|
|
|
|
|
|
|
|
M: one-line-elt next-elt
|
|
|
|
drop [ first dup ] dip doc-line length 2array ;
|
|
|
|
|
2009-02-16 02:03:34 -05:00
|
|
|
TUPLE: page-elt { lines read-only } ;
|
2009-01-28 01:30:30 -05:00
|
|
|
|
2009-02-16 02:03:34 -05:00
|
|
|
C: <page-elt> page-elt
|
2009-01-28 01:30:30 -05:00
|
|
|
|
2009-02-16 02:03:34 -05:00
|
|
|
M: page-elt prev-elt
|
|
|
|
nip
|
|
|
|
2dup [ first ] [ lines>> ] bi* <
|
|
|
|
[ 2drop { 0 0 } ] [ lines>> neg +line ] if ;
|
|
|
|
|
|
|
|
M: page-elt next-elt
|
|
|
|
3dup [ first ] [ last-line# ] [ lines>> ] tri* - >
|
|
|
|
[ drop nip doc-end ] [ nip lines>> +line ] if ;
|
|
|
|
|
|
|
|
CONSTANT: line-elt T{ page-elt f 1 }
|
2009-01-28 01:30:30 -05:00
|
|
|
|
|
|
|
SINGLETON: doc-elt
|
|
|
|
|
|
|
|
M: doc-elt prev-elt 3drop { 0 0 } ;
|
|
|
|
|
|
|
|
M: doc-elt next-elt drop nip doc-end ;
|