Skip to content

Commit 05965ae

Browse files
committed
Auto merge of #124577 - GuillaumeGomez:stabilize-custom_code_classes_in_docs, r=rustdoc
Stabilize `custom_code_classes_in_docs` feature Fixes #79483. This feature has been around for quite some time now, I think it's fine to stabilize it now. ## Summary ## What is the feature about? In short, this PR changes two things, both related to codeblocks in doc comments in Rust documentation: * Allow to disable generation of `language-*` CSS classes with the `custom` attribute. * Add your own CSS classes to a code block so that you can use other tools to highlight them. #### The `custom` attribute Let's start with the new `custom` attribute: it will disable the generation of the `language-*` CSS class on the generated HTML code block. For example: ```rust /// ```custom,c /// int main(void) { /// return 0; /// } /// ``` ``` The generated HTML code block will not have `class="language-c"` because the `custom` attribute has been set. The `custom` attribute becomes especially useful with the other thing added by this feature: adding your own CSS classes. #### Adding your own CSS classes The second part of this feature is to allow users to add CSS classes themselves so that they can then add a JS library which will do it (like `highlight.js` or `prism.js`), allowing to support highlighting for other languages than Rust without increasing burden on rustdoc. To disable the automatic `language-*` CSS class generation, you need to use the `custom` attribute as well. This allow users to write the following: ```rust /// Some code block with `{class=language-c}` as the language string. /// /// ```custom,{class=language-c} /// int main(void) { /// return 0; /// } /// ``` fn main() {} ``` This will notably produce the following HTML: ```html <pre class="language-c"> int main(void) { return 0; }</pre> ``` Instead of: ```html <pre class="rust rust-example-rendered"> <span class="ident">int</span> <span class="ident">main</span>(<span class="ident">void</span>) { <span class="kw">return</span> <span class="number">0</span>; } </pre> ``` To be noted, we could have written `{.language-c}` to achieve the same result. `.` and `class=` have the same effect. One last syntax point: content between parens (`(like this)`) is now considered as comment and is not taken into account at all. In addition to this, I added an `unknown` field into `LangString` (the parsed code block "attribute") because of cases like this: ```rust /// ```custom,class:language-c /// main; /// ``` pub fn foo() {} ``` Without this `unknown` field, it would generate in the DOM: `<pre class="language-class:language-c language-c">`, which is quite bad. So instead, it now stores all unknown tags into the `unknown` field and use the first one as "language". So in this case, since there is no unknown tag, it'll simply generate `<pre class="language-c">`. I added tests to cover this. EDIT(camelid): This description is out-of-date. Using `custom,class:language-c` will generate the output `<pre class="language-class:language-c">` as would be expected; it treats `class:language-c` as just the name of a language (similar to the langstring `c` or `js` or what have you) since it does not use the designed class syntax. Finally, I added a parser for the codeblock attributes to make it much easier to maintain. It'll be pretty easy to extend. As to why this syntax for adding attributes was picked: it's [Pandoc's syntax](https://pandoc.org/MANUAL.html#extension-fenced_code_attributes). Even if it seems clunkier in some cases, it's extensible, and most third-party Markdown renderers are smart enough to ignore Pandoc's brace-delimited attributes (from [this comment](#110800 (comment))). r? `@notriddle`
2 parents 466be51 + 2f6abd1 commit 05965ae

23 files changed

+67
-515
lines changed

compiler/rustc_feature/src/accepted.rs

+2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ declare_features! (
138138
(accepted, copy_closures, "1.26.0", Some(44490)),
139139
/// Allows `crate` in paths.
140140
(accepted, crate_in_paths, "1.30.0", Some(45477)),
141+
/// Allows users to provide classes for fenced code block using `class:classname`.
142+
(accepted, custom_code_classes_in_docs, "CURRENT_RUSTC_VERSION", Some(79483)),
141143
/// Allows using `#[debugger_visualizer]` attribute.
142144
(accepted, debugger_visualizer, "1.71.0", Some(95939)),
143145
/// Allows rustc to inject a default alloc_error_handler

compiler/rustc_feature/src/unstable.rs

-2
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,6 @@ declare_features! (
424424
/// Allows function attribute `#[coverage(on/off)]`, to control coverage
425425
/// instrumentation of that function.
426426
(unstable, coverage_attribute, "1.74.0", Some(84605)),
427-
/// Allows users to provide classes for fenced code block using `class:classname`.
428-
(unstable, custom_code_classes_in_docs, "1.74.0", Some(79483)),
429427
/// Allows non-builtin attributes in inner attribute position.
430428
(unstable, custom_inner_attributes, "1.30.0", Some(54726)),
431429
/// Allows custom test frameworks with `#![test_runner]` and `#[test_case]`.

src/doc/rustdoc/src/unstable-features.md

-44
Original file line numberDiff line numberDiff line change
@@ -624,47 +624,3 @@ add the `--scrape-tests` flag.
624624

625625
This flag enables the generation of links in the source code pages which allow the reader
626626
to jump to a type definition.
627-
628-
### Custom CSS classes for code blocks
629-
630-
```rust
631-
#![feature(custom_code_classes_in_docs)]
632-
633-
/// ```custom,{class=language-c}
634-
/// int main(void) { return 0; }
635-
/// ```
636-
pub struct Bar;
637-
```
638-
639-
The text `int main(void) { return 0; }` is rendered without highlighting in a code block
640-
with the class `language-c`. This can be used to highlight other languages through JavaScript
641-
libraries for example.
642-
643-
Without the `custom` attribute, it would be generated as a Rust code example with an additional
644-
`language-C` CSS class. Therefore, if you specifically don't want it to be a Rust code example,
645-
don't forget to add the `custom` attribute.
646-
647-
To be noted that you can replace `class=` with `.` to achieve the same result:
648-
649-
```rust
650-
#![feature(custom_code_classes_in_docs)]
651-
652-
/// ```custom,{.language-c}
653-
/// int main(void) { return 0; }
654-
/// ```
655-
pub struct Bar;
656-
```
657-
658-
To be noted, `rust` and `.rust`/`class=rust` have different effects: `rust` indicates that this is
659-
a Rust code block whereas the two others add a "rust" CSS class on the code block.
660-
661-
You can also use double quotes:
662-
663-
```rust
664-
#![feature(custom_code_classes_in_docs)]
665-
666-
/// ```"not rust" {."hello everyone"}
667-
/// int main(void) { return 0; }
668-
/// ```
669-
pub struct Bar;
670-
```

src/doc/rustdoc/src/write-documentation/documentation-tests.md

+38
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,44 @@ that the code sample should be compiled using the respective edition of Rust.
376376
# fn foo() {}
377377
```
378378

379+
### Custom CSS classes for code blocks
380+
381+
```rust
382+
/// ```custom,{class=language-c}
383+
/// int main(void) { return 0; }
384+
/// ```
385+
pub struct Bar;
386+
```
387+
388+
The text `int main(void) { return 0; }` is rendered without highlighting in a code block
389+
with the class `language-c`. This can be used to highlight other languages through JavaScript
390+
libraries for example.
391+
392+
Without the `custom` attribute, it would be generated as a Rust code example with an additional
393+
`language-C` CSS class. Therefore, if you specifically don't want it to be a Rust code example,
394+
don't forget to add the `custom` attribute.
395+
396+
To be noted that you can replace `class=` with `.` to achieve the same result:
397+
398+
```rust
399+
/// ```custom,{.language-c}
400+
/// int main(void) { return 0; }
401+
/// ```
402+
pub struct Bar;
403+
```
404+
405+
To be noted, `rust` and `.rust`/`class=rust` have different effects: `rust` indicates that this is
406+
a Rust code block whereas the two others add a "rust" CSS class on the code block.
407+
408+
You can also use double quotes:
409+
410+
```rust
411+
/// ```"not rust" {."hello everyone"}
412+
/// int main(void) { return 0; }
413+
/// ```
414+
pub struct Bar;
415+
```
416+
379417
## Syntax reference
380418

381419
The *exact* syntax for code blocks, including the edge cases, can be found

src/librustdoc/doctest.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1343,7 +1343,6 @@ impl<'a, 'hir, 'tcx> HirCollector<'a, 'hir, 'tcx> {
13431343
def_id.to_def_id(),
13441344
span_of_fragments(&attrs.doc_strings).unwrap_or(sp),
13451345
)),
1346-
self.tcx.features().custom_code_classes_in_docs,
13471346
);
13481347
}
13491348

src/librustdoc/externalfiles.rs

-4
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ impl ExternalHtml {
4646
edition,
4747
playground,
4848
heading_offset: HeadingOffset::H2,
49-
// For external files, it'll be disabled until the feature is enabled by default.
50-
custom_code_classes_in_docs: false,
5149
}
5250
.into_string()
5351
);
@@ -63,8 +61,6 @@ impl ExternalHtml {
6361
edition,
6462
playground,
6563
heading_offset: HeadingOffset::H2,
66-
// For external files, it'll be disabled until the feature is enabled by default.
67-
custom_code_classes_in_docs: false,
6864
}
6965
.into_string()
7066
);

0 commit comments

Comments
 (0)