[Pkg] The Trunk: Collections-nice.192.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Nov 16 12:26:04 UTC 2009


Nicolas Cellier uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-nice.192.mcz

==================== Summary ====================

Name: Collections-nice.192
Author: nice
Time: 16 November 2009, 1:25:56 am
UUID: ea8893b0-c42d-134b-8752-3d9ac395b62d
Ancestors: Collections-nice.191

Some changes for handling cr/lf/crlf line delimiters in String

=============== Diff against Collections-nice.191 ===============

Item was changed:
  ----- Method: String>>lineCorrespondingToIndex: (in category 'accessing') -----
  lineCorrespondingToIndex: anIndex
+ 	"Answer a string containing the line at the given character position."
- 	"Answer a string containing the line at the given character position.  1/15/96 sw:  Inefficient first stab at this"
  
+ 	self lineIndicesDo: [:start :endWithoutDelimiters :end |
+ 		anIndex <= end ifTrue: [^self copyFrom: start to: endWithoutDelimiters]].
+ 	^''!
- 	| cr aChar answer |
- 	cr := Character cr.
- 	answer := ''.
- 	1 to: self size do:
- 		[:i | 
- 			aChar := self at: i.
- 			aChar = cr
- 				ifTrue:
- 					[i > anIndex
- 						ifTrue:
- 							[^ answer]
- 						ifFalse:
- 							[answer := '']]
- 				ifFalse:
- 					[answer := answer copyWith: aChar]].
- 	^ answer!

Item was changed:
  ----- Method: String>>indentationIfBlank: (in category 'paragraph support') -----
  indentationIfBlank: aBlock
  	"Answer the number of leading tabs in the receiver.  If there are
  	 no visible characters, pass the number of tabs to aBlock and return its value."
  
+ 	| reader leadingTabs lastSeparator tab ch |
- 	| reader leadingTabs lastSeparator cr tab ch |
- 	cr := Character cr.
  	tab := Character tab.
  	reader := ReadStream on: self.
  	leadingTabs := 0.
  	[reader atEnd not and: [(ch := reader next) = tab]]
  		whileTrue: [leadingTabs := leadingTabs + 1].
+ 	lastSeparator := leadingTabs.
+ 	[reader atEnd not and: [ch isSeparator and: [(CSLineEnders includes: ch) not]]]
- 	lastSeparator := leadingTabs + 1.
- 	[reader atEnd not and: [ch isSeparator and: [ch ~= cr]]]
  		whileTrue: [lastSeparator := lastSeparator + 1. ch := reader next].
+ 	(lastSeparator >= self size or: [CSLineEnders includes: ch])
- 	lastSeparator = self size | (ch = cr)
  		ifTrue: [^aBlock value: leadingTabs].
+ 	^ leadingTabs!
- 	^ leadingTabs.
- !

Item was changed:
  ----- Method: String>>lineNumber: (in category 'accessing') -----
  lineNumber: anIndex
+ 	"Answer a string containing the characters in the given line number."
- 	"Answer a string containing the characters in the given line number.  5/10/96 sw"
- 
- 	| crString pos finalPos |
- 	crString := String with: Character cr.
- 	pos := 0.
- 	1 to: anIndex - 1 do:
- 		[:i | pos := self findString: crString startingAt: pos + 1.
- 			pos = 0 ifTrue: [^ nil]].
- 	finalPos := self findString: crString startingAt: pos + 1.
- 	finalPos = 0 ifTrue: [finalPos := self size + 1].
- 	^ self copyFrom: pos + 1 to: finalPos - 1
  
+ 	| lineCount |
+ 	lineCount := 0.
+ 	self lineIndicesDo: [:start :endWithoutDelimiters :end |
+ 		(lineCount := lineCount + 1) = anIndex ifTrue: [^self copyFrom: start to: endWithoutDelimiters]].
+ 	^nil!
- "
- 'Fred
- the
- Bear' lineNumber: 3
- "!

Item was added:
+ ----- Method: SequenceableCollection>>lastIndexOfAnyOf:startingAt:ifAbsent: (in category 'accessing') -----
+ lastIndexOfAnyOf: aCollection startingAt: lastIndex ifAbsent: exceptionBlock
+ 	"Answer the index of the last occurence of anElement within the  
+ 	receiver. If the receiver does not contain anElement, answer the
+ 	result of evaluating the argument, exceptionBlock."
+ 
+ 	lastIndex to: 1 by: -1 do:
+ 		[:index |
+ 		(aCollection includes: (self at: index)) ifTrue: [^ index]].
+ 	^ exceptionBlock value!

Item was changed:
  ----- Method: String>>linesDo: (in category 'accessing') -----
  linesDo: aBlock
+ 	"Execute aBlock with each line in this string. The terminating line delimiters CR, LF or CRLF pairs are not included in what is passed to aBlock"
- 	"execute aBlock with each line in this string.  The terminating CR's are not included in what is passed to aBlock"
- 	| start end |
- 	start := 1.
- 	[ start <= self size ] whileTrue: [
- 		end := self indexOf: Character cr  startingAt: start  ifAbsent: [ self size + 1 ].
- 		end := end - 1.
  
+ 	self lineIndicesDo: [:start :endWithoutDelimiters :end |
+ 		aBlock value: (self copyFrom: start to: endWithoutDelimiters)]!
- 		aBlock value: (self copyFrom: start  to: end).
- 		start := end + 2. ].!

Item was changed:
  ----- Method: String>>lineCount (in category 'accessing') -----
  lineCount
+ 	"Answer the number of lines represented by the receiver, where every line delimiter CR, LF or CRLF pair adds one line."
- 	"Answer the number of lines represented by the receiver, where every cr adds one line.  5/10/96 sw"
  
+ 	| lineCount |
+ 	lineCount := 0.
+ 	self lineIndicesDo: [:start :endWithoutDelimiters :end |
+ 		lineCount := lineCount + 1].
+ 	^lineCount!
- 	| cr count |
- 	cr := Character cr.
- 	count := 1  min: self size..
- 	1 to: self size do:
- 		[:i | (self at: i) = cr ifTrue: [count := count + 1]].
- 	^ count
- 
- "
- 'Fred
- the
- Bear' lineCount
- "!

Item was added:
+ ----- Method: String>>lineIndicesDo: (in category 'accessing') -----
+ lineIndicesDo: aBlock
+ 	"execute aBlock with 3 arguments for each line:
+ 	- start index of line
+ 	- end index of line without line delimiter
+ 	- end index of line including line delimiter(s) CR, LF or CRLF"
+ 	
+ 	| start end endWithoutDelimiters |
+ 	start := 1.
+ 	[ start <= self size ] whileTrue: [
+ 		end := self indexOfAnyOf: CSLineEnders startingAt: start ifAbsent: [ self size + 1 ].
+ 		endWithoutDelimiters := end - 1.
+ 		(end < self size
+ 				and: [(self at: end + 1) = Character lf
+ 				and: [(self at: end)	= Character cr]])
+ 			ifTrue: [end := end + 1].
+ 		aBlock value: start value: endWithoutDelimiters value: end.
+ 		start := end + 1]!



More information about the Packages mailing list