[Pkg] The Trunk: Collections-cmm.1019.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Jul 13 20:32:01 UTC 2022


Chris Muller uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-cmm.1019.mcz

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

Name: Collections-cmm.1019
Author: cmm
Time: 13 July 2022, 3:32:00.282033 pm
UUID: 0a992532-c6b1-4b44-9da5-e9f3cf55dc50
Ancestors: Collections-cmm.1018

- Disallow Unicode tokens with #format:.

=============== Diff against Collections-cmm.1018 ===============

Item was changed:
  ----- Method: String>>format: (in category 'formatting') -----
  format: aCollection 
  	"Substitute tokens in the receiver with element values of aCollection.  The tokens are indicated in curly-braces and may be either numeric, e.g., {1}, {2}, etc. and map to a SequenceableCollection, OR, alphanumeric, e.g., {name}, {date}, etc., in which case aCollection should be a Dictionary.
  	The values can be static or, with the specification of a Block element, dynamic.
  	 
  	Simplest examples:
  		'foo {date} bar' format: ({'date'->Date today} as: Dictionary).
  
  	Dynamic calculation is allowed via Blocks.
  		'foo {NOW} bar' format: ({'NOW'-> [DateAndTime now]} as: Dictionary).
  
  	Backward-compatible with numeric-only #format:
  		'foo {1} bar' format: {Date today}.
  
  	Now with block support:
  		'foo {1} bar' format: {[Date today]}.
  	 
  	Complete example with escaped characters:  
  		'\{ \} \\ foo {1} bar {2}' format: {12. 'string'}.
  		'\{ \} \\ foo {FOO} bar {BAR}' format: ({'FOO'->12. 'BAR'->'string'} as: Dictionary)."
  	^ self class
  		new: self size * 11 // 10 "ready for +10% growth"
  		streamContents:
  			[ : output | | lastIndex nextIndex key |
  			lastIndex := 1.
  			key := 0.
  			[ "stream to output until first { or \"
  			(nextIndex := self indexOfAnyOf: FormatCharacterSet startingAt: lastIndex) = 0 ] whileFalse:
  				[ nextIndex = lastIndex ifFalse:
  					[ output next: nextIndex - lastIndex putAll: self startingAt: lastIndex ].
  				"special char hit, escape char?"
  				(self at: nextIndex) == $\
  					ifTrue: 
  						[ "transfer the escaped character. "
  						output nextPut: (self at: (nextIndex := nextIndex + 1)) ]
  					ifFalse:
  						[ | nextKeyChar |
  						"${ char, parse the key"
  						[ nextKeyChar := self at: (nextIndex := nextIndex + 1).
+ 						nextKeyChar isAscii and: [ nextKeyChar isAlphaNumeric ] ] whileTrue:
+ 							[ (key isInteger and: [ nextKeyChar between: $0 and: $9 ])
- 						nextKeyChar isAlphaNumeric ] whileTrue:
- 							[ (key isInteger and: [ nextKeyChar isDigit ])
  								ifTrue: [ key := key * 10 + nextKeyChar digitValue ]
  								ifFalse:
  									[ key isInteger ifTrue:
  										[ key := WriteStream with:
  											(key isZero
  												ifTrue: [ String empty ]
  												ifFalse: [ key asString ]) ].
  									key nextPut: nextKeyChar ] ].
+ 						nextKeyChar == $} ifFalse: [ self error: '$} expected' translated ].
- 						nextKeyChar = $} ifFalse: [ self error: '$} expected' ].
  						key isInteger
  							ifTrue:
  								[ output nextPutAll: (aCollection at: key) value asString.
  								key := 0 ]
  							ifFalse:
  								[ output nextPutAll: (aCollection at: key contents) value asString.
  								key reset ] ].
  				lastIndex := nextIndex + 1 ].
  			lastIndex <= self size ifTrue:
  				[ output next: self size - lastIndex + 1 putAll: self startingAt: lastIndex ] ]!



More information about the Packages mailing list