Paste: Remove ".." in path
        
	
	
	
		| Author: | Sam | 
|---|
		| Mode: | factor | 
|---|
		| Date: | Mon, 25 May 2009 12:28:29 | 
|---|
	
	Plain Text |
	
	USING: kernel sequences splitting ;
: remove-.. ( seq -- newseq )
    dup empty?
    [ unclip dup ".." =
      [
          drop dup empty? [ drop { ".." } ] [ rest remove-.. ] if
      ]
      [
          [ remove-.. ] dip prefix
      ]	if
    ] unless ;
: simplify ( path -- newpath )
    "/" split reverse
    remove-.. reverse "/" join ;
	
		
		
			| Author: | Sam | 
|---|
			| Mode: | text | 
|---|
			| Date: | Mon, 25 May 2009 12:30:04 | 
|---|
		
		Plain Text |
		
		This handles ".." at the beginning of the path, but mishandles "../.." at the beginning, so needs to be reworked.
	
		
		
			| Author: | randy7 | 
|---|
			| Mode: | factor | 
|---|
			| Date: | Sat, 30 May 2009 20:19:00 | 
|---|
		
		Plain Text |
		
		hi Sam, what about something like this:
"/path/to/../from/./your/code/to/mine"
"/" split harvest
V{ } clone tuck dup '[
dup "." = [ drop ] [
dup ".." = [ drop _ pop* ] [ _ push ] if  ] if
] each 
=> V{ "path" "from" "your" "code" "to" "mine" }
(ofcourse later:   "/" join "/" prepend  )
I tried to make it into a cond, but it didn't work for some reason.
another way is to filter out '.' later.
( [ CHAR: . = not ] filter )
	
	
		New Annotation