aboutsummaryrefslogtreecommitdiff
path: root/src/e.bqn
blob: 74697dd3009b47b3cca92285b54ea4c203502f48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# Expression explainer: generates an svg diagram to show how a BQN
# program is evaluated

wh  10.8424
pad wh×21
to  0¯1+wh÷23
t   10

ps  At "stroke=currentColor|fill=none|stroke-width=1"
rc  At "class=code|stroke-width=1|rx=10"
gr  "g" At "font-family=BQN,monospace|font-size=18px|class=Paren|fill=currentColor"
gt  "g" At "font-size=15px|text-anchor=middle"
gb  "g" At "class=codeCover|stroke-width=8|stroke-linejoin=round"
gf  "g" At "opacity=0.9"

hlclhlch  <˘  2
  "Number"      , ('0'+↕10)"¯.π∞"
  "Paren"       , "()"
  "Bracket"     , "⟨⟩"
  "Brace"       , "{}"
  "Nothing"     , "·"
  "String"      , "'"'"'"@"
  "Comment"     , "#"

hlcl  
  "Gets"      # ¯3
  "Ligature"  # ¯2
  "Separator" # ¯1
  "Value"     #  0
  "Function"  #  1
  "Modifier"  #  2
  "Modifier2" #  3

GetHlclhlch{(+`¨𝕗)(𝕗)}
hlTag  {"<tspan class='"𝕩"'>"}¨ hlcl

escchars  """&<>"  escapes  ("&"∾∾";")¨"quot""amp""lt""gt"

Explain  {
  bconstblkbdy(ie)tok  𝕨
  babcbobp  '0'-˜ # For each instruction, number of:
    "11111000000000010000022000111012"  # Arguments
    "000//232323223102303200121111100"  # Stack values consumed
    "11111111111111011101111110111011"  # Stack values output
    "00000110111001001101000100000000"  # Position determiner
  
  m  { # Mask of instruction starts
    n  (↕≠b)+1+ba(⊣⊏˜>×⊢)b
    Se{(˜𝕨)Se 1¨((𝕩/𝕨))𝕩}(0=¯1⊑⊢)
    (≠↑∾≠Se 10¨) n
  }
  mbmi  0¯1 ¨ m/¨ bi
  la¯1=nambbc
  na(b˜1+⊣)(la/)˜/m
  no1(¯1)mbbo
  r+`no-na
  ! 1=¯1r
  d(+`no×)×f0<na
  p((¯1r)(r+⊒))⊏/na¬no
  kp↑¬f

  srctoksii  tok {
    tokrolevalse  𝕨
    n  hlch
    o  hlTag ˜ (n+3+role) (⊢+-×n=) GetHlcl s𝕩
    c  "</tspan>"¨e
    t  co
    ilf  /𝕩=@+10
    𝕩  ((ilfs)" ⋄")(ilf)𝕩
    uemescchars>eiescchars𝕩  t˜escapes˜em/ei
    ord u(¨t)/(/em)es-1
    src ord(u𝕩)∾∾t
    el  ei(¨escapes)1
    xe  (ord(+´el)>↕)/src
    tt  <˘⍉> o, xe˜el/1-˜s(⊣×>)(+`(𝕩)↑/)1+e, c
    ti  sk/mi
    src, titt, ti(s+e)÷2
  } 𝕩

  j¯1((1-˜+`k)ii)˜˜{s𝕩˜g𝕩(g/˜(s)=smbbp)((s))↕≠mb}p
  jej¯1.25
  q(/kjpje-la) (⊏≍⊣) p

  pd  <("M VH"¨)˘˜˝ q  FmtNum wh×0.50.1+jed
  tp  ii ("text" Attr Pos)(to+wh×≍)¨ (k/p)d
  dim (wh×𝕩,2+⌈´d)+20×pad
  (5120(⊣∾˜(t+pad)-˜-˜÷2˙)dim+2×t) SVG gr Enc ∾⥊¨
    <"rect" Elt rc(Pos-pad)"width""height"˘FmtNum dim
    <"text" Enc src
    ("path" Elt ps"d"<⊢)¨ pd
    gt Enc gb,gf Enc¨ (1¨ <(tp Enc¨) ¨) toks
  
}