@@ -237,7 +237,7 @@ print('[sphinx_anywidget] anywidget monkey-patch installed')
237237
238238 // 8. Collect text/x-python script blocks, group by src-file so each
239239 // example source runs exactly once even with multiple figures.
240- const srcGroups = new Map ( ) ; // srcFile → { src, pairs: [{figId, figIndex}] }
240+ const srcGroups = new Map ( ) ; // srcFile → { src, pairs: [{figId, figIndex}], packages: [] }
241241
242242 for ( const script of document . querySelectorAll (
243243 'script[type="text/x-python"][data-fig-id]' ) ) {
@@ -246,9 +246,14 @@ print('[sphinx_anywidget] anywidget monkey-patch installed')
246246 const figIndex = parseInt ( script . dataset . figIndex || '0' , 10 ) ;
247247 let src = '' ;
248248 try { src = JSON . parse ( script . dataset . src || 'null' ) || '' ; } catch ( _ ) { }
249-
250- if ( ! srcGroups . has ( srcFile ) ) srcGroups . set ( srcFile , { src, pairs : [ ] } ) ;
251- srcGroups . get ( srcFile ) . pairs . push ( { figId, figIndex } ) ;
249+ let packages = [ ] ;
250+ try { packages = JSON . parse ( script . dataset . pyodidePackages || 'null' ) || [ ] ; } catch ( _ ) { }
251+
252+ if ( ! srcGroups . has ( srcFile ) ) srcGroups . set ( srcFile , { src, pairs : [ ] , packages } ) ;
253+ const grp = srcGroups . get ( srcFile ) ;
254+ grp . pairs . push ( { figId, figIndex } ) ;
255+ // Merge any packages declared by any script tag for this source file.
256+ for ( const p of packages ) if ( ! grp . packages . includes ( p ) ) grp . packages . push ( p ) ;
252257 }
253258
254259 for ( const g of srcGroups . values ( ) )
@@ -257,10 +262,19 @@ print('[sphinx_anywidget] anywidget monkey-patch installed')
257262 // 9. Run each example source once, assign _anywidget_fig_id in creation
258263 // order, then push current state into the matching iframes.
259264 const _execErrors = [ ] ;
260- for ( const [ srcFile , { src, pairs } ] of srcGroups ) {
265+ for ( const [ srcFile , { src, pairs, packages } ] of srcGroups ) {
261266 const figIdList = JSON . stringify ( pairs . map ( p => p . figId ) ) ;
262267 console . info ( `[sphinx_anywidget] running: ${ srcFile } (${ pairs . length } figure(s))` ) ;
263268 const _srcFileRepr = JSON . stringify ( srcFile ) ;
269+
270+ // Load any extra packages declared by this example (e.g. scipy).
271+ if ( packages . length > 0 ) {
272+ console . info ( `[sphinx_anywidget] loading extra packages for ${ srcFile } :` , packages ) ;
273+ await _step ( `load packages for ${ srcFile } ` ,
274+ pyodide . loadPackage ( packages ) ) ;
275+ console . info ( `[sphinx_anywidget] extra packages loaded for ${ srcFile } ` ) ;
276+ }
277+
264278 try {
265279 await pyodide . runPythonAsync ( `
266280import anywidget as _aw
0 commit comments