开发工具前端【免费下载链接】jupyter_contrib_nbextensionsA collection of various notebook extensions for Jupyter项目地址https://gitcode.com/gh_mirrors/ju/jupyter_contrib_nbextensions点击查看免费下载Exercise及其姊妹版 Exercise2是jupyter_contrib_nbextensions仓库中专门用于把多个连续单元格组织成练习题 隐藏答案的 Notebook 扩展选中一组单元格后一键生成练习答案区默认折叠点击单元格内的控件即可展开/收起并且隐藏/显示状态会写入单元格元数据、在重启与刷新后自动恢复。本文以扩展目录内的 history.md 为脉络主线结合 readme.md、main.js 等源码文件完整讲解它的操作方式、配置项、底层元数据机制以及从 2014 年到 2017 年的关键演进读完后你可以在自己的教学或培训 Notebook 中直接复刻这套练习折叠方案。一、功能概述两个扩展、同一套思路Exercise 与 Exercise2 是两个使用相同代码骨架、仅在单元格控件形态上有差异的扩展见 exercise/readme.md 与 exercise2/readme.md扩展单元格控件形态默认快捷键来自 readme 与 main.js元数据键exercise一个带加减号的按钮fa-plus-square-o/fa-minus-square-o图标前置到标题单元格Alt-Ssolution、solution_firstexercise2一个滑动式开关onoffswitch 复选框带 CSS 样式追加到标题单元格Alt-Dsolution2、solution2_first两者都提供一个菜单栏/工具栏按钮负责创建或移除练习一个单元格级控件负责展开/收起答案区。两个扩展可以同时启用、互不干扰依赖的只是 Notebook 自身的多选能力详见下文。二、核心操作实战创建练习先在 Notebook 中选中一组连续单元格然后点击工具栏按钮扩展会以第一个单元格作为标题/问题单元格在标题单元格上添加展开/收起控件将其余单元格设为hidden默认隐藏作为答案区。多选方式readme 与 history 共同说明键盘多选Shift-J选择下一个/Shift-K选择上一个鼠标框选借助rubberband扩展拖拽框选新版 Notebook 多选 API 自带的Shift-Up/Shift-Down连续选择。readme 特别强调一个操作要点点击菜单按钮时请按住 Shift 键不放Do not forget to keep the Shift key pressed down while clicking on the menu buttonotherwise selected cells will be lost否则已选中的单元格可能会丢失。此外也可以直接使用快捷键Alt-Sexercise或Alt-Dexercise2把当前选中区变成练习。移除练习选中一个练习的标题第一个单元格后再次点击工具栏按钮或按快捷键该练习即被移除所有答案单元格恢复显示。展开/收起答案练习创建后答案默认隐藏。点击标题单元格上的加减号按钮exercise或滑动开关exercise2即可切换隐藏/显示状态。状态持久化练习的隐藏还是显示状态会被保存到单元格元数据中在重启 Notebook 或刷新页面后自动恢复。这是 history.md 中 2015 年 10 月更新引入的核心能力之一详见第五节。三、配置参数与安装启用两个扩展的配置元数据文件 exercise.yaml 与 exercise2.yaml 声明了相同的三个可配置参数参数名类型默认值作用add_buttoncheckboxtrue是否在工具栏添加创建/移除练习按钮use_hotkeycheckboxtrue是否注册创建/移除练习的键盘快捷键hotkeyhotkey见下文说明实际使用的快捷键组合需要说明的一点细节readme 与两个main.js中cfg的默认值是 exercise 用Alt-S、exercise2 用Alt-D见 exercise/main.js 与 exercise2/main.js而两个 yaml 文件里hotkey字段的默认值都标注为Alt-D仓库内文档与源码存在这一细微出入。实际生效值以main.js中cfg与用户在 configurator 里的设置为准——load_ipython_extension会通过IPython.notebook.config.data深合并用户配置来覆盖默认值。两个扩展的兼容性声明均为 Notebook 4.x、5.x。安装与启用根据 docs/source/install.md 的标准流程pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user # 将 JS/CSS 复制到 Jupyter 数据目录 jupyter nbextension enable exercise/main # 启用 exercise jupyter nbextension enable exercise2/main # 启用 exercise2可选也可以在树状页面打开nbextensions标签页通过jupyter_nbextensions_configurator勾选启用并在同一界面里调整add_button、use_hotkey、hotkey三个参数。四、源码级实现原理元数据契约这是整套机制的核心。创建练习时扩展在单元格上写入如下元数据见 readme 的 Internals 一节并在 exercise/main.js 与 exercise2/main.js 中得到印证solutionexercise/solution2exercise2值为hidden或shown记录该单元格所属答案区的当前显隐状态solution_firstexercise/solution2_firstexercise2标记练习的第一个单元格用于快速识别练习起点从而支持在同一个 Notebook 里连续排列多个练习。因为状态是纯元数据所以天然具备持久化能力Notebook 的.ipynb文件保存了这些字段重启后扩展可以据此重建界面状态。创建/移除逻辑create_remove_exercise()的流程exercise 版exercise2 版结构相同通过IPython.notebook.get_selected_cells()取得选中单元格若为空则弹出提示并返回若第一个单元格已带solution_first标记则进入移除分支删除控件、删除solution_first与solution元数据并沿get_next_cell()遍历后续带有solution的单元格逐一removeClass(hidden)恢复显示否则进入创建分支给第一个单元格写入solution_first true、solution hidden调用add_element()挂载控件并把其余选中单元格全部addClass(hidden)且写入solution hidden。显隐切换逻辑click_solution_lock()负责切换读取标题单元格的solution元数据翻转hidden/shown同步更新控件外观然后沿get_next_cell()遍历该练习内部的后续单元格判断条件为带solution且不带solution_first逐个toggleClass(hidden, ...)并同步元数据。遍历终止条件正是利用了solution_first标记——到达下一个练习的起点时立即停止多个练习互不串扰。启动恢复逻辑refresh_exercises()会在notebook_loaded.Notebook事件触发或_fully_loaded时立即执行遍历全部单元格遇到带solution/solution_first的单元格时重建控件并依据元数据中的hidden/shown值恢复各答案单元格的显隐。这就是刷新/重启后状态自动还原的源码依据。两种 Widget 的差异exercise 用add_element()把$(div classexercise fa)prependTo到标题单元格控件图标在fa-plus-square-o隐藏可展开与fa-minus-square-o显示可收起之间切换exercise2 则先给标题单元格设置flex-wrap: wrap再appendTo一个由onoffswitch复选框 滑块组成的滑动开关HTML 片段见 exercise2/main.js样式细节见 exercise2/main.css开关文案为 Hide Solution / Show Solution。五、演进历史全解析history.md 主线history.md 本身就是这份扩展的演进记录逐条展开如下。2014 年 10–11 月初版juhasch扩展的早期版本由 juhasch 编写。这一阶段的实现要求被选中的单元格在元数据中带有selected标记才能组成练习交互与容错都比较原始。2015 年 10 月 21–27 日迁移到 Multicell APIjfbercher这是 history.md 着墨最多的一次重构共四点接入 Notebook 多选 API多选不再依赖手工写入selected元数据而是可以直接使用rubberband扩展框选或用Shift-J选择下一个/Shift-K选择上一个快捷键选择。点按工具栏按钮即可把所选单元格整体变成默认隐藏的solution。history 同时记录当时Shift-Up/Shift-Down预计不久后也会生效readme 后来已将其列为可用多选方式。状态持久化solution 的隐藏/显示状态被写入solution元数据页面重载/内核重启后自动恢复。修复边界缺陷修正了练习定义在 Notebook 底部边缘时触发无限循环的问题。新增快捷键增加Alt-SS 代表 Solution用于快速创建/移除练习。2015 年 12 月 22 日solution_first支持连续练习本次更新为练习起点增加了solution_first元数据标记。在此之前扩展只能识别一个练习无法区分连续排列的多个练习有了该标记后遍历答案区时遇到下一个练习的起点即可安全终止同一 Notebook 中可以有多个连续练习互不干扰。2015 年 12 月 30 日适配 Notebook 4.1.x本次更新把扩展升级到兼容 Jupyter Notebook 4.1.x 系列保证在新版前端 API 下继续工作。2017 年 12 月源码注释补充与 collapsible_headings 协同history.md 未收录但在 exercise/main.js 与 exercise2/main.js 的头部注释中记录了 2017 年 12 月 6 日 jcb91 的改动改用 Bootstrap 的hidden类来实现折叠从而与同仓库的collapsible_headings扩展良好共处。这说明隐藏的实现从自定义样式统一到了 Notebook 的 Bootstrap 基础设施上。六、与其他扩展的协作及适用边界rubberbandreadme 声明两个扩展需要安装并启用 rubberband而 history 显示迁移到 Multicell API 后Shift-J/Shift-K等键盘多选也可独立完成选择。值得一提的是 rubberband/readme.md 自身标注仅适用于 IPython 3.x因此在新版 Notebook 上更推荐直接用内置多选快捷键。rubberband 的框选交互本身也很直观Shift 鼠标左键拖拽选择当前触碰的单元格CtrlShift 左键拖拽保留此前触碰过的选区。collapsible_headings2017 年的改动让两者的折叠样式都依赖 Bootstraphidden可以同时生效。适用边界与仓库内绝大多数 nbextension 一样它们面向经典 Jupyter Notebook 前端yaml 声明兼容 4.x、5.x不适用于 JupyterLab教学场景下请确认目标环境为 Notebook 前端。小结Exercise / Exercise2 用元数据驱动状态这一朴素而可靠的设计实现了教学 Notebook 中最常用的习题 可折叠答案交互其演进史selected元数据 → Multicell API →solution_first→ 4.1.x 适配 → Bootstrap hidden 统一本身就是一份理解 Notebook 前端 API 变迁的绝佳案例。如果你需要在课程材料中复用这套方案直接启用扩展、按选中 → 点按钮/按快捷键 → 点击控件三步即可上手。赞分享开发工具前端【免费下载链接】jupyter_contrib_nbextensionsA collection of various notebook extensions for Jupyter项目地址https://gitcode.com/gh_mirrors/ju/jupyter_contrib_nbextensions点击查看免费下载相关推荐Jupyter 练习答案隐藏扩展Exercise / Exercise2使用指南基于 jupyter_contrib_nbextensions 的答案单元格折叠方案Jupyter 练习答案隐藏扩展Exercise / Exercise2使用指南基于 jupyter_contrib_nbextensions 的答案单元开发工具前端Jupyter Contrib Nbextensions 之 Collapsible Headings可折叠标题扩展的配置、原理与导出实战Jupyter Contrib Nbextensions 之 Collapsible Headings可折叠标题扩展的配置、原理与导出实战 导读 Collap开发工具前端Jupyter Notebook 7 配置全景指南公共配置系统、Jupyter Server 与 Notebook 扩展实战Jupyter Notebook 7 配置全景指南公共配置系统、Jupyter Server 与 Notebook 扩展实战 Jupyter Notebook后端前端数据科学上一篇macOS防火墙LuLu终极指南三小时掌握开源防火墙的完整实战配置下一篇Exercises Dataset与AI集成使用机器学习生成个性化训练计划创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考