@@ -188,35 +188,34 @@ def concepts(request):
188188 meta_structure .key
189189 )
190190
191+ lexers = [get_highlighter (lang .key ) for lang in languages ]
191192 all_categories = []
192193
193194 for (category_key , category ) in meta_structure .categories .items ():
194- concepts_list = [concepts_data (key , name , languages ) for (key , name ) in category .items ()]
195+ concept_keys = list (category .keys ())
196+ concepts_list = [concepts_data (key , name , languages , lexers ) for (key , name ) in category .items ()]
195197
196198 category_entry = {
197199 "key" : category_key ,
198200 "concepts" : concepts_list ,
199- "is_incomplete" : [False ] * len ( languages )
201+ "is_incomplete" : []
200202 }
201- for i in range (len (languages )):
202- is_incomplete = True
203- for concept in concepts_list :
204- if not languages [i ].concept_unknown (concept ["key" ]) and \
205- languages [i ].concept_implemented (concept ["key" ]):
206- is_incomplete = False
207- if languages [i ].concept_unknown (concept ["key" ]) or \
208- (languages [i ].concept_implemented (concept ["key" ]) and \
209- not languages [i ].concept_code (concept ["key" ]) and \
210- not languages [i ].concept_comment (concept ["key" ]) ):
211- category_entry ["is_incomplete" ][i ] = True
212- break
213- if is_incomplete :
214- category_entry ["is_incomplete" ][i ] = True
203+
204+ for lang in languages :
205+ is_incomplete = False
206+ # If nothing in this category is implemented for this language
207+ if not lang .has_any_implemented_in_category (concept_keys ):
208+ is_incomplete = True
209+ # OR if at least one concept is missing code/comment
210+ elif lang .is_category_incomplete (concept_keys ):
211+ is_incomplete = True
212+
213+ category_entry ["is_incomplete" ].append (is_incomplete )
214+
215215 all_categories .append (category_entry )
216216
217- for lang in languages :
218- booleans = [category ["is_incomplete" ][languages .index (lang )] for category in all_categories ]
219- lang ._is_incomplete = any (booleans )
217+ for i , lang in enumerate (languages ):
218+ lang ._is_incomplete = any (cat ["is_incomplete" ][i ] for cat in all_categories )
220219
221220 return render_concepts (request , languages , meta_structure , all_categories )
222221
@@ -321,20 +320,22 @@ def get_highlighter(language):
321320 return lexer
322321
323322# Helper functions
324- def format_code_for_display (concept_key , lang ):
323+ def format_code_for_display (concept_key , lang , lexer = None ):
325324 """
326325 Returns the formatted HTML formatted syntax-highlighted text for a concept key (from a meta
327326 language file) and a language
328327
329328 :param concept_key: name of the key to format
330329 :param lang: language to format it (in meta language/syntax highlighter format)
330+ :param lexer: optional pre-fetched lexer
331331 :return: string with code with applied HTML formatting
332332 """
333333
334334 if lang .concept_unknown (concept_key ) or lang .concept_code (concept_key ) is None :
335335 return "Unknown"
336336 if lang .concept_implemented (concept_key ):
337- lexer = get_highlighter (lang .key )
337+ if lexer is None :
338+ lexer = get_highlighter (lang .key )
338339 return highlight (
339340 lang .concept_code (concept_key ),
340341 lexer ,
@@ -357,22 +358,28 @@ def format_comment_for_display(concept_key, lang):
357358 return lang .concept_comment (concept_key )
358359
359360
360- def concepts_data (key , name , languages ):
361+ def concepts_data (key , name , languages , lexers = None ):
361362 """
362363 Generates the comparision object of a single concept
363364
364365 :param key: key of the concept
365366 :param name: name of the concept
366367 :param languages: list of languages to compare / get a reference for
368+ :param lexers: optional list of pre-fetched lexers corresponding to languages
367369 :return: string with code with applied HTML formatting
368370 """
371+ data = []
372+ for i , lang in enumerate (languages ):
373+ lexer = lexers [i ] if lexers else None
374+ data .append ({
375+ "code" : format_code_for_display (key , lang , lexer ),
376+ "comment" : format_comment_for_display (key , lang )
377+ })
378+
369379 return {
370380 "key" : key ,
371381 "name" : name ,
372- "data" : [{
373- "code" : format_code_for_display (key , lang ),
374- "comment" : format_comment_for_display (key , lang )
375- } for lang in languages ],
382+ "data" : data ,
376383 }
377384
378385
0 commit comments