summaryrefslogtreecommitdiff
path: root/desk/lib/sigil/sigil.hoon
diff options
context:
space:
mode:
Diffstat (limited to 'desk/lib/sigil/sigil.hoon')
-rw-r--r--desk/lib/sigil/sigil.hoon227
1 files changed, 227 insertions, 0 deletions
diff --git a/desk/lib/sigil/sigil.hoon b/desk/lib/sigil/sigil.hoon
new file mode 100644
index 0000000..bde3889
--- /dev/null
+++ b/desk/lib/sigil/sigil.hoon
@@ -0,0 +1,227 @@
+:: sigil: @p svg generation
+::
+:: usage: do a named import, then invoke as a function:
+:: (sigil ~zod)
+::
+:: optionally modify configuration parameters:
+:: %. ~paldev
+:: %_ sigil
+:: size 25
+:: fg "black"
+:: bg "#2aa779"
+:: margin |
+:: icon &
+:: ==
+::
+::NOTE svg construction logic is coupled to the symbols definitions.
+:: the symbols' elements assume they live in a space of 128x128.
+:: what we do here is assume an svg _canvas_ of 128x128, draw the
+:: symbols at their original sizes, and then scale them down to fit.
+::
+/+ sigil-symbols
+::
+:: config
+::
+=/ fg=tape "white"
+=/ bg=tape "black"
+=/ size=@ud 128
+=/ margin=? &
+=/ icon=? |
+::
+::
+~% %sigil ..part ~
+=/ who=ship ~zod
+=/ syc=@ud 1
+|^ |= =ship
+ ^- manx
+ ::
+ =. who ship
+ =/ syz (simp who)
+ =. syc (lent syz)
+ :: shift the sigil to account for the margin
+ :: scale the sigil to account for the amount of symbols
+ ::
+ =/ sire=@rd (sun:rd size)
+ =/ tr=tape
+ ::TODO render transform inside +sigil:svg?
+ %+ transform:svg
+ ?. margin ~
+ =+ grid:pos
+ `[(gird:pos x) (gird:pos y)]
+ `span:pos
+ ::
+ =/ sw=@rd ::TODO
+ ?: icon .~0.8 ::TODO scale with size?
+ (add:rd .~0.33 (div:rd sire .~128))
+ ::
+ %- outer:svg
+ %+ sigil:svg
+ [tr sw]
+ (symbols:svg syz)
+::
+++ pos
+ |%
+ ++ span :: symbol scale (relative to full canvas)
+ ^- @rd
+ ::TODO accounting for margin here feels a bit ugly?
+ ?+ (max grid) !!
+ %1 ?:(margin .~0.4 .~1)
+ %2 ?:(margin .~0.4 .~0.5)
+ %4 ?:(margin .~0.2 .~0.25)
+ ==
+ ::
+ ++ grid :: size in symbols
+ ^- [x=@ud y=@ud]
+ ?+ syc !!
+ %16 [4 4]
+ %8 [4 4]
+ %4 [2 2]
+ %2 [2 1]
+ %1 [1 1]
+ ==
+ ::
+ ++ gird :: calculate margin
+ |= n=@ud
+ ^- @rd
+ =- (div:rd - .~2) :: / both sides
+ %+ sub:rd .~128 :: canvas size -
+ %+ mul:rd (sun:rd n) :: symbols *
+ %+ mul:rd span:pos :: symbol scale *
+ .~128 :: symbol size
+ ::
+ ++ plan :: as position on symbol grid
+ |= i=@ud
+ ^- [x=@ud y=@ud]
+ ?+ [syc i] !!
+ [%16 *] [(mod i 4) (div i 4)]
+ ::
+ [%8 %0] [0 0]
+ [%8 %1] [3 0]
+ [%8 %2] [0 3]
+ [%8 %3] [3 3]
+ [%8 %4] [1 1]
+ [%8 %5] [2 1]
+ [%8 %6] [1 2]
+ [%8 %7] [2 2]
+ ::
+ [%4 *] [(mod i 2) (div i 2)]
+ [%2 *] [i 0]
+ [%1 *] [0 0]
+ ==
+ --
+::
+++ svg
+ |%
+ ++ outer
+ |= inner=manx
+ ^- manx
+ =/ s=tape ((d-co:co 1) size)
+ ;svg
+ =style "display: block; width: {s}px; height: {s}px;" :: prevent bottom margin on svg tag
+ =width s
+ =height s
+ =viewBox "0 0 128 128"
+ =version "1.1"
+ =xmlns "http://www.w3.org/2000/svg"
+ ::TODO additional attributes from config arg?
+ ;rect
+ =fill bg
+ =width "128"
+ =height "128";
+ ;+ inner
+ ==
+ ::
+ ::TODO should it be possible to get these svg elements out of this lib?
+ ++ sigil
+ |= [[tr=tape sw=@rd] symbols=(list manx)]
+ ^- manx
+ ;g
+ =transform tr
+ =stroke-width (say-rd sw)
+ =stroke-linecap "square"
+ =fill fg
+ =stroke bg
+ ::NOTE unfortunately, vector-effect cannot be inherited,
+ :: so it gets inlined in the symbol elements instead
+ :: =vector-effect "non-scaling-stroke"
+ ;* symbols
+ ==
+ ::
+ ++ symbols
+ |= noms=(list @t)
+ ^- (list manx)
+ =| i=@ud
+ =/ l=@ud (lent noms)
+ |-
+ ?~ noms ~
+ :_ $(noms t.noms, i +(i))
+ ::TODO exclude if both 0
+ =+ (plan:pos i)
+ ;g(transform (transform `[(sun:rd (mul x 128)) (sun:rd (mul y 128))] ~))
+ ;* =+ ((symbol i.noms) fg bg)
+ ?.(icon - (scag 1 -))
+ ==
+ ::
+ ++ symbol ~(got by sigil-symbols)
+ ::
+ ++ transform ::TODO take manx instead so we can omit attr entirely?
+ |= [translate=(unit [x=@rd y=@rd]) scale=(unit @rd)]
+ ^- tape
+ %- zing
+ ^- (list tape)
+ ::TODO make cleaner
+ =- ?: ?=(?(~ [* ~]) -) -
+ (join " " `(list tape)`-)
+ ^- (list tape)
+ :~ ?~ translate ~
+ ?: =([0 0] u.translate) ~
+ "translate({(say-rd x.u.translate)} {(say-rd y.u.translate)})"
+ ::
+ ?~ scale ~
+ "scale({(say-rd u.scale)})"
+ ==
+ --
+::
+++ simp
+ |= =ship
+ ^- (list @t)
+ :: split into phonemes
+ ::
+ =/ noms=(list @t)
+ =/ nom=@t
+ (rsh 3 (scot %p ship))
+ |- ?~ nom ~
+ |- ?: =('-' (end 3 nom))
+ $(nom (rsh 3 nom))
+ :- (end 3^3 nom)
+ ^$(nom (rsh 3^3 nom))
+ :: fill leading empties with 'zod'
+ ::
+ =/ left=@ud
+ =- (sub - (lent noms))
+ %- bex
+ ?- (clan:title ship)
+ %czar 0
+ %king 1
+ %duke 2
+ %earl 3
+ %pawn 4
+ ==
+ |-
+ ?: =(0 left) noms
+ $(noms ['zod' noms], left (dec left))
+::
+++ rd ~(. ^rd %n)
+++ say-rd
+ |= n=@rd
+ ^- tape
+ =/ =dn (drg:rd n)
+ ?> ?=(%d -.dn)
+ =/ [s=? m=@ud] (old:si e.dn)
+ =/ x=@ud (pow 10 m)
+ %+ weld
+ %- (d-co:co 1)
+ ?:(s (mul a.dn x) (div a.dn x))
+ ?: s ~
+ ['.' ((d-co:co m) (mod a.dn x))]
+--