Guest User

Untitled

a guest
Jan 22nd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.44 KB | None | 0 0
  1. #!/usr/bin/env gosh
  2.  
  3. #|
  4. Font Size Converter
  5. This programm convert font size for each unit, and display standard output.
  6.  
  7. Usage: gosh font-size-conv.scm [-dpi][-Qpmx][--] [fonr-size]
  8.  
  9. Example: $ gosh font-size-conv.scm -dpi 300 -p 144
  10. Base Font Size (pt) : 144 pt
  11. When Convert to Q : 203.0 Q
  12. When Convert to mm : 50.8 mm
  13. When Convert to px : 600.0 px
  14.  
  15. Oprions:
  16. -dpi<rate> Set DPI(Dot Per Inch) <rate> (Default 96)
  17. -Q (Default) Receive Argument as Q (Q)
  18. -p|point Receive Argument as Point (pt)
  19. -m|mm Receive Argument as Millimeter (mm)
  20. -x|pixel Receive Argument as Pixel (px)
  21. -h|help Display Help about this Program then Exit
  22. |#
  23.  
  24. (use gauche.parseopt)
  25.  
  26. (define (inv r) (/. 1 r))
  27.  
  28. (define pt:Q 1.41)
  29. (define Q:pt (inv pt:Q))
  30.  
  31. (define mm:pt 2.8345)
  32. (define pt:mm (inv mm:pt))
  33.  
  34. (define mm:Q 4)
  35. (define Q:mm (inv mm:Q))
  36.  
  37. (define inch:mm 25.4)
  38. (define mm:inch (inv inch:mm))
  39.  
  40. (define inch:pt 72)
  41. (define pt:inch (inv inch:pt))
  42.  
  43. (define inch:Q 101.6)
  44. (define Q:inch (inv inch:Q))
  45.  
  46. (define dpi 96)
  47.  
  48. (define pt:px (* pt:inch dpi))
  49. (define px:pt (inv pt:px))
  50.  
  51. (define Q:px (* Q:inch dpi))
  52. (define px:Q (inv Q:px))
  53.  
  54. (define mm:px (* mm:inch dpi))
  55. (define px:mm (inv mm:px))
  56.  
  57. (define (set-dpi alt-dpi)
  58. (set! dpi alt-dpi)
  59. (set! pt:px (* pt:inch dpi))
  60. (set! px:pt (inv pt:px))
  61. (set! Q:px (* Q:inch dpi))
  62. (set! px:Q (inv Q:px))
  63. (set! mm:px (* mm:inch dpi))
  64. (set! px:mm (inv mm:px)))
  65.  
  66. (define (round-n n)
  67. (let1 base (expt 10 (- n 1))
  68. (.$ (cut /. <> base) round (pa$ * base))))
  69.  
  70. (define (-> rate value)
  71. ((round-n 2) (* value rate)))
  72.  
  73. (define (disp-x-convert base base-unit conv-list)
  74. (cons #`"Base Font Size (,|base-unit|)\t: ,|base|\t,|base-unit|"
  75. (map (^ (x)
  76. (let ([unit (car x)]
  77. [rate (cdr x)])
  78. #`"When Convert to ,|unit|\t: ,(-> rate base)\t,|unit|"))
  79. conv-list)))
  80.  
  81. (define (disp-pt-convert pt)
  82. (disp-x-convert pt 'pt `((Q . ,pt:Q) (mm . ,pt:mm) (px . ,pt:px))))
  83.  
  84. (define (disp-mm-convert mm)
  85. (disp-x-convert mm 'mm `((Q . ,mm:Q) (pt . ,mm:pt) (px . ,mm:px))))
  86.  
  87. (define (disp-px-convert px)
  88. (disp-x-convert px 'px `((Q . ,px:Q) (pt . ,px:pt) (mm . ,px:mm))))
  89.  
  90. (define (disp-Q-convert Q)
  91. (disp-x-convert Q 'Q `((pt . ,Q:pt) (mm . ,Q:mm) (px . ,Q:px))))
  92.  
  93. (define (usage)
  94. (format (current-error-port)
  95. "Usage : ~a [-dpi<rate>][-Qpmx][--] [font-size]\n"
  96. *program-name*)
  97. (opt-info)
  98. (exit 2))
  99.  
  100. (define (opt-info)
  101. (for-each
  102. print
  103. '("options:"
  104. " -dpi<rate>\tSet DPI(Dot Per Inch) <rate>\t(Default 96)"
  105. " -Q (Default)\tReceive Argument as Q\t\t(Q)"
  106. " -p|point\tReceive Argument as Point\t(pt)"
  107. " -m|mm\t\tReceive Argument as Millimeter\t(mm)"
  108. " -x|pixel\tReceive Argument as Pixel\t(px)"
  109. " -h|help\tDisplay Help about this Program then Exit")))
  110.  
  111. (define (unknown-option opt)
  112. (print #`"Error : Unknown Option -- ,|opt|")
  113. (usage))
  114.  
  115. (define (not-number arg)
  116. (print #`"Error : Font size required Number. but got ,|arg|")
  117. (usage))
  118.  
  119. (define (main args)
  120. (if (null? args) (usage)
  121. (let-args (cdr args)
  122. ([dpi "dpi=i" 96 => (pa$ set-dpi)]
  123. [pt? "p|point"]
  124. [mm? "m|mm"]
  125. [px? "x|pixel"]
  126. [Q? "Q"]
  127. [help? "h|help"]
  128. [else (opt . _) (unknown-option opt)]
  129. . restargs)
  130. (if (or help? (null? restargs)) (usage)
  131. (let1 size (string->number (car restargs))
  132. (if (not size) (not-number (car restargs))
  133. (for-each print
  134. ((cond [pt? disp-pt-convert]
  135. [mm? disp-mm-convert]
  136. [px? disp-px-convert]
  137. [else disp-Q-convert])
  138. size)))))))
  139. 0)
  140. ;; EOF
Add Comment
Please, Sign In to add comment