@@ -235,6 +235,17 @@ class TextLangInfo(LangInfo):
235235 filename_patterns = ["README" , "COPYING" , "LICENSE" , "MANIFEST" ]
236236
237237
238+ def _generateFallbackKoLangInfo (langinfo_db , koLangInst ):
239+ """Generate a LangInfo instance from the koILanguage instance."""
240+ class FallbackKoLangInfo (LangInfo ):
241+ conforms_to_bases = ["Text" ]
242+ default_encoding = "utf-8"
243+ def __init__ (self , db , koLang ):
244+ LangInfo .__init__ (self , db )
245+ self .name = koLang .name
246+ if koLang .defaultExtension :
247+ self .exts = [koLang .defaultExtension ]
248+ return FallbackKoLangInfo (langinfo_db , koLangInst )
238249
239250#---- the Database
240251
@@ -269,7 +280,7 @@ def langinfo_from_lang(self, lang):
269280 raise LangInfoError ("no info on %r lang" % lang )
270281 return self ._langinfo_from_norm_lang [norm_lang ]
271282
272- def langinfo_from_komodo_lang (self , komodo_lang ):
283+ def langinfo_from_komodo_lang (self , komodo_lang , tryFallback = True ):
273284 """Return a langinfo for the given Komodo language name.
274285
275286 There are some minor differences in Komodo language names and
@@ -283,6 +294,28 @@ def langinfo_from_komodo_lang(self, komodo_lang):
283294 return self ._li_from_norm_komodo_lang [norm_komodo_lang ]
284295 elif norm_komodo_lang in self ._langinfo_from_norm_lang :
285296 return self ._langinfo_from_norm_lang [norm_komodo_lang ]
297+ elif tryFallback :
298+ # If a koILanguage exists for this lang, then create a fallback
299+ # langinfo for it - this occurs when a user has defined an add-on or
300+ # language, but they haven't made a langinfo.py for it.
301+ try :
302+ from xpcom import components
303+ except ImportError :
304+ pass # no xpcom
305+ else :
306+ langSvc = components .classes ["@activestate.com/koLanguageRegistryService;1" ] \
307+ .getService (components .interfaces .koILanguageRegistryService )
308+ # Note: When the language does not exist, we get a fallback of
309+ # koILang.Text
310+ koLang = langSvc .getLanguage (komodo_lang )
311+ if koLang is not None and koLang .name in (komodo_lang , norm_komodo_lang ):
312+ # Someone's defined a koILanguage for this lang - create
313+ # dummy langinfo for it.
314+ log .warn ("no LangInfo class found for %r, creating a fallback for it" ,
315+ komodo_lang )
316+ self ._langinfo_from_norm_lang [norm_komodo_lang ] = _generateFallbackKoLangInfo (self , koLang )
317+ self ._build_tables ()
318+ return self .langinfo_from_komodo_lang (komodo_lang , tryFallback = False )
286319 raise LangInfoError ("no info on %r komodo lang" % komodo_lang )
287320
288321 def langinfo_from_emacs_mode (self , emacs_mode ):
0 commit comments