🍴 Meu Garfo é uma visualização em grafo dos CNPJs
cuducos.tngl.io/meu-garfo
1module Format exposing (formatCnpj, formatCpf, mask, maskCnpjInput, maskMultiple)
2
3
4mask : String -> String
5mask raw =
6 let
7 cleaned =
8 String.filter (\c -> Char.isAlphaNum c || c == '*') raw
9 in
10 if String.length cleaned == 14 then
11 formatCnpj cleaned
12
13 else if String.length cleaned == 11 then
14 formatCpf cleaned
15
16 else
17 raw
18
19
20maskCnpjInput : String -> String -> String
21maskCnpjInput previous raw =
22 let
23 previousAlnum =
24 String.filter Char.isAlphaNum previous
25
26 rawAlnum =
27 String.filter Char.isAlphaNum raw
28
29 deleting =
30 String.length raw < String.length previous
31
32 backspacedSeparator =
33 deleting && String.length rawAlnum == String.length previousAlnum
34
35 cleaned =
36 if backspacedSeparator then
37 String.dropRight 1 rawAlnum |> String.toUpper |> String.left 14
38
39 else
40 rawAlnum |> String.toUpper |> String.left 14
41
42 chunks =
43 [ ( 2, "." ), ( 5, "." ), ( 8, "/" ), ( 12, "-" ) ]
44
45 insertAt ( pos, sep ) s =
46 let
47 threshold =
48 if deleting then
49 pos + 1
50
51 else
52 pos
53 in
54 if String.length s >= threshold && String.length s > 0 then
55 String.left pos s ++ sep ++ String.dropLeft pos s
56
57 else
58 s
59 in
60 List.foldr insertAt cleaned chunks
61
62
63formatCnpj : String -> String
64formatCnpj s =
65 maskCnpjInput "" s
66
67
68formatCpf : String -> String
69formatCpf s =
70 String.left 3 s
71 ++ "."
72 ++ String.slice 3 6 s
73 ++ "."
74 ++ String.slice 6 9 s
75 ++ "-"
76 ++ String.slice 9 11 s
77
78
79maskMultiple : String -> String
80maskMultiple raw =
81 if String.contains "," raw then
82 String.split "," raw
83 |> List.map String.trim
84 |> List.map mask
85 |> String.join ", "
86
87 else
88 mask raw