[squeak-dev] The Trunk: Collections-mt.886.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Apr 17 14:56:33 UTC 2020


Marcel Taeumel uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-mt.886.mcz

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

Name: Collections-mt.886
Author: mt
Time: 17 April 2020, 4:56:30.33186 pm
UUID: c7d64e56-0d06-e34f-8a61-8f5a7eb9277d
Ancestors: Collections-eem.885

To our HTML-to-Text converter, add support for <img> tags. Either download an image (or picture) from the Web or evaluate some code to retrieve either a Form or a Morph. As documented in #httpGetImage:, this complements the support of "code://" in TextURL.

=============== Diff against Collections-eem.885 ===============

Item was added:
+ ----- Method: HtmlReadWriter>>httpGetImage: (in category 'private') -----
+ httpGetImage: url
+ 	"To not add a direct dependency to WebClient, provide this hook for getting am image from an HTTP url. Maybe we can have this via an AppRegistry at some point. Maybe extend WebBrowser."
+ 	
+ 	(url beginsWith: 'code://') ifTrue: [
+ 		"Same support for Smalltalk expressions as in TextURL >> #actOnClickFor:."
+ 		^ ([Compiler evaluate: (url allButFirst: 7)] ifError: [nil])
+ 			ifNotNil: [:object | object isForm ifTrue: [object] ifFalse: [nil]]].
+ 	
+ 	^ (Smalltalk classNamed: 'WebClient') ifNotNil: [:client |
+ 		([client httpGet: url] ifError: [nil]) ifNotNil: [:response |
+ 			response code = 200 ifFalse: [nil] ifTrue: [
+ 				[Form fromBinaryStream: response content asByteArray readStream]
+ 					ifError: [nil]]]]!

Item was added:
+ ----- Method: HtmlReadWriter>>mapImgTag: (in category 'mapping') -----
+ mapImgTag: aTag
+ 
+ 	| result startIndex stopIndex attribute src form |
+ 	result := OrderedCollection new.
+ 
+ 	"<img src=""https://squeak.org/img/downloads/image.png"">"
+ 	attribute := 'src'.
+ 	startIndex := aTag findString: attribute.
+ 	startIndex > 0 ifTrue: [
+ 		startIndex := aTag findString: '"' startingAt: startIndex+attribute size.
+ 		startIndex > 0
+ 			ifTrue: [stopIndex := aTag findString: '"' startingAt: startIndex+1]
+ 			ifFalse: [
+ 				"URLs without quotes..."
+ 				startIndex := aTag findString: '=' startingAt: startIndex+attribute size.
+ 				stopIndex := aTag findString: '>' startingAt: startIndex+1].
+ 		src := aTag copyFrom: startIndex+1 to: stopIndex-1.
+ 		form := (self httpGetImage: src) ifNil: [(Form dotOfSize: 12 color: Color veryLightGray)].
+ 		result
+ 			add: form asTextAnchor;
+ 			add: (TextColor color: Color transparent)].
+ 	^ result!

Item was changed:
  ----- Method: HtmlReadWriter>>mapTagToAttribute: (in category 'mapping') -----
  mapTagToAttribute: aTag
  
  	aTag = '<b>' ifTrue: [^ {TextEmphasis bold}].
  	aTag = '<i>' ifTrue: [^ {TextEmphasis italic}].
  	aTag = '<u>' ifTrue: [^ {TextEmphasis underlined}].
  	aTag = '<s>' ifTrue: [^ {TextEmphasis struckOut}].
  	aTag = '<code>' ifTrue: [^ self mapCodeTag].
  	aTag = '<pre>' ifTrue: [self breakLines: false. ^ {}].
  	(#('<div' '<span' '<center>' ) anySatisfy: [:ea | aTag beginsWith: ea])
  		ifTrue: [^(self mapAlignmentTag: aTag) union: (self mapContainerTag: aTag)].
  	(aTag beginsWith: '<font') ifTrue: [^ self mapFontTag: aTag].
  	(aTag beginsWith: '<a') ifTrue: [^ self mapATag: aTag].
+ 	(aTag beginsWith: '<img') ifTrue: [^ self mapImgTag: aTag].
  
  	"h1, h2, h3, ..."
  	(aTag second = $h and: [aTag third isDigit])
  		ifTrue: [^ {TextEmphasis bold}].
  
  	^ {}!

Item was changed:
  ----- Method: HtmlReadWriter>>processEmptyTag: (in category 'reading') -----
  processEmptyTag: aTag
  
  	(aTag beginsWith: '<br') ifTrue: [
  		self addCharacter: Character cr.
  		^ self].
  	
+ 	(aTag beginsWith: '<img') ifTrue:[
+ 		^ self processStartTag: aTag].
+ 	
  	(self isTagIgnored: aTag)
  		ifTrue: [^ self].
  		
  	"TODO... what?"!

Item was added:
+ ----- Method: HtmlReadWriter>>processEndTagEagerly: (in category 'reading') -----
+ processEndTagEagerly: aTag
+ 	"Not all tags need an end tag. Simulate that here."
+ 	
+ 	(aTag beginsWith: '<img')
+ 		ifTrue: [^ self processEndTag: '</img>'].!

Item was changed:
  ----- Method: HtmlReadWriter>>processStartTag: (in category 'reading') -----
  processStartTag: aTag
  
  	| index |
  	(self isTagIgnored: aTag) ifTrue: [^ self].
  
  	index := count - offset.
  
  	aTag = '<br>' ifTrue: [
  		self addCharacter: Character cr.
  		^ self].
+ 
  	(aTag beginsWith: '<img') ifTrue: [
+ 		self addString: Character startOfHeader asString.
+ 		offset := offset + 1.
+ 		index := index - 1].
- 		self addString: '[image]'.
- 		^ self].
  	
  	self processRunStackTop. "To add all attributes before the next tag adds some."
  
  	"Copy attr list and add new attr."
  	runStack push: ({runStack top first copy addAll: (self mapTagToAttribute: aTag); yourself. index + 1 . index + 1}).
+ 
+ 	"For tags such as <img>, we should simulate the closing tag because there won't be any."
+ 	self processEndTagEagerly: aTag.!
- 	!



More information about the Squeak-dev mailing list