<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>