| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2016-03-31 02:29:48 -04:00
										 |  |  | accessors unicode combinators.short-circuit ;
 | 
					
						
							| 
									
										
										
										
											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-03-29 23:58:04 -04:00
										 |  |  | : prev ( loc document quot: ( loc document -- loc ) -- loc )
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { [ pick { 0 0 } = ] [ 2drop ] } | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |         { [ pick second zero? ] [ drop [ first 1 - ] dip line-end ] } | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  |         [ call ] | 
					
						
							|  |  |  |     } cond ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 22:49:14 -04:00
										 |  |  | : next ( loc document quot: ( loc document -- loc ) -- loc )
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { [ 2over doc-end = ] [ 2drop ] } | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |         { [ 2over line-end? ] [ 2drop first 1 + 0 2array ] } | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  |         [ call ] | 
					
						
							|  |  |  |     } cond ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 22:49:14 -04:00
										 |  |  | : modify-col ( loc document quot: ( col str -- col' ) -- loc )
 | 
					
						
							|  |  |  |     pick [ | 
					
						
							|  |  |  |         [ [ first2 swap ] dip doc-line ] dip call
 | 
					
						
							|  |  |  |     ] dip =col ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 15:54:13 -05:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | M: char-elt prev-elt | 
					
						
							| 
									
										
										
										
											2009-03-31 22:49:14 -04:00
										 |  |  |     drop [ [ last-grapheme-from ] modify-col ] prev ;
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: char-elt next-elt | 
					
						
							| 
									
										
										
										
											2009-03-31 22:49:14 -04:00
										 |  |  |     drop [ [ first-grapheme-from ] modify-col ] next ;
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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-03-29 23:58:04 -04:00
										 |  |  | : blank-at? ( n seq -- n seq ? )
 | 
					
						
							| 
									
										
										
										
											2009-02-16 02:03:34 -05:00
										 |  |  |     2dup ?nth blank? ;
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : break-detector ( ? -- quot )
 | 
					
						
							|  |  |  |     '[ blank? _ xor ] ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 22:49:14 -04:00
										 |  |  | : prev-word ( col str ? -- col )
 | 
					
						
							| 
									
										
										
										
											2009-02-16 02:03:34 -05:00
										 |  |  |     break-detector find-last-from drop ?1+ ;
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 22:49:14 -04: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-08-13 20:21:44 -04:00
										 |  |  |     [ [ 1 - ] dip f prev-word ] modify-col ;
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: one-word-elt next-elt | 
					
						
							|  |  |  |     drop
 | 
					
						
							| 
									
										
										
										
											2009-03-31 22:49:14 -04:00
										 |  |  |     [ f next-word ] modify-col ;
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-01 08:29:03 -04:00
										 |  |  | SINGLETON: word-start-elt | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: word-start-elt prev-elt | 
					
						
							|  |  |  |     drop one-word-elt prev-elt ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: word-start-elt next-elt 2drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | SINGLETON: word-elt | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: word-elt prev-elt | 
					
						
							|  |  |  |     drop
 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     [ [ [ 1 - ] dip blank-at? prev-word ] modify-col ] | 
					
						
							| 
									
										
										
										
											2009-03-29 23:58:04 -04:00
										 |  |  |     prev ;
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: word-elt next-elt | 
					
						
							|  |  |  |     drop
 | 
					
						
							| 
									
										
										
										
											2009-03-31 22:49:14 -04:00
										 |  |  |     [ [ blank-at? next-word ] modify-col ] | 
					
						
							| 
									
										
										
										
											2009-03-29 23:58:04 -04:00
										 |  |  |     next ;
 | 
					
						
							| 
									
										
										
										
											2009-01-28 01:30:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-29 23:58:04 -04:00
										 |  |  | M: doc-elt next-elt drop nip doc-end ;
 |