@@ -27,7 +27,10 @@ import {
2727 ExecutionTarget ,
2828 kQmdExtensions ,
2929} from "./types.ts" ;
30- import { languagesInMarkdown } from "../core/pandoc/pandoc-partition.ts" ;
30+ import {
31+ languagesInMarkdown ,
32+ languagesWithClasses ,
33+ } from "../core/pandoc/pandoc-partition.ts" ;
3134import { languages as handlerLanguages } from "../core/handlers/base.ts" ;
3235import { RenderContext , RenderFlags } from "../command/render/types.ts" ;
3336import { mergeConfigs } from "../core/config.ts" ;
@@ -168,20 +171,35 @@ export function markdownExecutionEngine(
168171 }
169172
170173 // if there are languages see if any engines want to claim them
171- const languages = languagesInMarkdown ( markdown ) ;
174+ const languagesWithClassesMap = languagesWithClasses ( markdown ) ;
175+
176+ // see if there is an engine that claims this language (highest score wins)
177+ for ( const [ language , firstClass ] of languagesWithClassesMap ) {
178+ let bestEngine : ExecutionEngineDiscovery | undefined ;
179+ let bestScore = - Infinity ;
172180
173- // see if there is an engine that claims this language
174- for ( const language of languages ) {
175181 for ( const [ _ , engine ] of reorderedEngines ) {
176- if ( engine . claimsLanguage ( language ) ) {
177- return engine . launch ( engineProjectContext ( project ) ) ;
182+ const claim = engine . claimsLanguage ( language , firstClass ) ;
183+ // false means "don't claim", skip this engine entirely
184+ if ( claim === false ) {
185+ continue ;
186+ }
187+ // true -> score 1, number -> use as score
188+ const score = claim === true ? 1 : claim ;
189+ if ( score > bestScore ) {
190+ bestScore = score ;
191+ bestEngine = engine ;
178192 }
179193 }
194+
195+ if ( bestEngine ) {
196+ return bestEngine . launch ( engineProjectContext ( project ) ) ;
197+ }
180198 }
181199
182200 const handlerLanguagesVal = handlerLanguages ( ) ;
183201 // if there is a non-cell handler language then this must be jupyter
184- for ( const language of languages ) {
202+ for ( const language of languagesWithClassesMap . keys ( ) ) {
185203 if ( language !== "ojs" && ! handlerLanguagesVal . includes ( language ) ) {
186204 return jupyterEngineDiscovery . launch ( engineProjectContext ( project ) ) ;
187205 }
0 commit comments