<div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000;text-align: left" dir="ltr">
<img id="7e385b00-1268-46ef-bd91-ef21e836f59e" src="cid:9ca58138-6339-4fad-820c-993abbd7bba2" width="351" height="235"></img><br><div class="mb_sig"></div>
<div><br></div><div>Best,</div><div>Marcel</div><blockquote class="history_container" type="cite" style="border-left-style: solid;border-width: 1px;margin-top: 20px;margin-left: 0px;padding-left: 10px;min-width: 500px">
<p style="color: #AAAAAA; margin-top: 10px;">Am 10.03.2022 16:27:23 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p><div style="font-family:Arial,Helvetica,sans-serif">Marcel Taeumel uploaded a new version of Tools to project The Trunk:<br>http://source.squeak.org/trunk/Tools-mt.1141.mcz<br><br>==================== Summary ====================<br><br>Name: Tools-mt.1141<br>Author: mt<br>Time: 10 March 2022, 4:27:09.051767 pm<br>UUID: e3ff94ed-ef02-2e48-a3c0-90884068593e<br>Ancestors: Tools-mt.1140<br><br>Revises glyph-browsing methods.<br><br>Adds new ones on ByteTextConverter and EncodedCharSet. The user can manually check whether the tables are correct.<br><br>Once you have installed a useful system font or fallback font, you can try this:<br><br>JISX0208 browseAllCodePoints.<br>MacRomanTextConverter browseAllCodePoints.<br>KOI8RTextConverter browseAllCodePoints.<br><br>I used MSGothic for my experiments:<br><br>TTCFont installFromFileNames: #('C:\Windows\Fonts\msgothic.ttc').<br>TextStyle setDefaultFallback: (TextStyle named: #MSGothic).<br>TextStyle installDefaultFallbackTextStyle.<br><br>=============== Diff against Tools-mt.1140 ===============<br><br>Item was changed:<br> ----- Method: AbstractFont>>browseGlyphsByCategoryOf:select:label: (in category '*Tools-Browsing') -----<br> browseGlyphsByCategoryOf: someCodePointsOrCharacters select: aBlock label: aLabelOrNil<br> "Like #browseGlyphsOf:... but group the code points by Unicode category."<br> <br> | sortedCodePoints contents isRange tmp separatorBlock | <br> isRange := isRange := someCodePointsOrCharacters isInterval and: [someCodePointsOrCharacters increment = 1].<br> <br> separatorBlock := [:codePoints :category |<br> (('\{1}\\' withCRs asText<br> format: { Unicode generalCategoryLabels at: category+1 ifAbsent: ['n/a'] })<br> addAttribute: (TextFontReference toFont: TextStyle defaultFixedFont);<br> addAttribute: (PluggableTextAttribute evalBlock: [self browseGlyphsByCategoryOf: codePoints select: aBlock label: aLabelOrNil]);<br> yourself) ].<br> <br> sortedCodePoints := (someCodePointsOrCharacters<br> collect: [:ea | ea isCharacter ifTrue: [ea charCode] ifFalse: [ea] ]<br>+ thenSelect: [:ea | aBlock value: (Unicode value: ea)])<br>- thenSelect: [:ea | aBlock value: (Character value: ea)])<br> sorted: [:a :b | | ca cb | (ca := (Unicode generalCategoryOf: a) ifNil: [0]) < (cb := (Unicode generalCategoryOf: b) ifNil: [0])<br> or: [ca = cb and: [a < b]]].<br> <br> "Header"<br> 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).<br> <br> String streamContents: [:s | | priorCategory currentCodePoints |<br> currentCodePoints := OrderedCollection new.<br> sortedCodePoints withIndexDo: [:codePoint :index |<br> | char category |<br>+ char := Unicode value: codePoint.<br>- char := Character value: codePoint.<br> category := Unicode generalCategoryOf: codePoint.<br> priorCategory ifNil: [priorCategory := category].<br> category = priorCategory ifTrue: [<br> currentCodePoints add: codePoint.<br> s nextPut: char].<br> (category ~= priorCategory or: [index = sortedCodePoints size])<br> ifTrue: [<br> contents := contents, (separatorBlock value: currentCodePoints value: priorCategory).<br> contents := contents, ((s cr; contents) asText addAttribute: (TextFontReference toFont: self); yourself).<br> currentCodePoints := OrderedCollection new.<br> s reset.<br> currentCodePoints add: codePoint.<br> s nextPut: char].<br> (self widthOf: char) = 0 ifTrue: [s nextPut: Character nbsp; nextPut: Character nbsp].<br> priorCategory := category]].<br> <br> contents editWithLabel: (aLabelOrNil ifNil: [self printString]).!<br><br>Item was changed:<br> ----- Method: AbstractFont>>browseGlyphsOf:select:label: (in category '*Tools-Browsing') -----<br> browseGlyphsOf: someCodePointsOrCharacters select: aBlock label: aLabelOrNil<br> "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."<br> <br> | contents isRange tmp separatorBlock |<br> isRange := someCodePointsOrCharacters isInterval and: [someCodePointsOrCharacters increment = 1].<br> <br> separatorBlock := [:currentRange |<br> (('\16r{1} to: 16r{2}\\' withCRs asText<br> format: { currentRange first printStringBase: 16 length: 6 padded: true. currentRange last printStringBase: 16 length: 6 padded: true })<br> addAttribute: (TextFontReference toFont: TextStyle defaultFixedFont);<br> addAttribute: (PluggableTextAttribute evalBlock: [self browseGlyphsFrom: currentRange first to: currentRange last select: aBlock]);<br> yourself)].<br> <br> "Header"<br> 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).<br> <br> String streamContents: [:s | | first last |<br> last := someCodePointsOrCharacters last.<br> someCodePointsOrCharacters withIndexDo: [:codePointOrChar :index |<br> | current char valid |<br> current := codePointOrChar isCharacter ifTrue: [codePointOrChar charCode] ifFalse: [codePointOrChar].<br>+ char := Unicode value: current.<br>- char := Character value: current.<br> (valid := (aBlock value: char))<br> ifTrue: [<br> s position = 0 ifTrue: [first := current].<br> s nextPut: char.<br> (self widthOf: char) = 0 ifTrue: [s nextPut: Character nbsp; nextPut: Character nbsp] ].<br> (valid not or: [index = someCodePointsOrCharacters size])<br> ifTrue: [s position = 0 ifFalse: [<br> isRange ifFalse: [contents := contents, String cr] ifTrue: [ | currentRange |<br> currentRange := first to: (index = someCodePointsOrCharacters size ifTrue: [last] ifFalse: [current-1]).<br> contents := contents, (separatorBlock value: currentRange)].<br> contents := contents, ((s cr; contents) asText addAttribute: (TextFontReference toFont: self); yourself).<br> s reset]] ]].<br> <br> contents editWithLabel: (aLabelOrNil ifNil: [self printString]).!<br><br>Item was added:<br>+ ----- Method: ByteTextConverter class>>browseAllCodePoints (in category '*Tools-Browsing') -----<br>+ browseAllCodePoints<br>+ "<br>+ MacRomanTextConverter browseAllCodePoints.<br>+ Latin1TextConverter browseAllCodePoints.<br>+ CP1252TextConverter browseAllCodePoints.<br>+ <br>+ MacLatin2TextConverter browseAllCodePoints. <br>+ Latin2TextConverter browseAllCodePoints.<br>+ <br>+ MacCyrillicTextConverter browseAllCodePoints.<br>+ <br>+ <br>+ "<br>+ self browseAllCodePointsUsing: TextStyle defaultFont.!<br><br>Item was added:<br>+ ----- Method: ByteTextConverter class>>browseAllCodePointsUsing: (in category '*Tools-Browsing') -----<br>+ browseAllCodePointsUsing: aFont<br>+ "Apply the receivers encoding (code points 0 to 255) to browse the result using glyphs of aFont (and its #fallbackFont)."<br>+ <br>+ aFont<br>+ browseGlyphsOf: (Array streamContents: [:s | | |<br>+ self decodeTable withIndexDo: [:ea :i | | codePoint |<br>+ codePoint := ea = -1<br>+ ifTrue: [ea]<br>+ ifFalse: [ea bitAnd: 16r1FFFFF "Drop language info / leadingChar"].<br>+ codePoint := codePoint caseOf: { [-1] -> [32]. [9 "tab"] -> [32]. [10 "line break"] -> [32]. [13 "line break"] -> [32]. } otherwise: [codePoint].<br>+ (i-1 \\ 16 = 0 and: [s position > 0]) ifTrue: [s cr].<br>+ s tab; nextPut: codePoint]])<br>+ label: self name, ' decoding table'.!<br><br>Item was added:<br>+ ----- Method: EncodedCharSet class>>browseAllCodePoints (in category '*Tools-Browsing') -----<br>+ browseAllCodePoints<br>+ "<br>+ JISX0208 browseAllCodePoints.<br>+ GB2312 browseAllCodePoints.<br>+ KSX1001 browseAllCodePoints.<br>+ "<br>+ <br>+ self browseAllCodePointsUsing: TextStyle defaultFont.!<br><br>Item was added:<br>+ ----- Method: EncodedCharSet class>>browseAllCodePointsUsing: (in category '*Tools-Browsing') -----<br>+ browseAllCodePointsUsing: aFont<br>+ "Apply the receivers encoding to browse the result using glyphs of aFont (and its #fallbackFont).<br>+ <br>+ (Locale isoLanguage: 'ja') languageEnvironment installFont. --- Fetch StrikeFont from metatoys.org; see #fontDownloadUrls<br>+ JISX0208 browseAllCodePointsUsing: (TextConstants at: #FontJapaneseEnvironment) last. --- Largest point size<br>+ ...<br>+ JISX0208 browseAllCodePointsUsing: (TTFontFileHandle fromFontFileName: 'C:\Windows\Fonts\msgothic.ttc') first font.<br>+ GB2312 browseAllCodePointsUsing: (TTFontFileHandle fromFontFileName: 'C:\Windows\Fonts\msyh.ttc') first font.<br>+ KSX1001 browseAllCodePointsUsing: (TTFontFileHandle fromFontFileName: 'C:\Windows\Fonts\batang.ttc') first font.<br>+ "<br>+ <br>+ aFont<br>+ browseGlyphsOf: (Array streamContents: [:s | | last |<br>+ self ucsTable do: [:ea |<br>+ (ea = -1 and: [last ~= -1] and: [s position > 0])<br>+ ifTrue: [s cr; cr] ifFalse: [ea ~= -1 ifTrue: [s nextPut: ea]].<br>+ last := ea]])<br>+ label: self name, ' encoding'.!<br><br><br></div></blockquote></div>