smalltalk
/
osmo-st-all
Archived
1
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
osmo-st-all/grease/Core/Text/GRPrinter.st

329 lines
9.0 KiB
Smalltalk

GRObject subclass: GRPrinter [
<comment: nil>
<category: 'Grease-Core-Text'>
GRPrinter class >> cookieTimestamp [
"Netscape's original proposal defined an Expires header that took a date value in a fixed-length variant format in place of Max-Age: Wdy, DD-Mon-YY HH:MM:SS GMT"
<category: 'factory'>
^GRMappedPrinter block: [:timestamp | timestamp asUTC]
next: self abbreviatedWeekName , ', ' , self paddedDay , '-'
, self abbreviatedMonthName , '-'
, self paddedYear , ' '
, self isoTime , ' GMT'
]
GRPrinter class >> httpDate [
"Answers a printer that formats dates for HTTP1.1 (RFC 2616)"
<category: 'factory'>
^self rfc1123
]
GRPrinter class >> isoDate [
"Ansers a printer that formats dates accoring to ISO(YYYY-MM-DD) E.g.
2003-12-24"
<category: 'factory'>
^self paddedYear , $- , self paddedMonth , $- , self paddedDay
]
GRPrinter class >> isoTime [
"Ansers a printer that formats time accoring to ISO(HH:MM:SS) E.g.
12:23:34"
<category: 'factory'>
^self paddedHour24 , $: , self paddedMinute , $: , self paddedSecond
]
GRPrinter class >> rfc1123 [
"Answers a printer that formats dates for HTTP1.1 (RFC 1123). Eg.
Sun, 06 Nov 1994 08:49:37 GMT"
<category: 'factory'>
^GRMappedPrinter block:
[:date |
"For the purposes of HTTP, GMT is exactly equal to UTC (Coordinated Universal Time)"
date asUTC]
next: GRSequentialPrinter new , self abbreviatedWeekName , ', '
, self paddedDay , Character space
, self abbreviatedMonthName , Character space
, self paddedYear , Character space
, self isoTime , ' GMT'
]
GRPrinter class >> rfc822 [
"Answers a privter that formats dates according to RFC 822 (email). Eg.
Sun, 31 Aug 2008 19:41:46 +0200"
<category: 'factory'>
^self abbreviatedWeekName , ', ' , self paddedDay , Character space
, self abbreviatedMonthName , Character space
, self paddedYear , Character space
, self isoTime , Character space
, self offsetSign , self absOffsetHoursPadded
, self absOffsetMinutesPadded
]
GRPrinter class >> rfc822WithTimeZone: aString [
"Answers a privter that formats dates according to RFC 822 (email) with the given time zone String. Eg.
Sun, 31 Aug 2008 19:41:46 <aString>"
<category: 'factory'>
^self abbreviatedWeekName , ', ' , self paddedDay , Character space
, self abbreviatedMonthName , Character space
, self paddedYear , Character space
, self isoTime , Character space
, aString
]
GRPrinter class >> swissCurrency [
<category: 'factory'>
^GRSequentialPrinter new , 'CHF ' , GRSignPrinter new
, ((GRNumberPrinter new)
separator: $';
precision: 2;
accuracy: 0.05;
yourself)
]
GRPrinter class >> usCurrency [
<category: 'factory'>
^GRSignPrinter new , $$ , ((GRNumberPrinter new)
separator: $,;
precision: 2;
yourself)
]
GRPrinter class >> abbreviatedMonthName [
<category: 'parts-date'>
^self
monthName: #('Jan' 'Feb' 'Mar' 'Apr' 'May' 'Jun' 'Jul' 'Aug' 'Sep' 'Oct' 'Nov' 'Dec')
]
GRPrinter class >> abbreviatedWeekName [
<category: 'parts-date'>
^self weekName: #('Sun' 'Mon' 'Tue' 'Wed' 'Thu' 'Fri' 'Sat')
]
GRPrinter class >> absOffsetHoursPadded [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date offset hours abs]
next: (self numberWithAtLeastDigits: 2)
]
GRPrinter class >> absOffsetMinutesPadded [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date offset minutes abs]
next: (self numberWithAtLeastDigits: 2)
]
GRPrinter class >> fullMonthName [
<category: 'parts-date'>
^self
monthName: #('January' 'February' 'March' 'April' 'May' 'June' 'July' 'August' 'September' 'October' 'November' 'December')
]
GRPrinter class >> fullWeekName [
<category: 'parts-date'>
^self
weekName: #('Monday' 'Tuesday' 'Wednesday' 'Thursday' 'Friday' 'Saturday' 'Sunday')
]
GRPrinter class >> monthName: anArray [
<category: 'parts-date'>
^GRPluggablePrinter on: [:date | anArray at: date monthIndex]
]
GRPrinter class >> offsetSign [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date offset]
next: ((GRSignPrinter new)
positivePrinter: $+;
negativePrinter: $-;
yourself)
]
GRPrinter class >> paddedCentury [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date year \\ 100]
next: (self numberWithAtLeastDigits: 2)
]
GRPrinter class >> paddedDay [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date dayOfMonth]
next: (self numberWithAtLeastDigits: 2)
]
GRPrinter class >> paddedMonth [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date monthIndex]
next: (self numberWithAtLeastDigits: 2)
]
GRPrinter class >> paddedYear [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date year]
next: (self numberWithAtLeastDigits: 4)
]
GRPrinter class >> unpaddedCentury [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date year \\ 100]
next: GRNumberPrinter new
]
GRPrinter class >> unpaddedDay [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date dayOfMonth] next: GRNumberPrinter new
]
GRPrinter class >> unpaddedMonth [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date monthIndex] next: GRNumberPrinter new
]
GRPrinter class >> unpaddedYear [
<category: 'parts-date'>
^GRMappedPrinter block: [:date | date year] next: GRNumberPrinter new
]
GRPrinter class >> weekName: anArray [
<category: 'parts-date'>
^GRPluggablePrinter on: [:date | anArray at: date dayOfWeek]
]
GRPrinter class >> paddedHour12 [
<category: 'parts-time'>
^GRMappedPrinter block: [:time | (time hour - 1) \\ 12 + 1]
next: (self numberWithAtLeastDigits: 2)
]
GRPrinter class >> paddedHour24 [
<category: 'parts-time'>
^GRMappedPrinter block: [:time | time hour]
next: (self numberWithAtLeastDigits: 2)
]
GRPrinter class >> paddedMinute [
<category: 'parts-time'>
^GRMappedPrinter block: [:time | time minute]
next: (self numberWithAtLeastDigits: 2)
]
GRPrinter class >> paddedSecond [
<category: 'parts-time'>
^GRMappedPrinter block: [:time | time second]
next: ((GRNumberPrinter new)
padding: $0;
digits: 2)
]
GRPrinter class >> unpaddedHour12 [
<category: 'parts-time'>
^GRMappedPrinter block: [:time | (time hour - 1) \\ 12 + 1]
next: GRNumberPrinter new
]
GRPrinter class >> unpaddedHour24 [
<category: 'parts-time'>
^GRMappedPrinter block: [:time | time hour] next: GRNumberPrinter new
]
GRPrinter class >> unpaddedMinute [
<category: 'parts-time'>
^GRMappedPrinter block: [:time | time minute] next: GRNumberPrinter new
]
GRPrinter class >> unpaddedSecond [
<category: 'parts-time'>
^GRMappedPrinter block: [:time | time second] next: GRNumberPrinter new
]
GRPrinter class >> binaryFileSize [
<category: 'parts-units'>
^GRUnitPrinter base: 1024
units: #('byte' 'bytes' 'KiB' 'MiB' 'GiB' 'TiB' 'PiB' 'EiB' 'ZiB' 'YiB')
]
GRPrinter class >> decimalFileSize [
<category: 'parts-units'>
^GRUnitPrinter base: 1000
units: #('byte' 'bytes' 'kB' 'MB' 'GB' 'TB' 'PB' 'EB' 'ZB' 'YB')
]
GRPrinter class >> numberWithAtLeastDigits: anInteger [
<category: 'parts-units'>
^(GRNumberPrinter new)
padding: $0;
digits: anInteger;
yourself
]
, aPrinter [
<category: 'operators'>
^GRSequentialPrinter new , self , aPrinter
]
print: anObject [
<category: 'printing'>
^String streamContents: [:stream | self print: anObject on: stream]
]
print: anObject on: aStream [
"Subclasses override this method to produce some output."
<category: 'printing'>
]
pad: aString center: aCharacter to: anInteger [
"Pad to the center of aString with aCharacter to at least anInteger characters."
<category: 'utilities'>
| result index |
anInteger <= aString size ifTrue: [^aString].
index := (anInteger - aString size) // 2.
result := (String new: anInteger) atAllPut: aCharacter.
result
replaceFrom: index + 1
to: index + aString size
with: aString
startingAt: 1.
^result
]
pad: aString left: aCharacter to: anInteger [
"Pad to the left side of aString with aCharacter to at least anInteger characters."
<category: 'utilities'>
| result |
anInteger <= aString size ifTrue: [^aString].
result := (String new: anInteger) atAllPut: aCharacter.
result
replaceFrom: anInteger - aString size + 1
to: anInteger
with: aString
startingAt: 1.
^result
]
pad: aString right: aCharacter to: anInteger [
"Pad to the right side of aString with aCharacter to at least anInteger characters."
<category: 'utilities'>
| result |
anInteger <= aString size ifTrue: [^aString].
result := (String new: anInteger) atAllPut: aCharacter.
result
replaceFrom: 1
to: aString size
with: aString
startingAt: 1.
^result
]
]