Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1139.mcz
==================== Summary ====================
Name: Tools-mt.1139 Author: mt Time: 3 March 2022, 2:49:41.991142 pm UUID: b7db1f19-33ca-d44f-8b77-c1ca9f523f88 Ancestors: Tools-mt.1138
Glyph browsing: - use non-breaking space(s) to make zero-width glyphs visible - do not skip empty glyphs anymore - replace #asUnicode with #charCode to just drop the #leadingChar if any; it is not about decoding here
=============== Diff against Tools-mt.1138 ===============
Item was changed: ----- Method: AbstractFont>>browseAllGlyphsByCategory (in category '*Tools-Browsing') ----- browseAllGlyphsByCategory "Browse glyphs for all printable characters/code-points in the receiver."
^ self browseGlyphsByCategoryOf: ((self minCodePoint max: 32 "space"+1) to: self maxCodePoint) + select: [:char | self hasGlyphOf: char]! - select: [:char | (self hasGlyphOf: char) and: [(self widthOf: char) > 0]]!
Item was changed: ----- Method: AbstractFont>>browseGlyphsByCategoryOf:select:label: (in category '*Tools-Browsing') ----- browseGlyphsByCategoryOf: someCodePointsOrCharacters select: aBlock label: aLabelOrNil "Like #browseGlyphsOf:... but group the code points by Unicode category."
| sortedCodePoints contents isRange tmp separatorBlock | isRange := isRange := someCodePointsOrCharacters isInterval and: [someCodePointsOrCharacters increment = 1].
separatorBlock := [:codePoints :category | (('{1}\' withCRs asText format: { Unicode generalCategoryLabels at: category+1 ifAbsent: ['n/a'] }) addAttribute: (TextFontReference toFont: TextStyle defaultFixedFont); addAttribute: (PluggableTextAttribute evalBlock: [self browseGlyphsByCategoryOf: codePoints select: aBlock label: aLabelOrNil]); yourself) ]. sortedCodePoints := (someCodePointsOrCharacters + collect: [:ea | ea isCharacter ifTrue: [ea charCode] ifFalse: [ea] ] - collect: [:ea | ea isCharacter ifTrue: [ea asUnicode] ifFalse: [ea] ] thenSelect: [:ea | aBlock value: (Character value: ea)]) sorted: [:a :b | | ca cb | (ca := (Unicode generalCategoryOf: a) ifNil: [0]) < (cb := (Unicode generalCategoryOf: b) ifNil: [0]) or: [ca = cb and: [a < b]]]. "Header" contents := (('Family name: {1}{6}\ Emphasis: {2}\ Point size: {3} ({4}ppi {5}px{7})' withCRs asText format: { self familyName asText addAttribute: (PluggableTextAttribute evalBlock: [self explore]); yourself. [self emphasisString] on: Error do: [self subfamilyName]. self pointSize. self pixelsPerInch. self height. isRange ifTrue: [''] ifFalse: [' (selected code points)']. (self isTTCFont and: [(tmp := self extraGlyphScale) ~= 1]) ifFalse: [''] ifTrue: [' ', (tmp * 100) rounded asString, '%'] }) addAttribute: (TextFontReference toFont: TextStyle defaultFixedFont); yourself).
String streamContents: [:s | | priorCategory currentCodePoints | currentCodePoints := OrderedCollection new. sortedCodePoints withIndexDo: [:codePoint :index | | char category | char := Character value: codePoint. category := Unicode generalCategoryOf: codePoint. priorCategory ifNil: [priorCategory := category]. category = priorCategory ifTrue: [ currentCodePoints add: codePoint. s nextPut: char]. (category ~= priorCategory or: [index = sortedCodePoints size]) ifTrue: [ contents := contents, (separatorBlock value: currentCodePoints value: priorCategory). contents := contents, ((s cr; contents) asText addAttribute: (TextFontReference toFont: self); yourself). currentCodePoints := OrderedCollection new. s reset. currentCodePoints add: codePoint. s nextPut: char]. + (self widthOf: char) = 0 ifTrue: [s nextPut: Character nbsp; nextPut: Character nbsp]. priorCategory := category]]. contents editWithLabel: (aLabelOrNil ifNil: [self printString]).!
Item was changed: ----- Method: AbstractFont>>browseGlyphsFrom:to: (in category '*Tools-Browsing') ----- browseGlyphsFrom: firstCodePoint to: lastCodePoint "Split range in sub-ranges whenever the receiver has no glyph for a certain code point or when that glyph is not visible. Start with at least a printable character after #space to avoid line breaks in the editor. Note that non-breaking space an similar are skipped as well." ^ self browseGlyphsOf: ((firstCodePoint max: (self minCodePoint max: 32 "space" +1)) to: (lastCodePoint min: self maxCodePoint)) + select: [:char | self hasGlyphOf: char]! - select: [:char | (self hasGlyphOf: char) and: [(self widthOf: char) > 0] - and: [(self characterFormAt: char) bits anySatisfy: [:ea | - ea ~= 0 "transparent" and: [ea ~= 4294967295 "white"]]] - ]!
Item was changed: ----- Method: AbstractFont>>browseGlyphsOf:select:label: (in category '*Tools-Browsing') ----- browseGlyphsOf: someCodePointsOrCharacters select: aBlock label: aLabelOrNil "Browse all glyphs in the given collection of code points or characters. Split range in sub-ranges whenever the receiver has no glyph for a certain code point. DO NOT translate user-facing text because this is a debugging tool so that text should only use ASCII."
| contents isRange tmp separatorBlock | isRange := someCodePointsOrCharacters isInterval and: [someCodePointsOrCharacters increment = 1]. separatorBlock := [:currentRange | (('\16r{1} to: 16r{2}\' withCRs asText format: { currentRange first printStringBase: 16 length: 6 padded: true. currentRange last printStringBase: 16 length: 6 padded: true }) addAttribute: (TextFontReference toFont: TextStyle defaultFixedFont); addAttribute: (PluggableTextAttribute evalBlock: [self browseGlyphsFrom: currentRange first to: currentRange last select: aBlock]); yourself)]. "Header" contents := (('Family name: {1}{6}\ Emphasis: {2}\ Point size: {3} ({4}ppi {5}px{7})' withCRs asText format: { self familyName asText addAttribute: (PluggableTextAttribute evalBlock: [self explore]); yourself. [self emphasisString] on: Error do: [self subfamilyName]. self pointSize. self pixelsPerInch. self height. isRange ifTrue: [''] ifFalse: [' (selected code points)']. (self isTTCFont and: [(tmp := self extraGlyphScale) ~= 1]) ifFalse: [''] ifTrue: [' ', (tmp * 100) rounded asString, '%'] }) addAttribute: (TextFontReference toFont: TextStyle defaultFixedFont); yourself).
String streamContents: [:s | | first last | last := someCodePointsOrCharacters last. someCodePointsOrCharacters withIndexDo: [:codePointOrChar :index | | current char valid | + current := codePointOrChar isCharacter ifTrue: [codePointOrChar charCode] ifFalse: [codePointOrChar]. - current := codePointOrChar isCharacter ifTrue: [codePointOrChar asUnicode] ifFalse: [codePointOrChar]. char := Character value: current. (valid := (aBlock value: char)) + ifTrue: [ + s position = 0 ifTrue: [first := current]. + s nextPut: char. + (self widthOf: char) = 0 ifTrue: [s nextPut: Character nbsp; nextPut: Character nbsp] ]. - ifTrue: [s position = 0 ifTrue: [first := current]. s nextPut: char]. (valid not or: [index = someCodePointsOrCharacters size]) ifTrue: [s position = 0 ifFalse: [ isRange ifFalse: [contents := contents, String cr] ifTrue: [ | currentRange | currentRange := first to: (index = someCodePointsOrCharacters size ifTrue: [last] ifFalse: [current-1]). contents := contents, (separatorBlock value: currentRange)]. contents := contents, ((s cr; contents) asText addAttribute: (TextFontReference toFont: self); yourself). s reset]] ]]. contents editWithLabel: (aLabelOrNil ifNil: [self printString]).!
packages@lists.squeakfoundation.org