3
3
'''Elm module generator from templates.
4
4
5
5
Usage:
6
- melm add [-w] [-t TEMPLATE ] MODULE_NAME...
7
- melm push [-w] MODULE_NAME...
6
+ melm add [-w] [-t TEMPLATE ] MODULE_NAME
7
+ melm push [-w] MODULE_SOURCE MODULE_TARGET
8
8
9
9
Commands:
10
10
add Add a new sub-component.
@@ -58,9 +58,9 @@ def checks(self):
58
58
def run (self ):
59
59
q = self .conf
60
60
if q ["add" ]:
61
- self .add_subcomponent (q ["MODULE_NAME" ][ 0 ] )
61
+ self .add_subcomponent (q ["MODULE_NAME" ])
62
62
elif q ["push" ]:
63
- self .push_subcomponent (* q ["MODULE_NAME " ])
63
+ self .push_subcomponent (q ["MODULE_SOURCE" ], q [ "MODULE_TARGET " ])
64
64
65
65
def get_module_map (self , module_name ):
66
66
modules = module_name .split ("." )
@@ -85,6 +85,7 @@ def add_subcomponent(self, module_name):
85
85
print (s )
86
86
87
87
def push_subcomponent (self , module_name_source , module_name_target ):
88
+ """ See self.rmatch for the sec doc. """
88
89
push_in_submodule = False
89
90
if "Components" in module_name_target .split ('.' ):
90
91
push_in_submodule = True
@@ -102,24 +103,26 @@ def push_subcomponent(self, module_name_source, module_name_target):
102
103
pos = 0 ,
103
104
),
104
105
dict (
105
- reg = r"\n " ,
106
+ reg = r"} " ,
106
107
pos = - 1 ,
107
- t = ", ${module_basename_lower1} : ${module_basename}.State"
108
+ t = ", ${module_basename_lower1} : ${module_basename}.State" ,
109
+ before = True
108
110
)
109
111
]
110
112
init_spec = [
111
113
dict (
112
- reg = r"^init .*?=\s*let.*? in " ,
114
+ reg = r"^init .*?=\s*let.*? in\s " ,
113
115
pos = 0 ,
114
116
),
115
117
dict (
116
118
reg = r"^\s*model\s*=\s*{.*?}" ,
117
119
pos = 0 ,
118
120
),
119
121
dict (
120
- reg = r"\n " ,
122
+ reg = r"} " ,
121
123
pos = - 1 ,
122
- t = ", ${module_basename_lower1} = ${module_basename}.init global.session.user"
124
+ t = ", ${module_basename_lower1} = ${module_basename}.init global.session.user" ,
125
+ before = True
123
126
)
124
127
]
125
128
msg_spec = [
@@ -129,7 +132,7 @@ def push_subcomponent(self, module_name_source, module_name_target):
129
132
),
130
133
dict (
131
134
reg = r"\n" ,
132
- pos = - 3 ,
135
+ pos = - 4 ,
133
136
t = "| ${module_basename}Msg ${module_basename}.Msg"
134
137
)
135
138
]
@@ -142,43 +145,45 @@ def push_subcomponent(self, module_name_source, module_name_target):
142
145
reg = r"\n" ,
143
146
pos = - 3 ,
144
147
t = '''
145
- ${module_basename}Msg msg ->
146
- let
147
- ( data, out ) = ${module_basename}.update apis msg model.${module_basename_lower1}
148
-
149
- ( cmds, gcmds ) = %s
150
- in
151
- ( %s )
152
- ''' % ( 'mapGlobalOutcmds out.gcmds' if not push_in_submodule else '([], [])'
153
- , "{ model | ${module_basename_lower1} = data}, out.cmds |> List.map (\m -> Cmd.map ${module_basename}Msg m) |> List.append cmds |> Cmd.batch, Cmd.batch gcmds" if not push_in_submodule else
154
- "{ model | ${module_basename_lower1} = data }, out2 (List.map (\m -> Cmd.map ${module_basename}Msg m) out.cmds |> List.append cmds) (out.gcmds ++ gcmds)" )
148
+ ${module_basename}Msg msg ->
149
+ let
150
+ ( data, out ) = ${module_basename}.update apis msg model.${module_basename_lower1}
151
+
152
+ ( cmds, gcmds ) = %s
153
+ in
154
+ ( %s ) \n ''' % ( 'mapGlobalOutcmds out.gcmds' if not push_in_submodule else '([], [])'
155
+ , "{model | ${module_basename_lower1} = data}, out.cmds |> List.map (\m -> Cmd.map ${module_basename}Msg m) |> List.append cmds |> Cmd.batch, Cmd.batch gcmds" if not push_in_submodule else
156
+ "{ model | ${module_basename_lower1} = data }, out2 ( List.map (\m -> Cmd.map ${module_basename}Msg m) out.cmds |> List.append cmds) (out.gcmds ++ gcmds)" ),
157
+ indent_offset = 4 ,
155
158
),
156
159
]
157
160
subscriptions_spec = [
158
161
dict (
159
162
reg = r"^subscriptions .*?=.*?\n\n\n" ,
160
163
pos = 0 ,
161
- t = "|> Sub.batch" if not push_in_submodule else ""
164
+ t = "|> Sub.batch" if not push_in_submodule else "" ,
165
+ before = True ,
162
166
),
163
167
dict (
164
168
reg = r"\n" ,
165
- pos = - 4 ,
169
+ pos = - 2 if not push_in_submodule else - 4 ,
166
170
t = "++ (${module_basename}.subscriptions |> List.map (\s -> Sub.map ${module_basename}Msg s))"
167
171
)
168
172
]
169
173
view_spec = [
170
174
dict (
171
- reg = r"^view .*?=.*?\n\n\n" ,
175
+ reg = r"^view .*?=.*?( \n\n\n|\Z) " ,
172
176
pos = 0 ,
173
177
),
174
178
dict (
175
179
reg = r"\s+body\s*=\s*\[.*?\]" ,
176
180
pos = 0 ,
177
181
),
178
182
dict (
179
- reg = r"\n " ,
183
+ reg = r"\] " ,
180
184
pos = - 1 ,
181
- t = ", ${module_basename}.view {} model.${module_basename_lower1} |> Html.map ${module_basename}Msg"
185
+ t = ", ${module_basename}.view {} model.${module_basename_lower1} |> Html.map ${module_basename}Msg" ,
186
+ before = True ,
182
187
)
183
188
]
184
189
@@ -219,26 +224,27 @@ def rmatch(self, regs, content, mapping=None):
219
224
reg: regexp,
220
225
pos: int (0 for the first match and -1 for the last match)
221
226
t: template to add
227
+ -- OPTIONAL
228
+ before: insert content before the match (default after)
229
+ indent_offset: int (substract some indentation)
222
230
}
223
231
224
232
'''
225
233
226
234
if len (regs ) == 0 :
227
235
return
228
236
229
- #print(content)
230
- #print('-'*29)
231
-
232
237
reg = regs [0 ]
233
238
lines = []
234
239
for m in re .finditer (reg ["reg" ], content , re .MULTILINE | re .DOTALL ):
235
240
start , end = m .start (), m .end ()
236
241
line_start , line_end = content [0 :start ].count ("\n " ), content [0 :end ].count ("\n " )
237
242
# recompute start/end after/before the next/previous newline.
238
- offset = content [start :end ].find ('\n ' )
239
- start = (start if offset < 0 else start + offset )+ 1
240
- offset = content [:end ][::- 1 ].find ('\n ' )
241
- end = (end if offset < 0 else end - offset )- 1
243
+ # WTF?
244
+ #offset = content[start:end].find('\n')
245
+ #start = (start if offset < 0 else start + offset)+1
246
+ #offset = content[:end][::-1].find('\n')
247
+ #end = (end if offset < 0 else end - offset)-1 # @debug: end < start ??
242
248
lines .append ((line_start , line_end , start , end , m .group ()))
243
249
244
250
if len (lines ) == 0 :
@@ -258,11 +264,25 @@ def rmatch(self, regs, content, mapping=None):
258
264
if temp [line - offset ].strip () != n .strip ():
259
265
# Get the indent of the last line of content that is not empty
260
266
indent = len (temp [line - offset ]) - len (temp [line - offset ].lstrip ())
267
+ if reg .get ("indent_offset" ) and indent >= reg ["indent_offset" ]:
268
+ indent -= reg ["indent_offset" ]
261
269
# indent the patch
262
- n = list (map (lambda x : " " * indent + x .lstrip (), n .split ("\n " )))
263
- extension = temp [:line + 1 ] + n + temp [line + 1 :]
270
+ n = list (map (lambda x : " " * indent + x , n .split ("\n " )))
271
+
272
+ # Pasting index
273
+ if reg .get ("before" ):
274
+ nr = 0
275
+ last = temp [line - 1 ]
276
+ while last == "" :
277
+ nr += 1
278
+ last = temp [line - 1 - nr ]
279
+ else :
280
+ nr = - 1
281
+
282
+ # Rebuild content
283
+ extension = temp [:line - nr ] + n + temp [line - nr :]
264
284
content = "\n " .join (extension )
265
- end = end + len (n )
285
+ end += len (n )
266
286
267
287
r = self .rmatch (regs [1 :], content [start :end ], mapping = mapping )
268
288
if r :
0 commit comments