Update docs include syntax for source examples #1150

Description

@tiangolo

Privileged issue

  • I'm @tiangolo or he asked me directly to create an issue here.

Issue Content

This is a good first contribution. 🤓

The code examples shown in the docs are actual Python files. They are even tested in CI, that's why you can always copy paste an example and it will always work, the example is tested.

The way those examples are included in the docs used a specific format. But now there's a new format available that is much simpler and easier to use than the previous one, in particular in complex cases, for example when there are examples in multiple versions of Python.

But not all the docs have the new format yet. The docs should use the new format to include examples. That is the task. 🤓

It should be done as one PR per page updated.

Simple Example

Before, the format was like:

```Python hl_lines="1 4"
{!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
```

Now the new format looks like:

{* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
  • Instead of {! and !} it uses {* and *}
  • It no longer has a line above with:
```Python
  • And it no longer has a line below with:
```
  • The highlight is no longer a line with e.g. hl_lines="3" (to highlight line 3), but instead in the same line there's a hl[3].

Multiple Python Versions

In many cases there are variants of the same example for multiple versions of Python, or for using Annotated or not.

In those cases, the current include examples have syntax for tabs, and notes saying Annotated should be preferred. For example:

//// tab | Python 3.10+
```Python hl_lines="1 4"
{!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
```
////
//// tab | Python 3.7+
```Python hl_lines="3 6"
{!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
```
////

In these cases, it should be updated to only include the first one (the others will be included automatically 😎 ):

{* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
  • The syntax for tabs is also removed, all the other variants are included automatically.
  • The highlight lines are included for that same first file, the fragment with hl_lines="1 4" is replaced with hl[1,4]

Highlight Lines

Simple Lines

When there's a fragment like:

hl_lines="4 8 12"

That means it is highlighting the lines 4, 8, and 12.

The new syntax is on the same include line:

hl[4,8,12]
  • It separates individual lines by commas.
  • It uses hl, with square brackets around.

Line Ranges

When there are line ranges, like:

hl_lines="4-6"

That means it is highlighting lines from 4 to 6 (so, 4, 5, and 6).

The new syntax uses : instead of - for the ranges:

hl[4:6]

Multiple Highlights

There are some highlights that include individual lines and also line ranges, for example the old syntax was:

hl_lines="2 4-6 8-11 13"

That means it is highlighting:

  • Line 2
  • Lines from 4 to 6 (so, 4, 5, and 6)
  • Lines from 8 to 11 (so, 8, 9, 10, and 11)
  • Line 13

The new syntax separates by commas instead of spaces:

hl[2,4:6,8:11,13]

Include Specific Lines

In some cases, there are specific lines included instead of the entire file.

For example, the old syntax was:

```Python hl_lines="1 4"
{!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
# More code here later 👇```

In this example, the lines included are from line 1 to line 8 (lines 1, 2, 3, 4, 5, 6, 7, 8). In the old syntax, it's defined with the fragment:

[ln:1-8]

In the new syntax, the included code from above would be:

{* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
  • The lines to include that were defined with the fragment [ln:1-8], are now defined with ln[1:8]

The new syntax ln as in ln[1:8] also supports multiple lines and ranges to include.

Comments Between Line Ranges

In the old syntax, when there are ranges of code included, there are comments like:

# Code below omitted 👇

The new syntax generates those comments automatically based on the line ranges.

Real Example

A more real example of the include with the old syntax looked like this:

//// tab | Python 3.10+
```Python hl_lines="1 4"
{!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
# More code here later 👇```
////
//// tab | Python 3.7+
```Python hl_lines="3 6"
{!./docs_src/tutorial/create_db_and_table/tutorial001.py[ln:1-10]!}
# More code here later 👇```
////
/// details | 👀 Full file preview
//// tab | Python 3.10+
```Python
{!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
```
////
//// tab | Python 3.7+
```Python
{!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
```
////
///

In the new syntax, that is replaced with this:

{* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
  • The only file that needs to be included and defined is the first one, and the lines to include and highlight are also for the first file only.
  • All the other file includes, full file preview, comments, etc. are generated automatically.

An example PR: #1149

Line Ranges and Highlights

In the old syntax, the hl_lines="15" refers to highlighting the resulting lines.

For example, with the old syntax:

```Python hl_lines="15"
# Code above omitted 👆
{!./docs_src/advanced/uuid/tutorial001_py310.py[ln:37-54]!}
# Code below omitted 👇```

The result is rendered something like:

# Code above omitted 👆defselect_hero():
withSession(engine) assession:
hero_2=Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
session.add(hero_2)
session.commit()
session.refresh(hero_2)
hero_id=hero_2.idprint("Created hero:")
print(hero_2)
print("Created hero ID:")
print(hero_id)
statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTEDselected_hero=session.exec(statement).one()
print("Selected hero:")
print(selected_hero)
print("Selected hero ID:")
print(selected_hero.id)
# Code below omitted 👇

And the highlight would be on the line with the comment # THIS LINE IS HIGHLIGHTED.

If you count the lines in that snippet, the first line has:

# Code above omitted 👆

And the line 15 in that snippet has:

statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTED

Not the entire source file was included, only lines 37 to 54. And that highlighted line inside of the source file is actually line 49. But the hl_lines="15" refers to the line 15 in the rendered snippet of code.

So, with the old syntax, when you want to highlight lines, you have to include the file and see the rendered result, count lines in the rendered document, and then mark the lines to highlight based on that result, wait for the reload to check if the line is correct, etc. ...it's a very slow process.

But with the new syntax, the number that you use is the line in the actual source file, so, if the line to highlight in the source file is line 49, that's what you define in the include:

{* ./docs_src/advanced/uuid/tutorial001_py310.py ln[37:54] hl[49]*}

This way it's easier to declare the lines or line ranges to include and the lines to highlight by just checking the source file. All the comments in between ranges and complex math will be done automatically.

Help

Do you want to help? Please do!

Remember it should be done as one PR per page updated.

If you see a page that doesn't fit these cases, leave it as is, I'll take care of it later.

Before submitting a PR, check if there's another one already handling that file.

Please name the PR including the file path, for example:

📝 Update includes for `docs/tutorial/create-db-and-table.md`

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      Update docs include syntax for source examples #1150

      Description

      @tiangolo

      Privileged issue

      • I'm @tiangolo or he asked me directly to create an issue here.

      Issue Content

      This is a good first contribution. 🤓

      The code examples shown in the docs are actual Python files. They are even tested in CI, that's why you can always copy paste an example and it will always work, the example is tested.

      The way those examples are included in the docs used a specific format. But now there's a new format available that is much simpler and easier to use than the previous one, in particular in complex cases, for example when there are examples in multiple versions of Python.

      But not all the docs have the new format yet. The docs should use the new format to include examples. That is the task. 🤓

      It should be done as one PR per page updated.

      Simple Example

      Before, the format was like:

      ```Python hl_lines="1 4"
      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
      ```

      Now the new format looks like:

      {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
      • Instead of {! and !} it uses {* and *}
      • It no longer has a line above with:
      ```Python
      • And it no longer has a line below with:
      ```
      • The highlight is no longer a line with e.g. hl_lines="3" (to highlight line 3), but instead in the same line there's a hl[3].

      Multiple Python Versions

      In many cases there are variants of the same example for multiple versions of Python, or for using Annotated or not.

      In those cases, the current include examples have syntax for tabs, and notes saying Annotated should be preferred. For example:

      //// tab | Python 3.10+
      ```Python hl_lines="1 4"
      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
      ```
      ////
      //// tab | Python 3.7+
      ```Python hl_lines="3 6"
      {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
      ```
      ////

      In these cases, it should be updated to only include the first one (the others will be included automatically 😎 ):

      {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
      • The syntax for tabs is also removed, all the other variants are included automatically.
      • The highlight lines are included for that same first file, the fragment with hl_lines="1 4" is replaced with hl[1,4]

      Highlight Lines

      Simple Lines

      When there's a fragment like:

      hl_lines="4 8 12"

      That means it is highlighting the lines 4, 8, and 12.

      The new syntax is on the same include line:

      hl[4,8,12]
      • It separates individual lines by commas.
      • It uses hl, with square brackets around.

      Line Ranges

      When there are line ranges, like:

      hl_lines="4-6"

      That means it is highlighting lines from 4 to 6 (so, 4, 5, and 6).

      The new syntax uses : instead of - for the ranges:

      hl[4:6]

      Multiple Highlights

      There are some highlights that include individual lines and also line ranges, for example the old syntax was:

      hl_lines="2 4-6 8-11 13"

      That means it is highlighting:

      • Line 2
      • Lines from 4 to 6 (so, 4, 5, and 6)
      • Lines from 8 to 11 (so, 8, 9, 10, and 11)
      • Line 13

      The new syntax separates by commas instead of spaces:

      hl[2,4:6,8:11,13]

      Include Specific Lines

      In some cases, there are specific lines included instead of the entire file.

      For example, the old syntax was:

      ```Python hl_lines="1 4"
      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
      # More code here later 👇```

      In this example, the lines included are from line 1 to line 8 (lines 1, 2, 3, 4, 5, 6, 7, 8). In the old syntax, it's defined with the fragment:

      [ln:1-8]

      In the new syntax, the included code from above would be:

      {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
      • The lines to include that were defined with the fragment [ln:1-8], are now defined with ln[1:8]

      The new syntax ln as in ln[1:8] also supports multiple lines and ranges to include.

      Comments Between Line Ranges

      In the old syntax, when there are ranges of code included, there are comments like:

      # Code below omitted 👇

      The new syntax generates those comments automatically based on the line ranges.

      Real Example

      A more real example of the include with the old syntax looked like this:

      //// tab | Python 3.10+
      ```Python hl_lines="1 4"
      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
      # More code here later 👇```
      ////
      //// tab | Python 3.7+
      ```Python hl_lines="3 6"
      {!./docs_src/tutorial/create_db_and_table/tutorial001.py[ln:1-10]!}
      # More code here later 👇```
      ////
      /// details | 👀 Full file preview
      //// tab | Python 3.10+
      ```Python
      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
      ```
      ////
      //// tab | Python 3.7+
      ```Python
      {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
      ```
      ////
      ///

      In the new syntax, that is replaced with this:

      {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
      • The only file that needs to be included and defined is the first one, and the lines to include and highlight are also for the first file only.
      • All the other file includes, full file preview, comments, etc. are generated automatically.

      An example PR: #1149

      Line Ranges and Highlights

      In the old syntax, the hl_lines="15" refers to highlighting the resulting lines.

      For example, with the old syntax:

      ```Python hl_lines="15"
      # Code above omitted 👆
      {!./docs_src/advanced/uuid/tutorial001_py310.py[ln:37-54]!}
      # Code below omitted 👇```

      The result is rendered something like:

      # Code above omitted 👆defselect_hero():
      withSession(engine) assession:
      hero_2=Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
      session.add(hero_2)
      session.commit()
      session.refresh(hero_2)
      hero_id=hero_2.idprint("Created hero:")
      print(hero_2)
      print("Created hero ID:")
      print(hero_id)
      statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTEDselected_hero=session.exec(statement).one()
      print("Selected hero:")
      print(selected_hero)
      print("Selected hero ID:")
      print(selected_hero.id)
      # Code below omitted 👇

      And the highlight would be on the line with the comment # THIS LINE IS HIGHLIGHTED.

      If you count the lines in that snippet, the first line has:

      # Code above omitted 👆

      And the line 15 in that snippet has:

      statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTED

      Not the entire source file was included, only lines 37 to 54. And that highlighted line inside of the source file is actually line 49. But the hl_lines="15" refers to the line 15 in the rendered snippet of code.

      So, with the old syntax, when you want to highlight lines, you have to include the file and see the rendered result, count lines in the rendered document, and then mark the lines to highlight based on that result, wait for the reload to check if the line is correct, etc. ...it's a very slow process.

      But with the new syntax, the number that you use is the line in the actual source file, so, if the line to highlight in the source file is line 49, that's what you define in the include:

      {* ./docs_src/advanced/uuid/tutorial001_py310.py ln[37:54] hl[49]*}

      This way it's easier to declare the lines or line ranges to include and the lines to highlight by just checking the source file. All the comments in between ranges and complex math will be done automatically.

      Help

      Do you want to help? Please do!

      Remember it should be done as one PR per page updated.

      If you see a page that doesn't fit these cases, leave it as is, I'll take care of it later.

      Before submitting a PR, check if there's another one already handling that file.

      Please name the PR including the file path, for example:

      📝 Update includes for `docs/tutorial/create-db-and-table.md`

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Update docs include syntax for source examples #1150

          Description

          @tiangolo

          Privileged issue

          • I'm @tiangolo or he asked me directly to create an issue here.

          Issue Content

          This is a good first contribution. 🤓

          The code examples shown in the docs are actual Python files. They are even tested in CI, that's why you can always copy paste an example and it will always work, the example is tested.

          The way those examples are included in the docs used a specific format. But now there's a new format available that is much simpler and easier to use than the previous one, in particular in complex cases, for example when there are examples in multiple versions of Python.

          But not all the docs have the new format yet. The docs should use the new format to include examples. That is the task. 🤓

          It should be done as one PR per page updated.

          Simple Example

          Before, the format was like:

          ```Python hl_lines="1 4"
          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
          ```

          Now the new format looks like:

          {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
          • Instead of {! and !} it uses {* and *}
          • It no longer has a line above with:
          ```Python
          • And it no longer has a line below with:
          ```
          • The highlight is no longer a line with e.g. hl_lines="3" (to highlight line 3), but instead in the same line there's a hl[3].

          Multiple Python Versions

          In many cases there are variants of the same example for multiple versions of Python, or for using Annotated or not.

          In those cases, the current include examples have syntax for tabs, and notes saying Annotated should be preferred. For example:

          //// tab | Python 3.10+
          ```Python hl_lines="1 4"
          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
          ```
          ////
          //// tab | Python 3.7+
          ```Python hl_lines="3 6"
          {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
          ```
          ////

          In these cases, it should be updated to only include the first one (the others will be included automatically 😎 ):

          {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
          • The syntax for tabs is also removed, all the other variants are included automatically.
          • The highlight lines are included for that same first file, the fragment with hl_lines="1 4" is replaced with hl[1,4]

          Highlight Lines

          Simple Lines

          When there's a fragment like:

          hl_lines="4 8 12"

          That means it is highlighting the lines 4, 8, and 12.

          The new syntax is on the same include line:

          hl[4,8,12]
          • It separates individual lines by commas.
          • It uses hl, with square brackets around.

          Line Ranges

          When there are line ranges, like:

          hl_lines="4-6"

          That means it is highlighting lines from 4 to 6 (so, 4, 5, and 6).

          The new syntax uses : instead of - for the ranges:

          hl[4:6]

          Multiple Highlights

          There are some highlights that include individual lines and also line ranges, for example the old syntax was:

          hl_lines="2 4-6 8-11 13"

          That means it is highlighting:

          • Line 2
          • Lines from 4 to 6 (so, 4, 5, and 6)
          • Lines from 8 to 11 (so, 8, 9, 10, and 11)
          • Line 13

          The new syntax separates by commas instead of spaces:

          hl[2,4:6,8:11,13]

          Include Specific Lines

          In some cases, there are specific lines included instead of the entire file.

          For example, the old syntax was:

          ```Python hl_lines="1 4"
          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
          # More code here later 👇```

          In this example, the lines included are from line 1 to line 8 (lines 1, 2, 3, 4, 5, 6, 7, 8). In the old syntax, it's defined with the fragment:

          [ln:1-8]

          In the new syntax, the included code from above would be:

          {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
          • The lines to include that were defined with the fragment [ln:1-8], are now defined with ln[1:8]

          The new syntax ln as in ln[1:8] also supports multiple lines and ranges to include.

          Comments Between Line Ranges

          In the old syntax, when there are ranges of code included, there are comments like:

          # Code below omitted 👇

          The new syntax generates those comments automatically based on the line ranges.

          Real Example

          A more real example of the include with the old syntax looked like this:

          //// tab | Python 3.10+
          ```Python hl_lines="1 4"
          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
          # More code here later 👇```
          ////
          //// tab | Python 3.7+
          ```Python hl_lines="3 6"
          {!./docs_src/tutorial/create_db_and_table/tutorial001.py[ln:1-10]!}
          # More code here later 👇```
          ////
          /// details | 👀 Full file preview
          //// tab | Python 3.10+
          ```Python
          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
          ```
          ////
          //// tab | Python 3.7+
          ```Python
          {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
          ```
          ////
          ///

          In the new syntax, that is replaced with this:

          {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
          • The only file that needs to be included and defined is the first one, and the lines to include and highlight are also for the first file only.
          • All the other file includes, full file preview, comments, etc. are generated automatically.

          An example PR: #1149

          Line Ranges and Highlights

          In the old syntax, the hl_lines="15" refers to highlighting the resulting lines.

          For example, with the old syntax:

          ```Python hl_lines="15"
          # Code above omitted 👆
          {!./docs_src/advanced/uuid/tutorial001_py310.py[ln:37-54]!}
          # Code below omitted 👇```

          The result is rendered something like:

          # Code above omitted 👆defselect_hero():
          withSession(engine) assession:
          hero_2=Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
          session.add(hero_2)
          session.commit()
          session.refresh(hero_2)
          hero_id=hero_2.idprint("Created hero:")
          print(hero_2)
          print("Created hero ID:")
          print(hero_id)
          statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTEDselected_hero=session.exec(statement).one()
          print("Selected hero:")
          print(selected_hero)
          print("Selected hero ID:")
          print(selected_hero.id)
          # Code below omitted 👇

          And the highlight would be on the line with the comment # THIS LINE IS HIGHLIGHTED.

          If you count the lines in that snippet, the first line has:

          # Code above omitted 👆

          And the line 15 in that snippet has:

          statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTED

          Not the entire source file was included, only lines 37 to 54. And that highlighted line inside of the source file is actually line 49. But the hl_lines="15" refers to the line 15 in the rendered snippet of code.

          So, with the old syntax, when you want to highlight lines, you have to include the file and see the rendered result, count lines in the rendered document, and then mark the lines to highlight based on that result, wait for the reload to check if the line is correct, etc. ...it's a very slow process.

          But with the new syntax, the number that you use is the line in the actual source file, so, if the line to highlight in the source file is line 49, that's what you define in the include:

          {* ./docs_src/advanced/uuid/tutorial001_py310.py ln[37:54] hl[49]*}

          This way it's easier to declare the lines or line ranges to include and the lines to highlight by just checking the source file. All the comments in between ranges and complex math will be done automatically.

          Help

          Do you want to help? Please do!

          Remember it should be done as one PR per page updated.

          If you see a page that doesn't fit these cases, leave it as is, I'll take care of it later.

          Before submitting a PR, check if there's another one already handling that file.

          Please name the PR including the file path, for example:

          📝 Update includes for `docs/tutorial/create-db-and-table.md`

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Update docs include syntax for source examples #1150

              Description

              @tiangolo

              Privileged issue

              • I'm @tiangolo or he asked me directly to create an issue here.

              Issue Content

              This is a good first contribution. 🤓

              The code examples shown in the docs are actual Python files. They are even tested in CI, that's why you can always copy paste an example and it will always work, the example is tested.

              The way those examples are included in the docs used a specific format. But now there's a new format available that is much simpler and easier to use than the previous one, in particular in complex cases, for example when there are examples in multiple versions of Python.

              But not all the docs have the new format yet. The docs should use the new format to include examples. That is the task. 🤓

              It should be done as one PR per page updated.

              Simple Example

              Before, the format was like:

              ```Python hl_lines="1 4"
              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
              ```

              Now the new format looks like:

              {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
              • Instead of {! and !} it uses {* and *}
              • It no longer has a line above with:
              ```Python
              • And it no longer has a line below with:
              ```
              • The highlight is no longer a line with e.g. hl_lines="3" (to highlight line 3), but instead in the same line there's a hl[3].

              Multiple Python Versions

              In many cases there are variants of the same example for multiple versions of Python, or for using Annotated or not.

              In those cases, the current include examples have syntax for tabs, and notes saying Annotated should be preferred. For example:

              //// tab | Python 3.10+
              ```Python hl_lines="1 4"
              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
              ```
              ////
              //// tab | Python 3.7+
              ```Python hl_lines="3 6"
              {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
              ```
              ////

              In these cases, it should be updated to only include the first one (the others will be included automatically 😎 ):

              {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
              • The syntax for tabs is also removed, all the other variants are included automatically.
              • The highlight lines are included for that same first file, the fragment with hl_lines="1 4" is replaced with hl[1,4]

              Highlight Lines

              Simple Lines

              When there's a fragment like:

              hl_lines="4 8 12"

              That means it is highlighting the lines 4, 8, and 12.

              The new syntax is on the same include line:

              hl[4,8,12]
              • It separates individual lines by commas.
              • It uses hl, with square brackets around.

              Line Ranges

              When there are line ranges, like:

              hl_lines="4-6"

              That means it is highlighting lines from 4 to 6 (so, 4, 5, and 6).

              The new syntax uses : instead of - for the ranges:

              hl[4:6]

              Multiple Highlights

              There are some highlights that include individual lines and also line ranges, for example the old syntax was:

              hl_lines="2 4-6 8-11 13"

              That means it is highlighting:

              • Line 2
              • Lines from 4 to 6 (so, 4, 5, and 6)
              • Lines from 8 to 11 (so, 8, 9, 10, and 11)
              • Line 13

              The new syntax separates by commas instead of spaces:

              hl[2,4:6,8:11,13]

              Include Specific Lines

              In some cases, there are specific lines included instead of the entire file.

              For example, the old syntax was:

              ```Python hl_lines="1 4"
              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
              # More code here later 👇```

              In this example, the lines included are from line 1 to line 8 (lines 1, 2, 3, 4, 5, 6, 7, 8). In the old syntax, it's defined with the fragment:

              [ln:1-8]

              In the new syntax, the included code from above would be:

              {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
              • The lines to include that were defined with the fragment [ln:1-8], are now defined with ln[1:8]

              The new syntax ln as in ln[1:8] also supports multiple lines and ranges to include.

              Comments Between Line Ranges

              In the old syntax, when there are ranges of code included, there are comments like:

              # Code below omitted 👇

              The new syntax generates those comments automatically based on the line ranges.

              Real Example

              A more real example of the include with the old syntax looked like this:

              //// tab | Python 3.10+
              ```Python hl_lines="1 4"
              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
              # More code here later 👇```
              ////
              //// tab | Python 3.7+
              ```Python hl_lines="3 6"
              {!./docs_src/tutorial/create_db_and_table/tutorial001.py[ln:1-10]!}
              # More code here later 👇```
              ////
              /// details | 👀 Full file preview
              //// tab | Python 3.10+
              ```Python
              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
              ```
              ////
              //// tab | Python 3.7+
              ```Python
              {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
              ```
              ////
              ///

              In the new syntax, that is replaced with this:

              {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
              • The only file that needs to be included and defined is the first one, and the lines to include and highlight are also for the first file only.
              • All the other file includes, full file preview, comments, etc. are generated automatically.

              An example PR: #1149

              Line Ranges and Highlights

              In the old syntax, the hl_lines="15" refers to highlighting the resulting lines.

              For example, with the old syntax:

              ```Python hl_lines="15"
              # Code above omitted 👆
              {!./docs_src/advanced/uuid/tutorial001_py310.py[ln:37-54]!}
              # Code below omitted 👇```

              The result is rendered something like:

              # Code above omitted 👆defselect_hero():
              withSession(engine) assession:
              hero_2=Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
              session.add(hero_2)
              session.commit()
              session.refresh(hero_2)
              hero_id=hero_2.idprint("Created hero:")
              print(hero_2)
              print("Created hero ID:")
              print(hero_id)
              statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTEDselected_hero=session.exec(statement).one()
              print("Selected hero:")
              print(selected_hero)
              print("Selected hero ID:")
              print(selected_hero.id)
              # Code below omitted 👇

              And the highlight would be on the line with the comment # THIS LINE IS HIGHLIGHTED.

              If you count the lines in that snippet, the first line has:

              # Code above omitted 👆

              And the line 15 in that snippet has:

              statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTED

              Not the entire source file was included, only lines 37 to 54. And that highlighted line inside of the source file is actually line 49. But the hl_lines="15" refers to the line 15 in the rendered snippet of code.

              So, with the old syntax, when you want to highlight lines, you have to include the file and see the rendered result, count lines in the rendered document, and then mark the lines to highlight based on that result, wait for the reload to check if the line is correct, etc. ...it's a very slow process.

              But with the new syntax, the number that you use is the line in the actual source file, so, if the line to highlight in the source file is line 49, that's what you define in the include:

              {* ./docs_src/advanced/uuid/tutorial001_py310.py ln[37:54] hl[49]*}

              This way it's easier to declare the lines or line ranges to include and the lines to highlight by just checking the source file. All the comments in between ranges and complex math will be done automatically.

              Help

              Do you want to help? Please do!

              Remember it should be done as one PR per page updated.

              If you see a page that doesn't fit these cases, leave it as is, I'll take care of it later.

              Before submitting a PR, check if there's another one already handling that file.

              Please name the PR including the file path, for example:

              📝 Update includes for `docs/tutorial/create-db-and-table.md`

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Update docs include syntax for source examples #1150

                  Description

                  @tiangolo

                  Privileged issue

                  • I'm @tiangolo or he asked me directly to create an issue here.

                  Issue Content

                  This is a good first contribution. 🤓

                  The code examples shown in the docs are actual Python files. They are even tested in CI, that's why you can always copy paste an example and it will always work, the example is tested.

                  The way those examples are included in the docs used a specific format. But now there's a new format available that is much simpler and easier to use than the previous one, in particular in complex cases, for example when there are examples in multiple versions of Python.

                  But not all the docs have the new format yet. The docs should use the new format to include examples. That is the task. 🤓

                  It should be done as one PR per page updated.

                  Simple Example

                  Before, the format was like:

                  ```Python hl_lines="1 4"
                  {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                  ```

                  Now the new format looks like:

                  {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
                  • Instead of {! and !} it uses {* and *}
                  • It no longer has a line above with:
                  ```Python
                  • And it no longer has a line below with:
                  ```
                  • The highlight is no longer a line with e.g. hl_lines="3" (to highlight line 3), but instead in the same line there's a hl[3].

                  Multiple Python Versions

                  In many cases there are variants of the same example for multiple versions of Python, or for using Annotated or not.

                  In those cases, the current include examples have syntax for tabs, and notes saying Annotated should be preferred. For example:

                  //// tab | Python 3.10+
                  ```Python hl_lines="1 4"
                  {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                  ```
                  ////
                  //// tab | Python 3.7+
                  ```Python hl_lines="3 6"
                  {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
                  ```
                  ////

                  In these cases, it should be updated to only include the first one (the others will be included automatically 😎 ):

                  {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
                  • The syntax for tabs is also removed, all the other variants are included automatically.
                  • The highlight lines are included for that same first file, the fragment with hl_lines="1 4" is replaced with hl[1,4]

                  Highlight Lines

                  Simple Lines

                  When there's a fragment like:

                  hl_lines="4 8 12"

                  That means it is highlighting the lines 4, 8, and 12.

                  The new syntax is on the same include line:

                  hl[4,8,12]
                  • It separates individual lines by commas.
                  • It uses hl, with square brackets around.

                  Line Ranges

                  When there are line ranges, like:

                  hl_lines="4-6"

                  That means it is highlighting lines from 4 to 6 (so, 4, 5, and 6).

                  The new syntax uses : instead of - for the ranges:

                  hl[4:6]

                  Multiple Highlights

                  There are some highlights that include individual lines and also line ranges, for example the old syntax was:

                  hl_lines="2 4-6 8-11 13"

                  That means it is highlighting:

                  • Line 2
                  • Lines from 4 to 6 (so, 4, 5, and 6)
                  • Lines from 8 to 11 (so, 8, 9, 10, and 11)
                  • Line 13

                  The new syntax separates by commas instead of spaces:

                  hl[2,4:6,8:11,13]

                  Include Specific Lines

                  In some cases, there are specific lines included instead of the entire file.

                  For example, the old syntax was:

                  ```Python hl_lines="1 4"
                  {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
                  # More code here later 👇```

                  In this example, the lines included are from line 1 to line 8 (lines 1, 2, 3, 4, 5, 6, 7, 8). In the old syntax, it's defined with the fragment:

                  [ln:1-8]

                  In the new syntax, the included code from above would be:

                  {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
                  • The lines to include that were defined with the fragment [ln:1-8], are now defined with ln[1:8]

                  The new syntax ln as in ln[1:8] also supports multiple lines and ranges to include.

                  Comments Between Line Ranges

                  In the old syntax, when there are ranges of code included, there are comments like:

                  # Code below omitted 👇

                  The new syntax generates those comments automatically based on the line ranges.

                  Real Example

                  A more real example of the include with the old syntax looked like this:

                  //// tab | Python 3.10+
                  ```Python hl_lines="1 4"
                  {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
                  # More code here later 👇```
                  ////
                  //// tab | Python 3.7+
                  ```Python hl_lines="3 6"
                  {!./docs_src/tutorial/create_db_and_table/tutorial001.py[ln:1-10]!}
                  # More code here later 👇```
                  ////
                  /// details | 👀 Full file preview
                  //// tab | Python 3.10+
                  ```Python
                  {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                  ```
                  ////
                  //// tab | Python 3.7+
                  ```Python
                  {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
                  ```
                  ////
                  ///

                  In the new syntax, that is replaced with this:

                  {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
                  • The only file that needs to be included and defined is the first one, and the lines to include and highlight are also for the first file only.
                  • All the other file includes, full file preview, comments, etc. are generated automatically.

                  An example PR: #1149

                  Line Ranges and Highlights

                  In the old syntax, the hl_lines="15" refers to highlighting the resulting lines.

                  For example, with the old syntax:

                  ```Python hl_lines="15"
                  # Code above omitted 👆
                  {!./docs_src/advanced/uuid/tutorial001_py310.py[ln:37-54]!}
                  # Code below omitted 👇```

                  The result is rendered something like:

                  # Code above omitted 👆defselect_hero():
                  withSession(engine) assession:
                  hero_2=Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
                  session.add(hero_2)
                  session.commit()
                  session.refresh(hero_2)
                  hero_id=hero_2.idprint("Created hero:")
                  print(hero_2)
                  print("Created hero ID:")
                  print(hero_id)
                  statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTEDselected_hero=session.exec(statement).one()
                  print("Selected hero:")
                  print(selected_hero)
                  print("Selected hero ID:")
                  print(selected_hero.id)
                  # Code below omitted 👇

                  And the highlight would be on the line with the comment # THIS LINE IS HIGHLIGHTED.

                  If you count the lines in that snippet, the first line has:

                  # Code above omitted 👆

                  And the line 15 in that snippet has:

                  statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTED

                  Not the entire source file was included, only lines 37 to 54. And that highlighted line inside of the source file is actually line 49. But the hl_lines="15" refers to the line 15 in the rendered snippet of code.

                  So, with the old syntax, when you want to highlight lines, you have to include the file and see the rendered result, count lines in the rendered document, and then mark the lines to highlight based on that result, wait for the reload to check if the line is correct, etc. ...it's a very slow process.

                  But with the new syntax, the number that you use is the line in the actual source file, so, if the line to highlight in the source file is line 49, that's what you define in the include:

                  {* ./docs_src/advanced/uuid/tutorial001_py310.py ln[37:54] hl[49]*}

                  This way it's easier to declare the lines or line ranges to include and the lines to highlight by just checking the source file. All the comments in between ranges and complex math will be done automatically.

                  Help

                  Do you want to help? Please do!

                  Remember it should be done as one PR per page updated.

                  If you see a page that doesn't fit these cases, leave it as is, I'll take care of it later.

                  Before submitting a PR, check if there's another one already handling that file.

                  Please name the PR including the file path, for example:

                  📝 Update includes for `docs/tutorial/create-db-and-table.md`

                  Activity

                  Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Update docs include syntax for source examples #1150

                      Description

                      @tiangolo

                      Privileged issue

                      • I'm @tiangolo or he asked me directly to create an issue here.

                      Issue Content

                      This is a good first contribution. 🤓

                      The code examples shown in the docs are actual Python files. They are even tested in CI, that's why you can always copy paste an example and it will always work, the example is tested.

                      The way those examples are included in the docs used a specific format. But now there's a new format available that is much simpler and easier to use than the previous one, in particular in complex cases, for example when there are examples in multiple versions of Python.

                      But not all the docs have the new format yet. The docs should use the new format to include examples. That is the task. 🤓

                      It should be done as one PR per page updated.

                      Simple Example

                      Before, the format was like:

                      ```Python hl_lines="1 4"
                      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                      ```

                      Now the new format looks like:

                      {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
                      • Instead of {! and !} it uses {* and *}
                      • It no longer has a line above with:
                      ```Python
                      • And it no longer has a line below with:
                      ```
                      • The highlight is no longer a line with e.g. hl_lines="3" (to highlight line 3), but instead in the same line there's a hl[3].

                      Multiple Python Versions

                      In many cases there are variants of the same example for multiple versions of Python, or for using Annotated or not.

                      In those cases, the current include examples have syntax for tabs, and notes saying Annotated should be preferred. For example:

                      //// tab | Python 3.10+
                      ```Python hl_lines="1 4"
                      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                      ```
                      ////
                      //// tab | Python 3.7+
                      ```Python hl_lines="3 6"
                      {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
                      ```
                      ////

                      In these cases, it should be updated to only include the first one (the others will be included automatically 😎 ):

                      {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
                      • The syntax for tabs is also removed, all the other variants are included automatically.
                      • The highlight lines are included for that same first file, the fragment with hl_lines="1 4" is replaced with hl[1,4]

                      Highlight Lines

                      Simple Lines

                      When there's a fragment like:

                      hl_lines="4 8 12"

                      That means it is highlighting the lines 4, 8, and 12.

                      The new syntax is on the same include line:

                      hl[4,8,12]
                      • It separates individual lines by commas.
                      • It uses hl, with square brackets around.

                      Line Ranges

                      When there are line ranges, like:

                      hl_lines="4-6"

                      That means it is highlighting lines from 4 to 6 (so, 4, 5, and 6).

                      The new syntax uses : instead of - for the ranges:

                      hl[4:6]

                      Multiple Highlights

                      There are some highlights that include individual lines and also line ranges, for example the old syntax was:

                      hl_lines="2 4-6 8-11 13"

                      That means it is highlighting:

                      • Line 2
                      • Lines from 4 to 6 (so, 4, 5, and 6)
                      • Lines from 8 to 11 (so, 8, 9, 10, and 11)
                      • Line 13

                      The new syntax separates by commas instead of spaces:

                      hl[2,4:6,8:11,13]

                      Include Specific Lines

                      In some cases, there are specific lines included instead of the entire file.

                      For example, the old syntax was:

                      ```Python hl_lines="1 4"
                      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
                      # More code here later 👇```

                      In this example, the lines included are from line 1 to line 8 (lines 1, 2, 3, 4, 5, 6, 7, 8). In the old syntax, it's defined with the fragment:

                      [ln:1-8]

                      In the new syntax, the included code from above would be:

                      {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
                      • The lines to include that were defined with the fragment [ln:1-8], are now defined with ln[1:8]

                      The new syntax ln as in ln[1:8] also supports multiple lines and ranges to include.

                      Comments Between Line Ranges

                      In the old syntax, when there are ranges of code included, there are comments like:

                      # Code below omitted 👇

                      The new syntax generates those comments automatically based on the line ranges.

                      Real Example

                      A more real example of the include with the old syntax looked like this:

                      //// tab | Python 3.10+
                      ```Python hl_lines="1 4"
                      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
                      # More code here later 👇```
                      ////
                      //// tab | Python 3.7+
                      ```Python hl_lines="3 6"
                      {!./docs_src/tutorial/create_db_and_table/tutorial001.py[ln:1-10]!}
                      # More code here later 👇```
                      ////
                      /// details | 👀 Full file preview
                      //// tab | Python 3.10+
                      ```Python
                      {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                      ```
                      ////
                      //// tab | Python 3.7+
                      ```Python
                      {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
                      ```
                      ////
                      ///

                      In the new syntax, that is replaced with this:

                      {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
                      • The only file that needs to be included and defined is the first one, and the lines to include and highlight are also for the first file only.
                      • All the other file includes, full file preview, comments, etc. are generated automatically.

                      An example PR: #1149

                      Line Ranges and Highlights

                      In the old syntax, the hl_lines="15" refers to highlighting the resulting lines.

                      For example, with the old syntax:

                      ```Python hl_lines="15"
                      # Code above omitted 👆
                      {!./docs_src/advanced/uuid/tutorial001_py310.py[ln:37-54]!}
                      # Code below omitted 👇```

                      The result is rendered something like:

                      # Code above omitted 👆defselect_hero():
                      withSession(engine) assession:
                      hero_2=Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
                      session.add(hero_2)
                      session.commit()
                      session.refresh(hero_2)
                      hero_id=hero_2.idprint("Created hero:")
                      print(hero_2)
                      print("Created hero ID:")
                      print(hero_id)
                      statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTEDselected_hero=session.exec(statement).one()
                      print("Selected hero:")
                      print(selected_hero)
                      print("Selected hero ID:")
                      print(selected_hero.id)
                      # Code below omitted 👇

                      And the highlight would be on the line with the comment # THIS LINE IS HIGHLIGHTED.

                      If you count the lines in that snippet, the first line has:

                      # Code above omitted 👆

                      And the line 15 in that snippet has:

                      statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTED

                      Not the entire source file was included, only lines 37 to 54. And that highlighted line inside of the source file is actually line 49. But the hl_lines="15" refers to the line 15 in the rendered snippet of code.

                      So, with the old syntax, when you want to highlight lines, you have to include the file and see the rendered result, count lines in the rendered document, and then mark the lines to highlight based on that result, wait for the reload to check if the line is correct, etc. ...it's a very slow process.

                      But with the new syntax, the number that you use is the line in the actual source file, so, if the line to highlight in the source file is line 49, that's what you define in the include:

                      {* ./docs_src/advanced/uuid/tutorial001_py310.py ln[37:54] hl[49]*}

                      This way it's easier to declare the lines or line ranges to include and the lines to highlight by just checking the source file. All the comments in between ranges and complex math will be done automatically.

                      Help

                      Do you want to help? Please do!

                      Remember it should be done as one PR per page updated.

                      If you see a page that doesn't fit these cases, leave it as is, I'll take care of it later.

                      Before submitting a PR, check if there's another one already handling that file.

                      Please name the PR including the file path, for example:

                      📝 Update includes for `docs/tutorial/create-db-and-table.md`

                      Activity

                      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Update docs include syntax for source examples #1150

                          Description

                          @tiangolo

                          Privileged issue

                          • I'm @tiangolo or he asked me directly to create an issue here.

                          Issue Content

                          This is a good first contribution. 🤓

                          The code examples shown in the docs are actual Python files. They are even tested in CI, that's why you can always copy paste an example and it will always work, the example is tested.

                          The way those examples are included in the docs used a specific format. But now there's a new format available that is much simpler and easier to use than the previous one, in particular in complex cases, for example when there are examples in multiple versions of Python.

                          But not all the docs have the new format yet. The docs should use the new format to include examples. That is the task. 🤓

                          It should be done as one PR per page updated.

                          Simple Example

                          Before, the format was like:

                          ```Python hl_lines="1 4"
                          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                          ```

                          Now the new format looks like:

                          {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
                          • Instead of {! and !} it uses {* and *}
                          • It no longer has a line above with:
                          ```Python
                          • And it no longer has a line below with:
                          ```
                          • The highlight is no longer a line with e.g. hl_lines="3" (to highlight line 3), but instead in the same line there's a hl[3].

                          Multiple Python Versions

                          In many cases there are variants of the same example for multiple versions of Python, or for using Annotated or not.

                          In those cases, the current include examples have syntax for tabs, and notes saying Annotated should be preferred. For example:

                          //// tab | Python 3.10+
                          ```Python hl_lines="1 4"
                          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                          ```
                          ////
                          //// tab | Python 3.7+
                          ```Python hl_lines="3 6"
                          {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
                          ```
                          ////

                          In these cases, it should be updated to only include the first one (the others will be included automatically 😎 ):

                          {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
                          • The syntax for tabs is also removed, all the other variants are included automatically.
                          • The highlight lines are included for that same first file, the fragment with hl_lines="1 4" is replaced with hl[1,4]

                          Highlight Lines

                          Simple Lines

                          When there's a fragment like:

                          hl_lines="4 8 12"

                          That means it is highlighting the lines 4, 8, and 12.

                          The new syntax is on the same include line:

                          hl[4,8,12]
                          • It separates individual lines by commas.
                          • It uses hl, with square brackets around.

                          Line Ranges

                          When there are line ranges, like:

                          hl_lines="4-6"

                          That means it is highlighting lines from 4 to 6 (so, 4, 5, and 6).

                          The new syntax uses : instead of - for the ranges:

                          hl[4:6]

                          Multiple Highlights

                          There are some highlights that include individual lines and also line ranges, for example the old syntax was:

                          hl_lines="2 4-6 8-11 13"

                          That means it is highlighting:

                          • Line 2
                          • Lines from 4 to 6 (so, 4, 5, and 6)
                          • Lines from 8 to 11 (so, 8, 9, 10, and 11)
                          • Line 13

                          The new syntax separates by commas instead of spaces:

                          hl[2,4:6,8:11,13]

                          Include Specific Lines

                          In some cases, there are specific lines included instead of the entire file.

                          For example, the old syntax was:

                          ```Python hl_lines="1 4"
                          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
                          # More code here later 👇```

                          In this example, the lines included are from line 1 to line 8 (lines 1, 2, 3, 4, 5, 6, 7, 8). In the old syntax, it's defined with the fragment:

                          [ln:1-8]

                          In the new syntax, the included code from above would be:

                          {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
                          • The lines to include that were defined with the fragment [ln:1-8], are now defined with ln[1:8]

                          The new syntax ln as in ln[1:8] also supports multiple lines and ranges to include.

                          Comments Between Line Ranges

                          In the old syntax, when there are ranges of code included, there are comments like:

                          # Code below omitted 👇

                          The new syntax generates those comments automatically based on the line ranges.

                          Real Example

                          A more real example of the include with the old syntax looked like this:

                          //// tab | Python 3.10+
                          ```Python hl_lines="1 4"
                          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
                          # More code here later 👇```
                          ////
                          //// tab | Python 3.7+
                          ```Python hl_lines="3 6"
                          {!./docs_src/tutorial/create_db_and_table/tutorial001.py[ln:1-10]!}
                          # More code here later 👇```
                          ////
                          /// details | 👀 Full file preview
                          //// tab | Python 3.10+
                          ```Python
                          {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                          ```
                          ////
                          //// tab | Python 3.7+
                          ```Python
                          {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
                          ```
                          ////
                          ///

                          In the new syntax, that is replaced with this:

                          {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
                          • The only file that needs to be included and defined is the first one, and the lines to include and highlight are also for the first file only.
                          • All the other file includes, full file preview, comments, etc. are generated automatically.

                          An example PR: #1149

                          Line Ranges and Highlights

                          In the old syntax, the hl_lines="15" refers to highlighting the resulting lines.

                          For example, with the old syntax:

                          ```Python hl_lines="15"
                          # Code above omitted 👆
                          {!./docs_src/advanced/uuid/tutorial001_py310.py[ln:37-54]!}
                          # Code below omitted 👇```

                          The result is rendered something like:

                          # Code above omitted 👆defselect_hero():
                          withSession(engine) assession:
                          hero_2=Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
                          session.add(hero_2)
                          session.commit()
                          session.refresh(hero_2)
                          hero_id=hero_2.idprint("Created hero:")
                          print(hero_2)
                          print("Created hero ID:")
                          print(hero_id)
                          statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTEDselected_hero=session.exec(statement).one()
                          print("Selected hero:")
                          print(selected_hero)
                          print("Selected hero ID:")
                          print(selected_hero.id)
                          # Code below omitted 👇

                          And the highlight would be on the line with the comment # THIS LINE IS HIGHLIGHTED.

                          If you count the lines in that snippet, the first line has:

                          # Code above omitted 👆

                          And the line 15 in that snippet has:

                          statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTED

                          Not the entire source file was included, only lines 37 to 54. And that highlighted line inside of the source file is actually line 49. But the hl_lines="15" refers to the line 15 in the rendered snippet of code.

                          So, with the old syntax, when you want to highlight lines, you have to include the file and see the rendered result, count lines in the rendered document, and then mark the lines to highlight based on that result, wait for the reload to check if the line is correct, etc. ...it's a very slow process.

                          But with the new syntax, the number that you use is the line in the actual source file, so, if the line to highlight in the source file is line 49, that's what you define in the include:

                          {* ./docs_src/advanced/uuid/tutorial001_py310.py ln[37:54] hl[49]*}

                          This way it's easier to declare the lines or line ranges to include and the lines to highlight by just checking the source file. All the comments in between ranges and complex math will be done automatically.

                          Help

                          Do you want to help? Please do!

                          Remember it should be done as one PR per page updated.

                          If you see a page that doesn't fit these cases, leave it as is, I'll take care of it later.

                          Before submitting a PR, check if there's another one already handling that file.

                          Please name the PR including the file path, for example:

                          📝 Update includes for `docs/tutorial/create-db-and-table.md`

                          Activity

                          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Update docs include syntax for source examples #1150

                              Description

                              @tiangolo

                              Privileged issue

                              • I'm @tiangolo or he asked me directly to create an issue here.

                              Issue Content

                              This is a good first contribution. 🤓

                              The code examples shown in the docs are actual Python files. They are even tested in CI, that's why you can always copy paste an example and it will always work, the example is tested.

                              The way those examples are included in the docs used a specific format. But now there's a new format available that is much simpler and easier to use than the previous one, in particular in complex cases, for example when there are examples in multiple versions of Python.

                              But not all the docs have the new format yet. The docs should use the new format to include examples. That is the task. 🤓

                              It should be done as one PR per page updated.

                              Simple Example

                              Before, the format was like:

                              ```Python hl_lines="1 4"
                              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                              ```

                              Now the new format looks like:

                              {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
                              • Instead of {! and !} it uses {* and *}
                              • It no longer has a line above with:
                              ```Python
                              • And it no longer has a line below with:
                              ```
                              • The highlight is no longer a line with e.g. hl_lines="3" (to highlight line 3), but instead in the same line there's a hl[3].

                              Multiple Python Versions

                              In many cases there are variants of the same example for multiple versions of Python, or for using Annotated or not.

                              In those cases, the current include examples have syntax for tabs, and notes saying Annotated should be preferred. For example:

                              //// tab | Python 3.10+
                              ```Python hl_lines="1 4"
                              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                              ```
                              ////
                              //// tab | Python 3.7+
                              ```Python hl_lines="3 6"
                              {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
                              ```
                              ////

                              In these cases, it should be updated to only include the first one (the others will be included automatically 😎 ):

                              {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py hl[1,4]*}
                              • The syntax for tabs is also removed, all the other variants are included automatically.
                              • The highlight lines are included for that same first file, the fragment with hl_lines="1 4" is replaced with hl[1,4]

                              Highlight Lines

                              Simple Lines

                              When there's a fragment like:

                              hl_lines="4 8 12"

                              That means it is highlighting the lines 4, 8, and 12.

                              The new syntax is on the same include line:

                              hl[4,8,12]
                              • It separates individual lines by commas.
                              • It uses hl, with square brackets around.

                              Line Ranges

                              When there are line ranges, like:

                              hl_lines="4-6"

                              That means it is highlighting lines from 4 to 6 (so, 4, 5, and 6).

                              The new syntax uses : instead of - for the ranges:

                              hl[4:6]

                              Multiple Highlights

                              There are some highlights that include individual lines and also line ranges, for example the old syntax was:

                              hl_lines="2 4-6 8-11 13"

                              That means it is highlighting:

                              • Line 2
                              • Lines from 4 to 6 (so, 4, 5, and 6)
                              • Lines from 8 to 11 (so, 8, 9, 10, and 11)
                              • Line 13

                              The new syntax separates by commas instead of spaces:

                              hl[2,4:6,8:11,13]

                              Include Specific Lines

                              In some cases, there are specific lines included instead of the entire file.

                              For example, the old syntax was:

                              ```Python hl_lines="1 4"
                              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
                              # More code here later 👇```

                              In this example, the lines included are from line 1 to line 8 (lines 1, 2, 3, 4, 5, 6, 7, 8). In the old syntax, it's defined with the fragment:

                              [ln:1-8]

                              In the new syntax, the included code from above would be:

                              {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
                              • The lines to include that were defined with the fragment [ln:1-8], are now defined with ln[1:8]

                              The new syntax ln as in ln[1:8] also supports multiple lines and ranges to include.

                              Comments Between Line Ranges

                              In the old syntax, when there are ranges of code included, there are comments like:

                              # Code below omitted 👇

                              The new syntax generates those comments automatically based on the line ranges.

                              Real Example

                              A more real example of the include with the old syntax looked like this:

                              //// tab | Python 3.10+
                              ```Python hl_lines="1 4"
                              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py[ln:1-8]!}
                              # More code here later 👇```
                              ////
                              //// tab | Python 3.7+
                              ```Python hl_lines="3 6"
                              {!./docs_src/tutorial/create_db_and_table/tutorial001.py[ln:1-10]!}
                              # More code here later 👇```
                              ////
                              /// details | 👀 Full file preview
                              //// tab | Python 3.10+
                              ```Python
                              {!./docs_src/tutorial/create_db_and_table/tutorial001_py310.py!}
                              ```
                              ////
                              //// tab | Python 3.7+
                              ```Python
                              {!./docs_src/tutorial/create_db_and_table/tutorial001.py!}
                              ```
                              ////
                              ///

                              In the new syntax, that is replaced with this:

                              {* ./docs_src/tutorial/create_db_and_table/tutorial001_py310.py ln[1:8] hl[1,4]*}
                              • The only file that needs to be included and defined is the first one, and the lines to include and highlight are also for the first file only.
                              • All the other file includes, full file preview, comments, etc. are generated automatically.

                              An example PR: #1149

                              Line Ranges and Highlights

                              In the old syntax, the hl_lines="15" refers to highlighting the resulting lines.

                              For example, with the old syntax:

                              ```Python hl_lines="15"
                              # Code above omitted 👆
                              {!./docs_src/advanced/uuid/tutorial001_py310.py[ln:37-54]!}
                              # Code below omitted 👇```

                              The result is rendered something like:

                              # Code above omitted 👆defselect_hero():
                              withSession(engine) assession:
                              hero_2=Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
                              session.add(hero_2)
                              session.commit()
                              session.refresh(hero_2)
                              hero_id=hero_2.idprint("Created hero:")
                              print(hero_2)
                              print("Created hero ID:")
                              print(hero_id)
                              statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTEDselected_hero=session.exec(statement).one()
                              print("Selected hero:")
                              print(selected_hero)
                              print("Selected hero ID:")
                              print(selected_hero.id)
                              # Code below omitted 👇

                              And the highlight would be on the line with the comment # THIS LINE IS HIGHLIGHTED.

                              If you count the lines in that snippet, the first line has:

                              # Code above omitted 👆

                              And the line 15 in that snippet has:

                              statement=select(Hero).where(Hero.id==hero_id) # THIS LINE IS HIGHLIGHTED

                              Not the entire source file was included, only lines 37 to 54. And that highlighted line inside of the source file is actually line 49. But the hl_lines="15" refers to the line 15 in the rendered snippet of code.

                              So, with the old syntax, when you want to highlight lines, you have to include the file and see the rendered result, count lines in the rendered document, and then mark the lines to highlight based on that result, wait for the reload to check if the line is correct, etc. ...it's a very slow process.

                              But with the new syntax, the number that you use is the line in the actual source file, so, if the line to highlight in the source file is line 49, that's what you define in the include:

                              {* ./docs_src/advanced/uuid/tutorial001_py310.py ln[37:54] hl[49]*}

                              This way it's easier to declare the lines or line ranges to include and the lines to highlight by just checking the source file. All the comments in between ranges and complex math will be done automatically.

                              Help

                              Do you want to help? Please do!

                              Remember it should be done as one PR per page updated.

                              If you see a page that doesn't fit these cases, leave it as is, I'll take care of it later.

                              Before submitting a PR, check if there's another one already handling that file.

                              Please name the PR including the file path, for example:

                              📝 Update includes for `docs/tutorial/create-db-and-table.md`

                              Activity

                              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions