287 ]. |
287 ]. |
288 ]. |
288 ]. |
289 ]. |
289 ]. |
290 |
290 |
291 AccessLock critical:[ |
291 AccessLock critical:[ |
292 unicodeEncoderClasses := EncoderClassesByName at:#unicode. |
292 unicodeEncoderClasses := self encoderClassesByName at:#unicode. |
293 ]. |
293 ]. |
294 unicodeEncoderClasses notNil ifTrue:[ |
294 unicodeEncoderClasses notNil ifTrue:[ |
295 unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClassOrName | |
295 unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClassOrName | |
296 (name matches:eachEncodingAlias) ifTrue:[ |
296 (name matches:eachEncodingAlias) ifTrue:[ |
297 eachEncoderClassOrName isBehavior ifTrue:[ |
297 eachEncoderClassOrName isBehavior ifTrue:[ |
315 ]. |
315 ]. |
316 enc := unicodeEncoders at:name ifAbsent:nil. |
316 enc := unicodeEncoders at:name ifAbsent:nil. |
317 ]. |
317 ]. |
318 enc isNil ifTrue:[ |
318 enc isNil ifTrue:[ |
319 AccessLock critical:[ |
319 AccessLock critical:[ |
320 unicodeEncoderClasses := EncoderClassesByName at:#unicode ifAbsent:nil. |
320 unicodeEncoderClasses := self encoderClassesByName at:#unicode ifAbsent:nil. |
321 unicodeEncoderClasses isNil ifTrue:[ |
321 unicodeEncoderClasses isNil ifTrue:[ |
322 EncoderClassesByName at:#unicode put:(unicodeEncoderClasses := Dictionary new). |
322 self encoderClassesByName at:#unicode put:(unicodeEncoderClasses := Dictionary new). |
323 ]. |
323 ]. |
324 clsName := unicodeEncoderClasses at:name ifAbsent:nil. |
324 clsName := unicodeEncoderClasses at:name ifAbsent:nil. |
325 ]. |
325 ]. |
326 clsName notNil ifTrue:[ |
326 clsName notNil ifTrue:[ |
327 clsName isBehavior ifTrue:[ |
327 clsName isBehavior ifTrue:[ |
343 ]. |
343 ]. |
344 |
344 |
345 "/ no direct encoder from unicode->name |
345 "/ no direct encoder from unicode->name |
346 "/ search for unicode->any and: any->name |
346 "/ search for unicode->any and: any->name |
347 AccessLock critical:[ |
347 AccessLock critical:[ |
348 unicodeEncoderClasses := EncoderClassesByName at:#unicode ifAbsent:nil. |
348 unicodeEncoderClasses := self encoderClassesByName at:#unicode ifAbsent:nil. |
349 ]. |
349 ]. |
350 unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClass | |
350 unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClass | |
351 |dict2 enc1 enc2| |
351 |dict2 enc1 enc2| |
352 |
352 |
353 AccessLock critical:[ |
353 AccessLock critical:[ |
354 dict2 := EncoderClassesByName at:eachEncodingAlias ifAbsent:nil. |
354 dict2 := self encoderClassesByName at:eachEncodingAlias ifAbsent:nil. |
355 ]. |
355 ]. |
356 dict2 notNil ifTrue:[ |
356 dict2 notNil ifTrue:[ |
357 clsName := dict2 at:name ifAbsent:nil. |
357 clsName := dict2 at:name ifAbsent:nil. |
358 clsName notNil ifTrue:[ |
358 clsName notNil ifTrue:[ |
359 clsName isBehavior ifTrue:[ |
359 clsName isBehavior ifTrue:[ |
374 ] |
374 ] |
375 ] |
375 ] |
376 ]. |
376 ]. |
377 ]. |
377 ]. |
378 |
378 |
379 EncoderClassesByName keysAndValuesDo:[:encoding1 :dict1 | |
379 self encoderClassesByName keysAndValuesDo:[:encoding1 :dict1 | |
380 dict1 keysAndValuesDo:[:encoding2 :clsName1| |
380 dict1 keysAndValuesDo:[:encoding2 :clsName1| |
381 |clsName2 cls1 cls2 dict2 enc1 enc2| |
381 |clsName2 cls1 cls2 dict2 enc1 enc2| |
382 |
382 |
383 encoding2 = encodingNameSymbol ifTrue:[ |
383 encoding2 = encodingNameSymbol ifTrue:[ |
384 AccessLock critical:[ |
384 AccessLock critical:[ |
385 dict2 := EncoderClassesByName at:#unicode. |
385 dict2 := self encoderClassesByName at:#unicode. |
386 ]. |
386 ]. |
387 clsName2 := dict2 at:encoding1 ifAbsent:nil. |
387 clsName2 := dict2 at:encoding1 ifAbsent:nil. |
388 clsName2 notNil ifTrue:[ |
388 clsName2 notNil ifTrue:[ |
389 clsName1 isBehavior ifTrue:[ |
389 clsName1 isBehavior ifTrue:[ |
390 cls1 := clsName1 |
390 cls1 := clsName1 |
469 encoders isNil ifTrue:[ |
469 encoders isNil ifTrue:[ |
470 EncodersByName at:oldEncoding put:(encoders := Dictionary new). |
470 EncodersByName at:oldEncoding put:(encoders := Dictionary new). |
471 ]. |
471 ]. |
472 encoder := encoders at:newEncodingArg ifAbsent:nil. |
472 encoder := encoders at:newEncodingArg ifAbsent:nil. |
473 encoder isNil ifTrue:[ |
473 encoder isNil ifTrue:[ |
474 encoderClasses := EncoderClassesByName at:oldEncoding ifAbsent:nil. |
474 encoderClasses := self encoderClassesByName at:oldEncoding ifAbsent:nil. |
475 encoderClasses isNil ifTrue:[ |
475 encoderClasses isNil ifTrue:[ |
476 EncoderClassesByName at:oldEncoding put:(encoderClasses := Dictionary new). |
476 self encoderClassesByName at:oldEncoding put:(encoderClasses := Dictionary new). |
477 ]. |
477 ]. |
478 clsName := encoderClasses at:newEncoding ifAbsent:nil. |
478 clsName := encoderClasses at:newEncoding ifAbsent:nil. |
479 clsName notNil ifTrue:[ |
479 clsName notNil ifTrue:[ |
480 clsName isBehavior ifTrue:[ |
480 clsName isBehavior ifTrue:[ |
481 cls := clsName |
481 cls := clsName |
547 ^ NullEncoderInstance |
547 ^ NullEncoderInstance |
548 ! ! |
548 ! ! |
549 |
549 |
550 !CharacterEncoder class methodsFor:'class initialization'! |
550 !CharacterEncoder class methodsFor:'class initialization'! |
551 |
551 |
|
552 encoderClassesByName |
|
553 EncoderClassesByName isNil ifTrue:[ |
|
554 self initializeEncoderClassesByName |
|
555 ]. |
|
556 ^ EncoderClassesByName |
|
557 ! |
|
558 |
552 initialize |
559 initialize |
553 |ud| |
|
554 |
|
555 AccessLock notNil ifTrue:[^ self]. "/ already initialized |
560 AccessLock notNil ifTrue:[^ self]. "/ already initialized |
556 |
561 |
557 AccessLock := RecursionLock new name:'CharacterEncoder'. |
562 AccessLock := RecursionLock new name:'CharacterEncoder'. |
558 NullEncoderInstance := NullEncoder new. |
563 NullEncoderInstance := NullEncoder new. |
559 |
564 |
560 EncodersByName := Dictionary new. |
565 EncodersByName := Dictionary new. |
|
566 CachedEncoders := Dictionary new. |
|
567 |
|
568 self initializeEncoderClassesByName. |
|
569 |
|
570 OperatingSystem isUNIXlike ifTrue:[ |
|
571 "/Initialize OS system encoder |
|
572 OperatingSystem getCodesetEncoder. |
|
573 ]. |
|
574 |
|
575 " |
|
576 self initialize |
|
577 " |
|
578 |
|
579 "Modified: / 01-04-2011 / 14:30:06 / cg" |
|
580 "Modified (format): / 23-01-2013 / 09:56:53 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
581 ! |
|
582 |
|
583 initializeEncoderClassesByName |
|
584 "initialize the dictionary which maps commonly used names |
|
585 to encoder classes. |
|
586 This is done, because some encodings come along |
|
587 with different names" |
|
588 |
|
589 |ud| |
|
590 |
561 EncoderClassesByName := Dictionary new. |
591 EncoderClassesByName := Dictionary new. |
562 CachedEncoders := Dictionary new. |
|
563 |
592 |
564 EncoderClassesByName at:#'unicode' put:(ud := Dictionary new). |
593 EncoderClassesByName at:#'unicode' put:(ud := Dictionary new). |
565 ud at:#'fontspecific' put:NullEncoder. |
594 ud at:#'fontspecific' put:NullEncoder. |
566 ud at:#'adobe-fontspecific' put:NullEncoder. |
595 ud at:#'adobe-fontspecific' put:NullEncoder. |
567 ud at:#'ms-oem' put:NullEncoder. |
596 ud at:#'ms-oem' put:NullEncoder. |
1713 ! ! |
1737 ! ! |
1714 |
1738 |
1715 !CharacterEncoder class methodsFor:'documentation'! |
1739 !CharacterEncoder class methodsFor:'documentation'! |
1716 |
1740 |
1717 version |
1741 version |
1718 ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.138 2015-03-26 16:21:01 cg Exp $' |
1742 ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.139 2015-04-29 11:21:18 cg Exp $' |
1719 ! |
1743 ! |
1720 |
1744 |
1721 version_CVS |
1745 version_CVS |
1722 ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.138 2015-03-26 16:21:01 cg Exp $' |
1746 ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.139 2015-04-29 11:21:18 cg Exp $' |
1723 ! ! |
1747 ! ! |
1724 |
1748 |
1725 |
1749 |
1726 CharacterEncoder initialize! |
1750 CharacterEncoder initialize! |