print-sheet.scm 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. ;;;
  2. ;;; Copyright 2016 Jason K. MacDuffie
  3. ;;; License: GPLv3+
  4. ;;;
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6. ;; Prints a character sheet as an HTML or TXT document
  7. ;; This is built around FUDGE with a 1-to-7 scale
  8. ;;
  9. ;; Character sheets have this structure:
  10. ;; $ cat char-sheet.sxml
  11. ;; (character
  12. ;; (name "My Name")
  13. ;; (player "John Doe")
  14. ;; (date-created 1999 01 10)
  15. ;; (unspent-ep 0)
  16. ;; (total-ep 0)
  17. ;; (race "Human")
  18. ;; (class "Merchant")
  19. ;; (wounds (scratch #f #f)
  20. ;; (hurt #f #f)
  21. ;; (very-hurt #f #f)
  22. ;; (incapacitated #f)
  23. ;; (near-death #f))
  24. ;; (attributes
  25. ;; (str 4)
  26. ;; (con 4)
  27. ;; (dex 4)
  28. ;; (int 4)
  29. ;; (wis 4)
  30. ;; (cha 4))
  31. ;; (skills
  32. ;; (climb 4)
  33. ;; (heavy-armor 2))
  34. ;; (gifts
  35. ;; "Looks that can kill")
  36. ;; (flaws
  37. ;; "Heavy sleeper")
  38. ;; (inventory
  39. ;; (gold 10)
  40. ;; (iron-sword 1)))
  41. ;;
  42. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  43. (import (scheme base)
  44. (scheme cxr)
  45. (scheme char)
  46. (scheme write)
  47. (scheme read)
  48. (scheme file)
  49. (scheme process-context)
  50. (srfi 1)
  51. (srfi 28))
  52. (define (usage)
  53. (display "Usage:\n")
  54. (exit)
  55. 0)
  56. ;; To capitalize the first letter
  57. (define (list-set l i v)
  58. (if (= i 0)
  59. (cons v (cdr l))
  60. (cons (car l) (list-set (cdr l) (- i 1) v))))
  61. (define (string-set s i v)
  62. (list->string (list-set (string->list s) i v)))
  63. (define (capitalize-first s)
  64. (string-set s 0 (char-upcase (string-ref s 0))))
  65. ;; Dates
  66. (define (list->date l)
  67. (define datemap
  68. '(() January February March April May
  69. June July August September October November December))
  70. (define month (list-ref datemap (list-ref l 1)))
  71. (format "~a ~a, ~a" month (list-ref l 2) (list-ref l 0)))
  72. (define sheet-location
  73. (if (null? (cdr (command-line)))
  74. (usage)
  75. (cadr (command-line))))
  76. (define sheet
  77. (let ((p (open-input-file sheet-location)))
  78. (define s (read p))
  79. (close-input-port p)
  80. s))
  81. (define mode
  82. (cond
  83. ((null? (cddr (command-line)))
  84. 'html)
  85. ((equal? (caddr (command-line)) "--html")
  86. 'html)
  87. ((equal? (caddr (command-line)) "--txt")
  88. 'txt)
  89. (else
  90. (usage))))
  91. (if (> (length (command-line)) 3)
  92. (usage))
  93. (define (write-to-html)
  94. (define (display-keyval k v)
  95. (display
  96. (format "
  97. <li>
  98. <div class=\"col\">~a</div>
  99. <div class=\"col\">~a</div>
  100. </li>
  101. "
  102. k
  103. v)))
  104. (display
  105. (format "
  106. <!DOCTYPE html>
  107. <head>
  108. <title>~a</title>
  109. <style>
  110. table.charsheet {
  111. background-color: #c0e0f0;
  112. }
  113. .col {
  114. display: inline-block;
  115. width: 4cm;
  116. }
  117. .minicol {
  118. display: inline-block;
  119. width: 3cm;
  120. }
  121. td {
  122. vertical-align: top;
  123. }
  124. ul {
  125. list-style-type: none;
  126. }
  127. body {
  128. color: #000070;
  129. }
  130. </style>
  131. </head>
  132. <body>
  133. <table style=\"width:20cm\" class=\"charsheet\">
  134. <tr>
  135. <td>
  136. <ul>
  137. <li>
  138. <div class=\"col\">Name:</div>
  139. <div class=\"col\">~a</div>
  140. </li>
  141. <li>
  142. <div class=\"col\">Player:</div>
  143. <div class=\"col\">~a</div>
  144. </li>
  145. <li>
  146. <div class=\"col\">Date created:</div>
  147. <div class=\"col\">~a</div>
  148. </li>
  149. </ul>
  150. </td>
  151. <td>
  152. <ul>
  153. <li>
  154. <div class=\"col\">Race:</div>
  155. <div class=\"col\">~a</div>
  156. </li>
  157. <li>
  158. <div class=\"col\">Class:</div>
  159. <div class=\"col\">~a</div>
  160. </li>
  161. <li>
  162. <div class=\"col\">Unspent EP:</div>
  163. <div class=\"col\">~a</div>
  164. </li>
  165. <li>
  166. <div class=\"col\">Total EP:</div>
  167. <div class=\"col\">~a</div>
  168. </li>
  169. </ul>
  170. </td>
  171. </tr>
  172. <tr>
  173. <td colspan=\"2\">
  174. <ul>
  175. <li><b>Wounds</b></li>
  176. <li>
  177. "
  178. (cadr (assq 'name (cdr sheet)))
  179. (cadr (assq 'name (cdr sheet)))
  180. (cadr (assq 'player (cdr sheet)))
  181. (list->date (cdr (assq 'date-created (cdr sheet))))
  182. (cadr (assq 'race (cdr sheet)))
  183. (cadr (assq 'class (cdr sheet)))
  184. (cadr (assq 'unspent-ep (cdr sheet)))
  185. (cadr (assq 'total-ep (cdr sheet)))))
  186. ;; Now damage types
  187. (for-each (lambda (l)
  188. (display "<div class=\"minicol\">")
  189. (for-each (lambda (x)
  190. (if x (display "X ") (display "O ")))
  191. (cdr l))
  192. (display "</div>"))
  193. (cdr (assq 'wounds (cdr sheet))))
  194. (display "</li><li>")
  195. (for-each (lambda (l)
  196. (display "<div class=\"minicol\">")
  197. (display (car l))
  198. (display "</div>"))
  199. (cdr (assq 'wounds (cdr sheet))))
  200. (display "</li>")
  201. ;; Now display the non-fixed areas
  202. (display "
  203. </ul>
  204. </td>
  205. </tr>
  206. <tr>
  207. <td>
  208. <ul>
  209. <li><b>Attributes</b></li>")
  210. (for-each (lambda (l)
  211. (display-keyval
  212. (string-append
  213. (string-upcase (symbol->string (car l)))
  214. ":")
  215. (cadr l)))
  216. (cdr (assq 'attributes (cdr sheet))))
  217. (display "
  218. </ul>
  219. </td>
  220. <td>
  221. <ul>
  222. <li><b>Skills</b></li>")
  223. (for-each (lambda (l)
  224. (display-keyval
  225. (string-append
  226. (capitalize-first (symbol->string (car l)))
  227. ":")
  228. (cadr l)))
  229. (cdr (assq 'skills (cdr sheet))))
  230. (display "
  231. </ul>
  232. </td>
  233. </tr>
  234. <tr>
  235. <td>
  236. <ul>
  237. <li><b>Gifts</b></li>")
  238. (for-each (lambda (s)
  239. (display (format "
  240. <li>~a</li>\n" s)))
  241. (cdr (assq 'gifts (cdr sheet))))
  242. (display "
  243. </ul>
  244. </td>
  245. <td>
  246. <ul>
  247. <li><b>Flaws</b></li>")
  248. (for-each (lambda (s)
  249. (display (format "
  250. <li>~a</li>\n" s)))
  251. (cdr (assq 'flaws (cdr sheet))))
  252. (display "
  253. </ul>
  254. </td>
  255. </tr>
  256. <tr>
  257. <td>
  258. <ul>
  259. <li><b>Inventory</b></li>\n")
  260. (for-each (lambda (l)
  261. (display (format "<li>~a ~a</li>\n"
  262. (cadr l)
  263. (car l))))
  264. (cdr (assq 'inventory (cdr sheet))))
  265. (display "
  266. </ul>
  267. </td>
  268. </tr>
  269. <tr>
  270. <td colspan=\"2\">
  271. <ul>
  272. <li><b>Story</b></li>
  273. <li>")
  274. (display (cadr (assq 'story (cdr sheet))))
  275. (display "
  276. </li>
  277. </ul>
  278. </td>
  279. </tr>
  280. </table>
  281. </body>
  282. </html>
  283. "))
  284. (write-to-html)