├── .gitattributes ├── .github └── workflows │ ├── ExportNotebooks.yml │ └── KeepCacheFresh.yml ├── .gitignore ├── .vscode ├── extensions.json ├── settings.json └── tasks.json ├── Dockerfile ├── LICENSE.md ├── Procfile ├── README.md ├── Website maintenance.md ├── develop.jl ├── extra_outputs ├── CNAME └── index.html ├── netlify.toml ├── pluto-deployment-environment ├── Manifest.toml ├── PlutoDeployment.toml └── Project.toml ├── src ├── _includes │ ├── layout.jlhtml │ ├── md.jlmd │ └── welcome.md ├── assets │ ├── MIT_logo.svg │ ├── canvas_logo.svg │ ├── cute-one.png │ ├── discord_logo.svg │ ├── favicon.ico │ ├── favicon.svg │ ├── homepage │ │ ├── bg.afdesign │ │ ├── bg.svg │ │ └── swoosh.png │ ├── julia-logo-color.svg │ ├── julia-logo-dark.svg │ ├── mitx_logo.svg │ ├── piazza_logo.svg │ ├── scripts │ │ ├── search.js │ │ └── sidebar.js │ ├── staytuned.png │ ├── styles │ │ ├── homepage.css │ │ ├── index.css │ │ ├── layout.css │ │ ├── lecture_header.css │ │ ├── newdefault.css │ │ └── sidebar.css │ └── zoom_logo.svg ├── cheatsheets.md ├── climate_science │ ├── 2d_advection_diffusion.jl │ ├── advection_and_diffusion.jl │ ├── climate2_snowball_earth.jl │ ├── how_to_collaborate_on_software.jl │ ├── inverse_climate_model.jl │ ├── odes_and_parameterized_types.jl │ ├── optimization_with_JuMP.jl │ ├── our_first_climate_model.jl │ ├── predicting_the_weather.jl │ ├── predictthefuture.svg │ ├── resistors_and_stencils.jl │ └── time_stepping.jl ├── clips.md ├── data_science │ ├── discrete_and_continuous.jl │ ├── linearmodel_datascience.jl │ ├── optimization.jl │ ├── pca.jl │ ├── random_variables_as_types.jl │ ├── random_vars.jl │ ├── random_walks.jl │ ├── random_walks_II.jl │ ├── simulating_component_failure.jl │ └── testCSVwrite.csv ├── higham.jl ├── homework │ ├── hw0.jl │ ├── hw1.jl │ ├── hw10.jl │ ├── hw2.jl │ ├── hw3.jl │ ├── hw4.jl │ ├── hw5.jl │ ├── hw6.jl │ ├── hw7.jl │ ├── hw8.jl │ └── hw9.jl ├── images_abstractions │ ├── .gitignore │ ├── abstraction.jl │ ├── dynamicprograms.jl │ ├── images.jl │ ├── linear_transformation.jl │ ├── newton_method.jl │ ├── notes.pptx │ ├── seamcarving.jl │ ├── structure.jl │ ├── transformations2.jl │ ├── transformations_and_autodiff.jl │ └── transforming_images.jl ├── index.jlmd ├── installation.md ├── logistics.md ├── pluto_export_configuration.json ├── reviews.md ├── search.md ├── semesters.md ├── sidebar data.jl ├── structure.md └── week0 │ └── basic_syntax.jl └── tools └── update_notebook_packages.jl /.gitattributes: -------------------------------------------------------------------------------- 1 | page/* linguist-vendored 2 | * text=auto -------------------------------------------------------------------------------- /.github/workflows/ExportNotebooks.yml: -------------------------------------------------------------------------------- 1 | name: Fall 24 - Export Pluto notebooks & Deploy 2 | on: 3 | push: 4 | branches: 5 | - Fall24 6 | workflow_dispatch: 7 | concurrency: 8 | group: export 9 | cancel-in-progress: true 10 | 11 | jobs: 12 | build-and-deploy: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout Fall 24 source 16 | uses: actions/checkout@v4 17 | 18 | - name: 🙌 Install Julia 19 | uses: julia-actions/setup-julia@v2 20 | with: 21 | version: "1.10.4" 22 | 23 | - name: ⏱ Cache notebook states 24 | uses: actions/cache@v4 25 | with: 26 | path: _cache 27 | key: ${{ runner.os }}-pluto_state_cache-v3-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }}-${{ github.run_id }} 28 | restore-keys: | 29 | ${{ runner.os }}-pluto_state_cache-v3-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }} 30 | 31 | - name: ⏱ Cache .julia 32 | uses: actions/cache@v4 33 | with: 34 | path: ~/.julia 35 | key: ${{ runner.os }}-dotjulia-v1-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }}-${{ github.run_id }} 36 | restore-keys: | 37 | ${{ runner.os }}-dotjulia-v1-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }} 38 | 39 | - name: 📅 Checkout Fall20, Spring21, Fall22, Fall23 output 40 | uses: actions/checkout@v4 41 | with: 42 | path: Fall23-output 43 | ref: Fall23-output 44 | 45 | - name: 🪴 Generate site 46 | run: | 47 | julia --project=pluto-deployment-environment -e ' 48 | import Pkg 49 | Pkg.instantiate() 50 | import PlutoPages 51 | 52 | PlutoPages.generate("."; html_report_path="generation_report.html") 53 | 54 | cp("./netlify.toml", "./_site/netlify.toml")' 55 | env: 56 | JULIA_PKG_SERVER: "" 57 | 58 | 59 | - name: 📰 Upload site generation report 60 | uses: actions/upload-artifact@v4 61 | if: always() 62 | with: 63 | path: generation_report.html 64 | 65 | - name: 🔀 Combine semesters into single site 66 | run: | 67 | mkdir www 68 | mv Fall23-output/Fall20/ www/Fall20 69 | mv Fall23-output/Spring21/ www/Spring21 70 | mv Fall23-output/Fall22/ www/Fall22 71 | mv Fall23-output/Fall23/ www/Fall23 72 | mv _site www/Fall24 73 | mv extra_outputs/* www 74 | 75 | - name: 🚀 Deploy to GitHub Pages 76 | uses: JamesIves/github-pages-deploy-action@v4 77 | with: 78 | token: ${{ secrets.GITHUB_TOKEN }} 79 | branch: Fall24-output 80 | folder: www 81 | -------------------------------------------------------------------------------- /.github/workflows/KeepCacheFresh.yml: -------------------------------------------------------------------------------- 1 | name: Keep caches fresh 2 | on: 3 | schedule: 4 | - cron: "5 4 1/4 * *" # every 4 days 5 | concurrency: 6 | group: export 7 | cancel-in-progress: false 8 | 9 | jobs: 10 | build-and-deploy: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout Fall 24 source 14 | uses: actions/checkout@v4 15 | 16 | - name: ⏱ Cache notebook states 17 | uses: actions/cache@v4 18 | with: 19 | path: _cache 20 | key: ${{ runner.os }}-pluto_state_cache-v3-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }}-${{ github.run_id }} 21 | restore-keys: | 22 | ${{ runner.os }}-pluto_state_cache-v3-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }} 23 | 24 | - name: ⏱ Cache .julia 25 | uses: actions/cache@v4 26 | with: 27 | path: ~/.julia 28 | key: ${{ runner.os }}-dotjulia-v1-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }}-${{ github.run_id }} 29 | restore-keys: | 30 | ${{ runner.os }}-dotjulia-v1-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }} 31 | 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | 4 | reduced_phil.png 5 | notebooks/week9/testCSVwrite.csv 6 | 7 | _cache 8 | _site 9 | generation_report.html 10 | src/week9/testCSVwrite.csv 11 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. 3 | // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp 4 | 5 | // List of extensions which should be recommended for users of this workspace. 6 | "recommendations": [ 7 | "esbenp.prettier-vscode", 8 | "julialang.language-julia", 9 | ], 10 | // List of extensions recommended by VS Code that should not be recommended for users of this workspace. 11 | "unwantedRecommendations": [ 12 | 13 | ] 14 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "*.jlmd": "markdown", 4 | "*.jlhtml": "html", 5 | }, 6 | 7 | "prettier.printWidth": 160, 8 | "prettier.tabWidth": 4, 9 | "prettier.semi": false, 10 | "prettier.quoteProps": "consistent", 11 | "prettier.singleQuote": false, 12 | 13 | "editor.formatOnSave": false, 14 | "[javascript]": { 15 | "editor.defaultFormatter": "esbenp.prettier-vscode", 16 | "editor.formatOnSave": true 17 | }, 18 | "[css]": { 19 | "editor.defaultFormatter": "esbenp.prettier-vscode", 20 | "editor.formatOnSave": true 21 | } 22 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "PlutoPages: run development server", 8 | "type": "shell", 9 | "command": "julia develop.jl", 10 | "group": "build" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Hi there! 2 | 3 | # This Dockerfile does _not_ run the Pluto notebooks. You can _not_ use it to work on the homework exercises. Instead, take a look at our website to learn how to get started with Pluto: http://computationalthinking.mit.edu . If you want to run a Pluto Container (e.g. for homework) take a look here: https://github.com/JuliaPluto/docker-stacks 4 | 5 | # This is an internal Dockerfile for the Pluto "@bind server" for the course website. It runs all the sliders, buttons and camera inputs, so that you can interact with them directly on the website, without having to wait for binder or a local Pluto session. 6 | # Take a look at https://github.com/JuliaPluto/PlutoSliderServer.jl for more info. 7 | 8 | # -fonsi 9 | 10 | FROM julia:1.10.4 11 | 12 | # HTTP port 13 | EXPOSE 1234 14 | RUN apt-get update -y && apt-get upgrade -y 15 | # add a new user called "pluto" 16 | RUN useradd -ms /bin/bash pluto 17 | # set the current directory 18 | WORKDIR /home/pluto 19 | # run the rest of commands as pluto user 20 | USER pluto 21 | # copy the contents of the github repository into /home/pluto 22 | COPY --chown=pluto . ${HOME} 23 | 24 | 25 | # Initialize the julia project environment that will be used to run the bind server. 26 | RUN julia --project=${HOME}/pluto-deployment-environment -e "import Pkg; Pkg.instantiate(); Pkg.precompile()" 27 | 28 | # The "default command" for this docker thing. 29 | CMD ["julia", "--project=/home/pluto/pluto-deployment-environment", "-e", "import PlutoSliderServer; PlutoSliderServer.run_directory(\".\"; SliderServer_port=1234 , SliderServer_host=\"0.0.0.0\")"] -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The material in this repository is licensed as follows: 2 | 3 | - The **code** is under the [MIT license](https://opensource.org/licenses/MIT). 4 | 5 | - The **text** is under the [CC BY-SA 4.0 license](https://creativecommons.org/licenses/by-sa/4.0). 6 | 7 | 8 | Copyright Alan Edelman, David P. Sanders and Fons van der Plas, 2024 -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: julia --project="pluto-deployment-environment" -e "import PlutoSliderServer; PlutoSliderServer.run_directory(\".\"; port=$PORT , host=\"0.0.0.0\")" 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introduction to computational thinking for real-world problems 2 | 3 |
Go to course website :balloon:
4 | 5 | Welcome to **MIT 18.C25 aka 6.C25**, **Fall 2024** edition! 6 | _For older semesters, see: 7 | - Fall 2023: [source code](https://github.com/mitmath/18S191/tree/Fall23) and [website](https://computationalthinking.mit.edu/Fall24/semesters/) 8 | - Fall 2022: [source code](https://github.com/mitmath/18S191/tree/Fall22) and [website](https://computationalthinking.mit.edu/Fall24/semesters/) 9 | - Spring 2021: [source code](https://github.com/mitmath/18S191/tree/Fall24) and [website](https://computationalthinking.mit.edu/Fall24/semesters/) 10 | - Fall 2020: [source code](https://github.com/mitmath/18S191/tree/Fall20) and [website](https://computationalthinking.mit.edu/Fall24/semesters/) 11 | - Spring 2020: [website](https://computationalthinking.mit.edu/Fall24/semesters/) 12 | - Fall 2019: [source code](https://github.com/dpsanders/6.S083_fall_2019/tree/fall_2019) 13 | 14 | This is an introductory course on Computational Thinking. We use the [Julia programming language](http://www.julialang.org) to approach real-world problems in varied areas applying data analysis and computational and mathematical modeling. In this class you will learn computer science, software, algorithms, applications, and mathematics as an integrated whole. 15 | 16 | Topics include: 17 | 18 | - Image analysis 19 | - Machine Learning 20 | - Network theory 21 | - Climate modeling 22 | 23 | # Go to [computationalthinking.mit.edu](https://computationalthinking.mit.edu/) to learn more! 24 | -------------------------------------------------------------------------------- /Website maintenance.md: -------------------------------------------------------------------------------- 1 | # Website maintenance 2 | 3 | This document describes how the website works. 4 | 5 | # Overview 6 | 7 | This is the source code for the computational thinking website! It uses a site generation system inspired by [https://www.11ty.dev/](https://www.11ty.dev/), but there are only three template systems: 8 | - **`.jlhtml` files** are rendered by [HypertextLiteral.jl](https://github.com/JuliaPluto/HypertextLiteral.jl) 9 | - **`.jlmd` files** are rendered by [MarkdownLiteral.jl](https://github.com/JuliaPluto/MarkdownLiteral.jl) 10 | - **`.jl` files** are rendered by [PlutoSliderServer.jl](https://github.com/JuliaPluto/PlutoSliderServer.jl) 11 | 12 | The `/src/` folder is scanned for files, and all files are turned into HTML pages. 13 | 14 | Paths correspond to URLs. For example, `src/data_science/pca.jl` will become available at `https://computationalthinking.mit.edu/data_science/pca/`. For files called *"index"*, the URL will point to its parent, e.g. `src/docs/index.jlmd` becomes `https://computationalthinking.mit.edu/docs/`. Remember that changing URLs is very bad! You can't share this site with your friends if the links break. 15 | 16 | > **To add something to our website, just create a new file!** Fons will be happy to figure out the technical bits. 17 | 18 | You can generate & preview the website locally (more on this later), and we have a github action generating the website when we push to the `Fall23` branch. The result (in the `Fall23-output` branch) is deployed with GitHub Pages. 19 | 20 | # Content 21 | 22 | ## Literal templates 23 | We use *Julia* as our templating system! Because we use HypertextLiteral and MarkdownLiteral, you can write regular Markdown files and HTML files, but you can also include `$(interpolation)` to spice up your documents! For example: 24 | 25 | ```markdown 26 | # Hey there! 27 | 28 | This is some *text*. Here is a very big number: $(1 + 1). 29 | ``` 30 | 31 | Besides small inline values, you can also write big code blocks, with `$(begin ... end)`, and you can output HTML. Take a look at some of our files to learn more! 32 | 33 | ## Pluto notebooks 34 | 35 | Pluto notebooks will be rendered to HTML and included in the page. What you see is what you get! 36 | 37 | On a separate system, we are running a PlutoSliderServer that is synchronized to the `Fall23` brach. This makes our notebooks interactive! 38 | 39 | Notebook outputs are **cached** (for a long time) by the file hash. This means that a notebook file will only ever run once, which makes it much faster to work on the website. If you need to re-run your notebook, add a space somewhere in the code :) 40 | 41 | ## `.css`, `.html`, `.gif`, etc 42 | 43 | Web assets go through the system unchanged. 44 | 45 | # Front matter 46 | 47 | Like many SSG systems, we use [*front matter*](https://www.11ty.dev/docs/data-frontmatter/) to add metadata to pages. In `.jlmd` files, this is done with a front matter block, e.g.: 48 | ```markdown 49 | --- 50 | title: "🌼 How to install" 51 | description: "Instructions to install Pluto.jl" 52 | tags: ["docs", "introduction"] 53 | layout: "md.jlmd" 54 | --- 55 | 56 | # Let's install Pluto 57 | 58 | here is how you do it 59 | ``` 60 | 61 | Every page **should probably** include: 62 | - *`title`*: Will be used in the sidebar, on Google, in the window header, and on social media. 63 | - *`description`*: Will be used on hover, on Google, and on social media. 64 | - *`tags`*: List of *tags* that are used to create collections out of pages. Our sidebar uses collections to know which pages to list. (more details in `sidebar data.jl`) 65 | - *`layout`*: The name of a layout file in `src/_includes`. For basic Markdown or HTML, you probably want `md.jlmd`. For Pluto, you should use `layout.jlhtml`. 66 | 67 | ## How to write front matter 68 | For `.jlmd` files, see the example above. 69 | 70 | For `.jl` notebooks, use the [Frontmatter GUI](https://github.com/fonsp/Pluto.jl/pull/2104) built into Pluto. 71 | 72 | For `.jlhtml`, we still need to figure something out 😄. 73 | 74 | # Running locally 75 | 76 | ## Developing *content, styles, etc.* 77 | 78 | Open this repository in VS Code, and install the recommended extensions. 79 | 80 | To start running the development server, open the VS Code *command palette* (press `Cmd+Shift+P`), and search for **`Tasks: Run Task`**, then **`PlutoPages: run development server`**. The first run can take some time, as it builds up the notebook outputs cache. Leave it running. 81 | 82 | This will start two things in parallel: the PlutoPages.jl development server (which generates the static website), and a static file server (with LiveServer.jl). It will open two tabs in your browser: one is the generation dashboard (PlutoPages.jl), the other is the current site preview (LiveServer.jl). 83 | 84 | Whenever you edit a file, PlutoPages will automatically regenerate! Refresh your browser tab. If it does not pick up the change, go to the generation dashboard and click the "Read input files again" button. 85 | 86 | This workflow is recommended for writing static content, styles, and for site maintenance. But for writing Pluto notebooks, it's best to prepare the notebook first, and then run the site (because it re-runs the entire notebook on any change). 87 | -------------------------------------------------------------------------------- /develop.jl: -------------------------------------------------------------------------------- 1 | cd(@__DIR__) 2 | 3 | @assert VERSION >= v"1.6.0" 4 | 5 | import Pkg 6 | Pkg.activate("./pluto-deployment-environment") 7 | Pkg.instantiate() 8 | import PlutoPages 9 | 10 | PlutoPages.develop(@__DIR__) 11 | -------------------------------------------------------------------------------- /extra_outputs/CNAME: -------------------------------------------------------------------------------- 1 | computationalthinking.mit.edu -------------------------------------------------------------------------------- /extra_outputs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [[headers]] 2 | for = "/*" 3 | [headers.values] 4 | Access-Control-Allow-Origin = "*" 5 | -------------------------------------------------------------------------------- /pluto-deployment-environment/PlutoDeployment.toml: -------------------------------------------------------------------------------- 1 | [Export] 2 | baked_state = false 3 | baked_notebookfile = false 4 | offer_binder = true 5 | slider_server_url="https://computationalthinking-sliderserver-droplet.plutojl.org" 6 | ignore_cache = [ 7 | "index.jl", 8 | ] 9 | create_index = false 10 | exclude = [ 11 | # these are in the repo but not used on the website 12 | "*/linear_transformation.jl", 13 | "*/OLD_linear_transformation.jl", 14 | "*/simulating_component_failure_live.jl", 15 | "*/discrete_and_continuous_old.jl", 16 | "*/pascal.jl", 17 | "*/snowballearth_original.jl", 18 | "tools/*", 19 | "PlutoPages.jl", 20 | ] 21 | 22 | [SliderServer] 23 | port = 8080 24 | host = "0.0.0.0" 25 | exclude=[ 26 | # these are in the repo but not used on the website 27 | "*/linear_transformation.jl", 28 | "*/OLD_linear_transformation.jl", 29 | "*/simulating_component_failure_live.jl", 30 | "*/discrete_and_continuous_old.jl", 31 | "*/pascal.jl", 32 | "*/snowballearth_original.jl", 33 | "tools/*", 34 | "PlutoPages.jl", 35 | 36 | # not interactive 37 | "*/basic_syntax.jl", 38 | "*/structure.jl", 39 | "*/how_to_collaborate_on_software.jl", 40 | 41 | # don't run homeworks 42 | "*/hw*.jl", 43 | ] 44 | -------------------------------------------------------------------------------- /pluto-deployment-environment/Project.toml: -------------------------------------------------------------------------------- 1 | [deps] 2 | BetterFileWatching = "c9fd44ac-77b5-486c-9482-9798bd063cc6" 3 | CommonMark = "a80b9123-70ca-4bc0-993e-6e3bcb318db6" 4 | Deno_jll = "04572ae6-984a-583e-9378-9577a1c2574d" 5 | Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" 6 | HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 7 | JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 8 | LRUCache = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" 9 | Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" 10 | MarkdownLiteral = "736d6165-7244-6769-4267-6b50796e6954" 11 | Memoize = "c03570c3-d221-55d1-a50c-7939bbd78826" 12 | Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 13 | Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" 14 | PlutoHooks = "0ff47ea0-7a50-410d-8455-4348d5de0774" 15 | PlutoLinks = "0ff47ea0-7a50-410d-8455-4348d5de0420" 16 | PlutoPages = "d5dc3dd1-4774-47c7-8860-0a1ad9e34b8c" 17 | PlutoSliderServer = "2fc8631c-6f24-4c5b-bca7-cbb509c42db4" 18 | PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 19 | ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" 20 | ThreadsX = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d" 21 | URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" 22 | Unicode = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 23 | YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" 24 | -------------------------------------------------------------------------------- /src/_includes/layout.jlhtml: -------------------------------------------------------------------------------- 1 | $(begin 2 | import Pluto 3 | "The contents of `` from a Pluto HTML export." 4 | const pluto_head = let 5 | default = Pluto.generate_html(; 6 | pluto_cdn_root=Pluto.PLUTO_VERSION < v"0.19" ? "https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@9ca70c36/frontend/" : nothing) 7 | m = match(r"Section $(f("chapter", "-")).$(f("section", "-"))
166 |