aboutsummaryrefslogtreecommitdiff
path: root/libs/fstring.neb
blob: 01479659c8d2e836b2e758e60169675ab476d745 (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
; bugs:
;#16> (fmt "{x} x {")
;exception! <class 'NameError'> name 'ev' is not defined


(func fmt :string (inp :string)
    ; need two variables
    ; 1. the current processed string
    ; 2. the neb code to run
    ;
    ; algorithm
    ;  - read characters one by one, adding to result
    ;  - if reach a {
    ;     - read characters one by one, adding to neb code
    ;     - when reach }, try to execute the neb code, 
    ;       then append to the end of the result
    ; - if the end of the string is successfully reached, return the result

    (def digits (split "0123456789"))
    (def aligns (split "^<>"))

    (func repeat (cnt)
        (def out "")
        (for-count cnt
            (redef out (concat out " ")))
        out)

    (func special-parse (str cur val)
        (if (eq? "}" (first str))
            (block
                ; [align][width] (to start)
                (def align-width
                    (if (in? (first cur) aligns)
                        (list (first cur) (string->int (rest cur)))
                        (list "<" (string->int cur))))
                (branch
                    ((>= (length val) (last align-width))
                        (list (rest str) val))
                    ((eq? "<" (first align-width))  ; align left
                        (list (rest str) (concat val (repeat (- (last align-width) (length val))))))
                    ((eq? ">" (first align-width))  ; align right
                        (list (rest str) (concat (repeat (- (last align-width) (length val))) val)))
                    (#true  ; align center
                        (block
                            (def half (/ (- (last align-width) (length val)) 2))
                            (if (int? half)
                                (list (rest str) (concat (repeat half) val (repeat half)))
                                (list (rest str) (concat (repeat (floor half)) val (repeat (+ 1 (floor half))))))))))

            (special-parse (rest str) (concat cur (first str)) val)))


    (func brace-parse :[:string] (str :string cur :string)
        ; returns (remaining value)
        (branch
            ((eq? "}" (first str))
                (list (rest str) (->string (eval (first (parse-neb cur))))))
            ((eq? "," (first str))
                (special-parse (rest str) "" (->string (eval (first (parse-neb cur))))))
            (#true
                (brace-parse (rest str) (concat cur (first str))))))

    (func inner-parse (str cur)
        (branch
            ((eq? 0 (length str)) cur)
            ((eq? "{" (first str))
                (block
                    (def tmp (brace-parse (rest str) ""))
                    (inner-parse (first tmp) (concat cur (first (rest tmp))))))
            (#true (inner-parse (rest str) (concat cur (first str))))))

    (inner-parse inp ""))