first commit
This commit is contained in:
commit
edfb7bae16
6
README.md
Normal file
6
README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# racket svg macros
|
||||||
|
|
||||||
|
simple macros to make generating svg's a little easier.
|
||||||
|
|
||||||
|
`test.svg` is what the current script produces
|
||||||
|
`out.png` is that `svg` passed through inkscape at 10x size
|
70
svg.rkt
Normal file
70
svg.rkt
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#lang racket
|
||||||
|
|
||||||
|
(require "xml.rkt")
|
||||||
|
|
||||||
|
(define-tag svg)
|
||||||
|
(define-tag defs)
|
||||||
|
(define-single-tag circle)
|
||||||
|
(define-single-tag rect)
|
||||||
|
(define-single-tag line)
|
||||||
|
(define-single-tag use)
|
||||||
|
(define-tag clipPath)
|
||||||
|
|
||||||
|
(displayln
|
||||||
|
(let
|
||||||
|
([doc-width 100]
|
||||||
|
[doc-height 100]
|
||||||
|
[stone-radius 5]
|
||||||
|
[black-colour "#222222"]
|
||||||
|
[white-colour "#DDDDDD"]
|
||||||
|
[stone-border 1]
|
||||||
|
[board-edge 2]
|
||||||
|
[board-colour "#F9D77D"]
|
||||||
|
[edge-colour "#000000"])
|
||||||
|
(svg
|
||||||
|
([xmlns:xlink "http://www.w3.org/1999/xlink"]
|
||||||
|
[width doc-width]
|
||||||
|
[height doc-width])
|
||||||
|
(defs ()
|
||||||
|
(clipPath
|
||||||
|
([id "board-clip"])
|
||||||
|
(rect
|
||||||
|
([width doc-width]
|
||||||
|
[height doc-height])))
|
||||||
|
(circle
|
||||||
|
([id "black-stone"]
|
||||||
|
[cx 0]
|
||||||
|
[cy 0]
|
||||||
|
[r stone-radius]
|
||||||
|
[stroke-width stone-border]
|
||||||
|
[stroke white-colour]
|
||||||
|
[fill black-colour]))
|
||||||
|
(circle
|
||||||
|
([id "white-stone"]
|
||||||
|
[cx 0]
|
||||||
|
[cy 0]
|
||||||
|
[r stone-radius]
|
||||||
|
[stroke-width stone-border]
|
||||||
|
[stroke black-colour]
|
||||||
|
[fill white-colour])))
|
||||||
|
(rect
|
||||||
|
([width doc-width]
|
||||||
|
[height doc-height]
|
||||||
|
[stroke edge-colour]
|
||||||
|
[clip-path "url(#board-clip)"]
|
||||||
|
[stroke-width (* 2 board-edge)]
|
||||||
|
[fill board-colour]))
|
||||||
|
(map (lambda (x)
|
||||||
|
(use
|
||||||
|
([xlink:href "#black-stone"]
|
||||||
|
[x (+ (/ doc-width 2)
|
||||||
|
(* 30
|
||||||
|
(cos (/ (* x pi)
|
||||||
|
180))))]
|
||||||
|
[y (+ (/ doc-height 2)
|
||||||
|
(* 30
|
||||||
|
(sin (/ (* x pi)
|
||||||
|
180))))])))
|
||||||
|
(range 0 360 40)))))
|
||||||
|
|
||||||
|
(provide (all-defined-out))
|
1
test.svg
Normal file
1
test.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100"><defs><clipPath id="board-clip"><rect width="100" height="100"/></clipPath><circle id="black-stone" cx="0" cy="0" r="5" stroke-width="1" stroke="#DDDDDD" fill="#222222"/><circle id="white-stone" cx="0" cy="0" r="5" stroke-width="1" stroke="#222222" fill="#DDDDDD"/></defs><rect width="100" height="100" stroke="#000000" clip-path="url(#board-clip)" stroke-width="4" fill="#F9D77D"/><use xlink:href="#black-stone" x="80" y="50"/><use xlink:href="#black-stone" x="72.98133329356934" y="69.28362829059617"/><use xlink:href="#black-stone" x="55.20944533000791" y="79.54423259036625"/><use xlink:href="#black-stone" x="35.00000000000001" y="75.98076211353316"/><use xlink:href="#black-stone" x="21.80922137642275" y="60.260604299770065"/><use xlink:href="#black-stone" x="21.809221376422748" y="39.73939570022994"/><use xlink:href="#black-stone" x="34.999999999999986" y="24.019237886466847"/><use xlink:href="#black-stone" x="55.209445330007895" y="20.455767409633758"/><use xlink:href="#black-stone" x="72.98133329356934" y="30.716371709403813"/></svg>
|
After Width: | Height: | Size: 1.1 KiB |
86
xml.rkt
Normal file
86
xml.rkt
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
#lang racket
|
||||||
|
|
||||||
|
(require
|
||||||
|
(for-syntax
|
||||||
|
racket/base
|
||||||
|
syntax/parse))
|
||||||
|
|
||||||
|
(define (tag-start name attrs)
|
||||||
|
(string-append
|
||||||
|
(format "<~a" name)
|
||||||
|
(apply
|
||||||
|
string-append
|
||||||
|
(map (lambda (x)
|
||||||
|
(let ([t (car x)]
|
||||||
|
[v (cdr x)])
|
||||||
|
(format " ~a=\"~a\"" t v)))
|
||||||
|
attrs))))
|
||||||
|
|
||||||
|
(define (single-tag-end)
|
||||||
|
"/>")
|
||||||
|
|
||||||
|
(define (tag-end name content)
|
||||||
|
(string-append
|
||||||
|
">"
|
||||||
|
(if (list? content)
|
||||||
|
(apply string-append content)
|
||||||
|
content)
|
||||||
|
(format "</~a>" name)))
|
||||||
|
|
||||||
|
(define (tag name attrs content)
|
||||||
|
(string-append
|
||||||
|
(tag-start name attrs)
|
||||||
|
(tag-end name content)))
|
||||||
|
|
||||||
|
(define (single-tag name attrs)
|
||||||
|
(string-append
|
||||||
|
(tag-start name attrs)
|
||||||
|
(single-tag-end)))
|
||||||
|
|
||||||
|
(define-syntax (mtag stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ name:id
|
||||||
|
([t:id v:expr] ...)
|
||||||
|
content:expr ...)
|
||||||
|
#'(tag
|
||||||
|
(symbol->string 'name)
|
||||||
|
(list
|
||||||
|
(cons
|
||||||
|
(symbol->string 't)
|
||||||
|
(if (number? v)
|
||||||
|
(number->string v)
|
||||||
|
v)) ...)
|
||||||
|
(apply string-append
|
||||||
|
(flatten
|
||||||
|
(list content ...))))]))
|
||||||
|
|
||||||
|
(define-syntax (msingle-tag stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ name:id
|
||||||
|
([t:id v:expr] ...))
|
||||||
|
#'(single-tag
|
||||||
|
(symbol->string 'name)
|
||||||
|
(list
|
||||||
|
(cons
|
||||||
|
(symbol->string 't)
|
||||||
|
(if (number? v)
|
||||||
|
(number->string v)
|
||||||
|
v)) ...))]))
|
||||||
|
|
||||||
|
(define-syntax (define-tag stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ name:id)
|
||||||
|
#'(define-syntax (name stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ attrs:expr content:expr (... ...))
|
||||||
|
#'(mtag name attrs content (... ...))]))]))
|
||||||
|
|
||||||
|
(define-syntax (define-single-tag stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ name:id)
|
||||||
|
#'(define-syntax (name stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ attrs:expr)
|
||||||
|
#'(msingle-tag name attrs)]))]))
|
||||||
|
|
||||||
|
(provide (all-defined-out))
|
Loading…
Reference in New Issue
Block a user