@@ -166,6 +166,38 @@ def format_url(cls, path, domain):
166166 assert isinstance (domain , str ) and len (domain ) != 0
167167 return f'{ JmModuleConfig .PROT } { domain } { path } '
168168
169+ class DSLReplacer :
170+
171+ def __init__ (self ):
172+ self .dsl_dict : Dict [Pattern , Callable [[Match ], str ]] = {}
173+
174+ def parse_dsl_text (self , text ) -> str :
175+ for pattern , replacer in self .dsl_dict .items ():
176+ text = pattern .sub (replacer , text )
177+ return text
178+
179+ def add_dsl_and_replacer (self , dsl : str , replacer : Callable [[Match ], str ]):
180+ pattern = compile (dsl )
181+ self .dsl_dict [pattern ] = replacer
182+
183+ @classmethod
184+ def match_os_env (cls , match : Match ) -> str :
185+ name = match [1 ]
186+ value = os .getenv (name , None )
187+ assert value is not None , f"未配置环境变量: { name } "
188+ return os .path .abspath (value )
189+
190+ dsl_replacer = DSLReplacer ()
191+
192+ @classmethod
193+ def parse_to_abspath (cls , dsl_text : str ) -> str :
194+ path = cls .dsl_replacer .parse_dsl_text (dsl_text )
195+ return os .path .abspath (path )
196+
197+
198+ # 支持dsl: #{???} -> os.getenv(???)
199+ JmcomicText .dsl_replacer .add_dsl_and_replacer ('\$\{(.*?)\}' , JmcomicText .match_os_env )
200+
169201
170202class JmSearchSupport :
171203 # 用来缩减html的长度
0 commit comments