Created
September 5, 2011 08:52
-
-
Save VoQn/1194476 to your computer and use it in GitHub Desktop.
Font Size Converter (Q, Pt, mm, px) フォントサイズを引数に渡して,それぞれの単位で変換した値を標準出力
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env gosh | |
#| | |
Font Size Converter | |
This programm convert font size for each unit, and display standard output. | |
Usage: gosh font-size-conv.scm [-dpi][-Qpmx][--] [fonr-size] | |
Example: $ gosh font-size-conv.scm -dpi 300 -p 144 | |
Base Font Size (pt) : 144 pt | |
When Convert to Q : 203.0 Q | |
When Convert to mm : 50.8 mm | |
When Convert to px : 600.0 px | |
Oprions: | |
-dpi<rate> Set DPI(Dot Per Inch) <rate> (Default 96) | |
-Q (Default) Receive Argument as Q (Q) | |
-p|point Receive Argument as Point (pt) | |
-m|mm Receive Argument as Millimeter (mm) | |
-x|pixel Receive Argument as Pixel (px) | |
-h|help Display Help about this Program then Exit | |
|# | |
(use gauche.parseopt) | |
(define (inv r) (/. 1 r)) | |
(define pt:Q 1.41) | |
(define Q:pt (inv pt:Q)) | |
(define mm:pt 2.8345) | |
(define pt:mm (inv mm:pt)) | |
(define mm:Q 4) | |
(define Q:mm (inv mm:Q)) | |
(define inch:mm 25.4) | |
(define mm:inch (inv inch:mm)) | |
(define inch:pt 72) | |
(define pt:inch (inv inch:pt)) | |
(define inch:Q 101.6) | |
(define Q:inch (inv inch:Q)) | |
(define dpi 96) | |
(define pt:px (* pt:inch dpi)) | |
(define px:pt (inv pt:px)) | |
(define Q:px (* Q:inch dpi)) | |
(define px:Q (inv Q:px)) | |
(define mm:px (* mm:inch dpi)) | |
(define px:mm (inv mm:px)) | |
(define (set-dpi alt-dpi) | |
(set! dpi alt-dpi) | |
(set! pt:px (* pt:inch dpi)) | |
(set! px:pt (inv pt:px)) | |
(set! Q:px (* Q:inch dpi)) | |
(set! px:Q (inv Q:px)) | |
(set! mm:px (* mm:inch dpi)) | |
(set! px:mm (inv mm:px))) | |
(define (round-n n) | |
(let1 base (expt 10 (- n 1)) | |
(.$ (cut /. <> base) round (pa$ * base)))) | |
(define (-> rate value) | |
((round-n 2) (* value rate))) | |
(define (disp-x-convert base base-unit conv-list) | |
(cons #`"Base Font Size (,|base-unit|)\t: ,|base|\t,|base-unit|" | |
(map (^ (x) | |
(let ([unit (car x)] | |
[rate (cdr x)]) | |
#`"When Convert to ,|unit|\t: ,(-> rate base)\t,|unit|")) | |
conv-list))) | |
(define (disp-pt-convert pt) | |
(disp-x-convert pt 'pt `((Q . ,pt:Q) (mm . ,pt:mm) (px . ,pt:px)))) | |
(define (disp-mm-convert mm) | |
(disp-x-convert mm 'mm `((Q . ,mm:Q) (pt . ,mm:pt) (px . ,mm:px)))) | |
(define (disp-px-convert px) | |
(disp-x-convert px 'px `((Q . ,px:Q) (pt . ,px:pt) (mm . ,px:mm)))) | |
(define (disp-Q-convert Q) | |
(disp-x-convert Q 'Q `((pt . ,Q:pt) (mm . ,Q:mm) (px . ,Q:px)))) | |
(define (usage) | |
(format (current-error-port) | |
"Usage : ~a [-dpi<rate>][-Qpmx][--] [font-size]\n" | |
*program-name*) | |
(opt-info) | |
(exit 2)) | |
(define (opt-info) | |
(for-each | |
'("options:" | |
" -dpi<rate>\tSet DPI(Dot Per Inch) <rate>\t(Default 96)" | |
" -Q (Default)\tReceive Argument as Q\t\t(Q)" | |
" -p|point\tReceive Argument as Point\t(pt)" | |
" -m|mm\t\tReceive Argument as Millimeter\t(mm)" | |
" -x|pixel\tReceive Argument as Pixel\t(px)" | |
" -h|help\tDisplay Help about this Program then Exit"))) | |
(define (unknown-option opt) | |
(print #`"Error : Unknown Option -- ,|opt|") | |
(usage)) | |
(define (not-number arg) | |
(print #`"Error : Font size required Number. but got ,|arg|") | |
(usage)) | |
(define (main args) | |
(if (null? args) (usage) | |
(let-args (cdr args) | |
([dpi "dpi=i" 96 => (pa$ set-dpi)] | |
[pt? "p|point"] | |
[mm? "m|mm"] | |
[px? "x|pixel"] | |
[Q? "Q"] | |
[help? "h|help"] | |
[else (opt . _) (unknown-option opt)] | |
. restargs) | |
(if (or help? (null? restargs)) (usage) | |
(let1 size (string->number (car restargs)) | |
(if (not size) (not-number (car restargs)) | |
(for-each print | |
((cond [pt? disp-pt-convert] | |
[mm? disp-mm-convert] | |
[px? disp-px-convert] | |
[else disp-Q-convert]) | |
size))))))) | |
0) | |
;; EOF |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment