1+ import { getTypePickerView } from "./typePicker" ;
2+ import { block , autoSizeInput } from "../../domUtils" ;
3+
4+ /**
5+ * Replaces the strings with spaces
6+ * @param string
7+ * @returns {string }
8+ */
9+ function padSpace ( string ) {
10+ return string . replace (
11+ / " ( [ ^ " ] * ) " / g,
12+ ( a , part ) => `"${ part . replace ( / [ \s \S ] / g, " " ) } "`
13+ ) ;
14+ }
15+
16+ /**
17+ * A hero function that handles formalSpec string like 'test2:%String(VALUELIST="1,2,3",MAXLEN=1)={"test"+"best"+{"a":1}},noType,typeOnly:Cinema.TicketOrder={##class(TestPack.MyType).%New("AHA!, AHAHA, AA!",1)},defaultOnly="lol"'
18+ * @param {string } formalSpec =
19+ * @returns {string[] }
20+ */
21+ function splitArguments ( formalSpec = "" ) {
22+
23+ let braceStack = [ { el : "" } ] ,
24+ padStr = padSpace ( formalSpec ) , // replace strings with spaces, so "test" turns to " ".
25+ braceArr = padStr . split ( "" ) ;
26+
27+ braceArr . forEach ( ( el , pos , arr ) => {
28+ if ( [ "{" , "}" , "(" , ")" ] . indexOf ( el ) === - 1 )
29+ return el ;
30+ if (
31+ ( el === "}" && braceStack [ braceStack . length - 1 ] . el === "{" )
32+ || ( el === ")" && braceStack [ braceStack . length - 1 ] . el === "(" )
33+ ) {
34+ for ( let i = braceStack . pop ( ) . pos + 1 ; i < pos ; i ++ ) {
35+ arr [ i ] = " " ;
36+ }
37+ } else {
38+ braceStack . push ( { el : el , pos : pos } ) ;
39+ }
40+ return el ;
41+ } ) ;
42+
43+ let braceStr = braceArr . join ( "" ) , // at this point we have replaced all non-control commas
44+ args = [ ] ;
45+
46+ braceStr . replace ( / [ ^ , ] + / g, ( part , pos ) => {
47+ args . push ( {
48+ str : formalSpec . substr ( pos , part . length ) ,
49+ pad : padStr . substr ( pos , part . length )
50+ } ) ;
51+ } ) ;
52+
53+ args . forEach ( ( { str, pad } , pos , arr ) => {
54+ let parArr = [ ] ,
55+ def = "" ,
56+ hasTypeParams = false ;
57+ pad . replace ( / ^ [ \w ] + : [ ^ \( = ] + \( ( [ ^ \) ] * ) \) / , ( part , params , pos ) => {
58+ hasTypeParams = true ;
59+ let originParams = str . substr ( pos + part . length - params . length - 1 , params . length ) ,
60+ padOrigin = padSpace ( originParams ) ;
61+ padOrigin . replace ( / [ ^ , ] + / g, ( part , pos ) => {
62+ let par = originParams . substr ( pos , part . length ) ,
63+ name = ( par . match ( / ^ ( [ ^ = ] + ) = / ) || { } ) [ 1 ] || "" ;
64+ parArr . push ( {
65+ name : name ,
66+ value : par . substr ( name . length + 1 )
67+ } ) ;
68+ } ) ;
69+ } ) ;
70+ pad . replace (
71+ hasTypeParams ? / \) = ( [ \s \S ] + ) $ / : / = ( [ \s \S ] + ) $ / ,
72+ ( part , d , pos ) => def = str . substr ( pos + 1 + ( hasTypeParams ? 1 : 0 ) , d . length )
73+ ) ;
74+ arr [ pos ] = {
75+ name : str . match ( / ^ [ ^ \. : = ] + / ) [ 0 ] ,
76+ type : ( str . match ( / : ( [ ^ \( = ] + ) / ) || { } ) [ 1 ] || "" ,
77+ parameters : parArr ,
78+ default : def
79+ } ;
80+ } ) ;
81+
82+ return args ;
83+ }
84+
85+ function show ( element ) {
86+ element . style . display = "" ;
87+ }
88+
89+ function hide ( element ) {
90+ element . style . display = "none" ;
91+ }
92+
93+ export function getFormalSpecEditor ( { formalSpec = "" , savePath } ) {
94+
95+ let container = block ( `div` , `formalSpecEdit` ) ,
96+ args = splitArguments ( formalSpec ) ;
97+
98+ args . forEach ( ( arg , i ) => {
99+
100+ let span = block ( `span` , `argument` ) ,
101+ name = autoSizeInput ( { placeholder : `Name` , value : arg . name , className : `nameInput` } ) ,
102+ asSpan = block ( `span` , `typeSpan` ) ,
103+ defaultSpan = block ( `span` ) ;
104+
105+ if ( i > 0 )
106+ span . appendChild ( block ( `span` , `` , `, ` ) ) ;
107+
108+ span . appendChild ( name ) ;
109+ asSpan . appendChild ( block ( `span` , `` , ` As ` ) ) ;
110+ let typeInput = autoSizeInput ( { placeholder : `Type` , value : arg . type || "" } ) ;
111+ if ( ! arg . type ) {
112+ hide ( asSpan ) ;
113+ }
114+ asSpan . appendChild ( typeInput ) ;
115+ span . appendChild ( asSpan ) ;
116+ span . appendChild ( defaultSpan ) ;
117+
118+ container . appendChild ( span ) ;
119+ } ) ;
120+
121+ return container ;
122+
123+ }
0 commit comments