[Pkg] The Trunk: Collections-mt.631.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun May 3 20:38:54 UTC 2015
Marcel Taeumel uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-mt.631.mcz
==================== Summary ====================
Name: Collections-mt.631
Author: mt
Time: 3 May 2015, 10:38:38.118 pm
UUID: 0b21fbfc-3cd6-8f45-bf1a-d7e3c5e5c107
Ancestors: Collections-mt.630
HtmlReadWriter: support for comments added, list of ignored tags added
=============== Diff against Collections-mt.630 ===============
Item was added:
+ ----- Method: HtmlReadWriter>>ignoredTags (in category 'accessing') -----
+ ignoredTags
+ "Because we cannot process all of them."
+
+ ^ #(body script table tr td ul ol li form select option input)!
Item was added:
+ ----- Method: HtmlReadWriter>>isTagIgnored: (in category 'testing') -----
+ isTagIgnored: aTag
+
+ | space t |
+ space := aTag indexOf: Character space.
+ t := space > 0
+ ifTrue: [aTag copyFrom: 2 to: space - 1]
+ ifFalse: [aTag copyFrom: 2 to: aTag size - 1].
+ ^ self ignoredTags includes: t!
Item was changed:
----- Method: HtmlReadWriter>>mapATag: (in category 'mapping') -----
mapATag: aTag
| result startIndex stopIndex attribute |
result := OrderedCollection new.
+
+ Transcript showln: aTag.
"<a href=""http://google.de"">"
attribute := 'href'.
startIndex := aTag findString: attribute.
startIndex > 0 ifTrue: [
+ startIndex := aTag findString: '=' startingAt: startIndex+attribute size.
+ stopIndex := aTag findString: ' ' startingAt: startIndex+1.
+ stopIndex = 0 ifTrue: [
+ stopIndex := aTag findString: '>' startingAt: startIndex+1].
- startIndex := aTag findString: '"' startingAt: startIndex+attribute size.
- stopIndex := aTag findString: '"' startingAt: startIndex+1.
- result add: (TextURL new url: (aTag copyFrom: startIndex+1 to: stopIndex-1))].
+ (aTag at: startIndex + 1) = $"
+ ifTrue: [startIndex := startIndex + 1].
+ (aTag at: stopIndex - 1) = $"
+ ifTrue: [stopIndex := stopIndex - 1].
+ result add: (TextURL new url: (aTag copyFrom: startIndex+1 to: stopIndex-1))].
+
^ 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 = '<code>' ifTrue: [^ {TextFontReference toFont: Preferences standardCodeFont}]."
(aTag beginsWith: '<font') ifTrue: [^ self mapFontTag: aTag].
(aTag beginsWith: '<a') ifTrue: [^ self mapATag: aTag].
+ "h1, h2, h3, ..."
+ (aTag second = $h and: [aTag third isDigit])
+ ifTrue: [^ {TextEmphasis bold}].
+
^ {}!
Item was changed:
----- Method: HtmlReadWriter>>nextText (in category 'accessing') -----
nextText
count := 0.
offset := 0. "To ignore characters in the input string that are used by tags."
runStack := Stack new.
runArray := RunArray new.
string := OrderedCollection new.
"{text attributes. start index. end index. number of open tags}"
runStack push: {OrderedCollection new. 1. nil. 0}.
[stream atEnd] whileFalse: [self processNextTag].
self processRunStackTop. "Add last run."
string := String withAll: string.
+ runArray coalesce.
^ Text
string: string
runs: runArray!
Item was added:
+ ----- Method: HtmlReadWriter>>processComment: (in category 'reading') -----
+ processComment: aComment
+ !
Item was added:
+ ----- Method: HtmlReadWriter>>processEmptyTag: (in category 'reading') -----
+ processEmptyTag: aTag
+
+ (aTag beginsWith: '<br') ifTrue: [
+ string add: Character cr.
+ count := count + 1.
+ ^ self].
+
+ (self ignoredTags includes: (aTag copyFrom: 2 to: aTag size - 3))
+ ifTrue: [^ self].
+
+ "TODO..."!
Item was changed:
----- Method: HtmlReadWriter>>processEndTag: (in category 'reading') -----
processEndTag: aTag
| index |
index := count - offset.
+ (self ignoredTags includes: (aTag copyFrom: 3 to: aTag size -1))
+ ifTrue: [^ self].
+
- aTag = '</br>' ifTrue: [
- string add: Character cr.
- count := count + 1.
- ^ self].
-
"De-Accumulate adjacent tags."
runStack top at: 4 put: runStack top fourth - 1.
runStack top fourth > 0
ifTrue: [^ self "not yet"].
self processRunStackTop.
runStack pop.
runStack top at: 2 put: index + 1.!
Item was changed:
----- Method: HtmlReadWriter>>processNextTag (in category 'reading') -----
processNextTag
+ | tag htmlEscape lookForNewTag lookForHtmlEscape tagFound valid inComment |
- | tag htmlEscape lookForNewTag lookForHtmlEscape tagFound valid |
lookForNewTag := true.
lookForHtmlEscape := false.
tagFound := false.
tag := OrderedCollection new.
htmlEscape := OrderedCollection new.
+ inComment := false.
[stream atEnd not and: [tagFound not]] whileTrue: [
| character |
character := stream next.
valid := (#(10 13) includes: character asciiValue) not.
count := count + 1.
character = $< ifTrue: [lookForNewTag := false].
+ character = $& ifTrue: [
+ inComment ifFalse: [lookForHtmlEscape := true]].
- character = $& ifTrue: [lookForHtmlEscape := true].
lookForNewTag
ifTrue: [
lookForHtmlEscape
ifFalse: [valid ifTrue: [string add: character] ifFalse: [offset := offset + 1]]
ifTrue: [valid ifTrue: [htmlEscape add: character]. offset := offset + 1]]
ifFalse: [valid ifTrue: [tag add: character]. offset := offset + 1].
+ inComment := ((lookForNewTag not and: [tag size >= 4])
+ and: [tag beginsWith: '<!!--'])
+ and: [(tag endsWith: '-->') not].
+
+ ((character = $> and: [inComment not]) and: [lookForNewTag not]) ifTrue: [
- character = $> ifTrue: [
lookForNewTag := true.
+ (tag beginsWith: '<!!--')
+ ifTrue: [self processComment: (String withAll: tag)]
+ ifFalse: [tag second ~= $/
+ ifTrue: [
+ (tag atLast: 2) == $/
+ ifTrue: [self processEmptyTag: (String withAll: tag)]
+ ifFalse: [self processStartTag: (String withAll: tag)]]
+ ifFalse: [self processEndTag: (String withAll: tag)]].
- "Full tag like <b> or </b> found."
- tag second ~= $/
- ifTrue: [self processStartTag: (String withAll: tag)]
- ifFalse: [self processEndTag: (String withAll: tag)].
tagFound := true].
+ (((character = $; and: [lookForNewTag])
+ and: [htmlEscape notEmpty]) and: [htmlEscape first = $&]) ifTrue: [
+ lookForHtmlEscape := false.
+ self processHtmlEscape: (String withAll: htmlEscape).
+ htmlEscape := OrderedCollection new]].
- character = $; ifTrue: [
- lookForHtmlEscape := false.
- self processHtmlEscape: (String withAll: htmlEscape).
- htmlEscape := OrderedCollection new]].
!
Item was changed:
----- Method: HtmlReadWriter>>processStartTag: (in category 'reading') -----
processStartTag: aTag
| index |
+ (self isTagIgnored: aTag) ifTrue: [^ self].
+
index := count - offset.
+
-
aTag = '<br>' ifTrue: [
string add: Character cr.
count := count + 1.
^ self].
+ (aTag beginsWith: '<img') ifTrue: [
+ string addAll: '[image]'.
+ count := count + 7.
+ ^ self].
"Accumulate adjacent tags."
(runStack size > 1 and: [runStack top second = (index + 1) "= adjacent start tags"])
ifTrue: [
runStack top at: 1 put: (runStack top first copy addAll: (self mapTagToAttribute: aTag); yourself).
runStack top at: 4 put: (runStack top fourth + 1). "increase number of open tags"
^self].
self processRunStackTop.
"Remove start/end info to reuse attributes later."
runStack top at: 2 put: nil.
runStack top at: 3 put: nil.
"Copy attr list and add new attr."
runStack push: ({runStack top first copy addAll: (self mapTagToAttribute: aTag); yourself. index + 1. nil. 1}).!
More information about the Packages
mailing list