Skip to content

htmldocck.py: replace outdated doc comment with link to updated docs #131974

Description

@lolbinarycat

the documentation is at

r"""
htmldocck.py is a custom checker script for Rustdoc HTML outputs.
# How and why?
The principle is simple: This script receives a path to generated HTML
documentation and a "template" script, which has a series of check
commands like `@has` or `@matches`. Each command is used to check if
some pattern is present or not present in the particular file or in
a particular node of the HTML tree. In many cases, the template script
happens to be the source code given to rustdoc.
While it indeed is possible to test in smaller portions, it has been
hard to construct tests in this fashion and major rendering errors were
discovered much later. This script is designed to make black-box and
regression testing of Rustdoc easy. This does not preclude the needs for
unit testing, but can be used to complement related tests by quickly
showing the expected renderings.
In order to avoid one-off dependencies for this task, this script uses
a reasonably working HTML parser and the existing XPath implementation
from Python's standard library. Hopefully, we won't render
non-well-formed HTML.
# Commands
Commands start with an `@` followed by a command name (letters and
hyphens), and zero or more arguments separated by one or more whitespace
characters and optionally delimited with single or double quotes. The `@`
mark cannot be preceded by a non-whitespace character. Other lines
(including every text up to the first `@`) are ignored, but it is
recommended to avoid the use of `@` in the template file.
There are a number of supported commands:
* `@has PATH` checks for the existence of the given file.
`PATH` is relative to the output directory. It can be given as `-`
which repeats the most recently used `PATH`.
* `@hasraw PATH PATTERN` and `@matchesraw PATH PATTERN` checks
for the occurrence of the given pattern `PATTERN` in the specified file.
Only one occurrence of the pattern is enough.
For `@hasraw`, `PATTERN` is a whitespace-normalized (every consecutive
whitespace being replaced by one single space character) string.
The entire file is also whitespace-normalized including newlines.
For `@matchesraw`, `PATTERN` is a Python-supported regular expression.
The file remains intact but the regexp is matched without the `MULTILINE`
and `IGNORECASE` options. You can still use a prefix `(?m)` or `(?i)`
to override them, and `\A` and `\Z` for definitely matching
the beginning and end of the file.
(The same distinction goes to other variants of these commands.)
* `@has PATH XPATH PATTERN` and `@matches PATH XPATH PATTERN` checks for
the presence of the given XPath `XPATH` in the specified HTML file,
and also the occurrence of the given pattern `PATTERN` in the matching
node or attribute. Only one occurrence of the pattern in the match
is enough.
`PATH` should be a valid and well-formed HTML file. It does *not*
accept arbitrary HTML5; it should have matching open and close tags
and correct entity references at least.
`XPATH` is an XPath expression to match. The XPath is fairly limited:
`tag`, `*`, `.`, `//`, `..`, `[@attr]`, `[@attr='value']`, `[tag]`,
`[POS]` (element located in given `POS`), `[last()-POS]`, `text()`
and `@attr` (both as the last segment) are supported. Some examples:
- `//pre` or `.//pre` matches any element with a name `pre`.
- `//a[@href]` matches any element with an `href` attribute.
- `//*[@class="impl"]//code` matches any element with a name `code`,
which is an ancestor of some element which `class` attr is `impl`.
- `//h1[@class="fqn"]/span[1]/a[last()]/@class` matches a value of
`class` attribute in the last `a` element (can be followed by more
elements that are not `a`) inside the first `span` in the `h1` with
a class of `fqn`. Note that there cannot be any additional elements
between them due to the use of `/` instead of `//`.
Do not try to use non-absolute paths, it won't work due to the flawed
ElementTree implementation. The script rejects them.
For the text matches (i.e. paths not ending with `@attr`), any
subelements are flattened into one string; this is handy for ignoring
highlights for example. If you want to simply check for the presence of
a given node or attribute, use an empty string (`""`) as a `PATTERN`.
* `@count PATH XPATH COUNT` checks for the occurrence of the given XPath
in the specified file. The number of occurrences must match the given
count.
* `@count PATH XPATH TEXT COUNT` checks for the occurrence of the given XPath
with the given text in the specified file. The number of occurrences must
match the given count.
* `@snapshot NAME PATH XPATH` creates a snapshot test named NAME.
A snapshot test captures a subtree of the DOM, at the location
determined by the XPath, and compares it to a pre-recorded value
in a file. The file's name is the test's name with the `.rs` extension
replaced with `.NAME.html`, where NAME is the snapshot's name.
htmldocck supports the `--bless` option to accept the current subtree
as expected, saving it to the file determined by the snapshot's name.
compiletest's `--bless` flag is forwarded to htmldocck.
* `@has-dir PATH` checks for the existence of the given directory.
* `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
`[ENTRIES]`.
All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
checks if the given file does not exist, for example.
"""

it has several issues:

  • it is hard to find, not linked to from rustc-dev-guide
  • it has not be updated to reflect the fact the syntax has changed from // @foo to //@ foo.
  • says "only absolute paths are supported", but then requires xpaths to start with //, not /.

Metadata

Metadata

Assignees

Labels

A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsC-bugCategory: This is a bug.C-enhancementCategory: An issue proposing an enhancement or a PR with one.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

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)) { // Add copy buttons to all
     blocks
    (function() {
    function addCopyButtons() {
    document.querySelectorAll('pre code').forEach(function(codeBlock) {
    if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
    codeBlock.parentElement.setAttribute('data-copy-added', 'true');
    var btn = document.createElement('button');
    btn.textContent = 'Copy';
    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;';
    btn.onmouseover = function() { this.style.opacity = '1'; };
    btn.onmouseout = function() { this.style.opacity = '0.7'; };
    btn.onclick = function() {
    navigator.clipboard.writeText(codeBlock.textContent).then(function() {
    btn.textContent = 'Copied!';
    setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
    });
    };
    codeBlock.parentElement.style.position = 'relative';
    codeBlock.parentElement.appendChild(btn);
    });
    }
    addCopyButtons();
    // Re-run on dynamic content
    var observer = new MutationObserver(addCopyButtons);
    observer.observe(document.body, { childList: true, subtree: true });
    })();
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    htmldocck.py: replace outdated doc comment with link to updated docs · Issue #131974 · rust-lang/rust · GitHub
    Skip to content

    htmldocck.py: replace outdated doc comment with link to updated docs #131974

    Description

    @lolbinarycat

    the documentation is at

    r"""
    htmldocck.py is a custom checker script for Rustdoc HTML outputs.
    # How and why?
    The principle is simple: This script receives a path to generated HTML
    documentation and a "template" script, which has a series of check
    commands like `@has` or `@matches`. Each command is used to check if
    some pattern is present or not present in the particular file or in
    a particular node of the HTML tree. In many cases, the template script
    happens to be the source code given to rustdoc.
    While it indeed is possible to test in smaller portions, it has been
    hard to construct tests in this fashion and major rendering errors were
    discovered much later. This script is designed to make black-box and
    regression testing of Rustdoc easy. This does not preclude the needs for
    unit testing, but can be used to complement related tests by quickly
    showing the expected renderings.
    In order to avoid one-off dependencies for this task, this script uses
    a reasonably working HTML parser and the existing XPath implementation
    from Python's standard library. Hopefully, we won't render
    non-well-formed HTML.
    # Commands
    Commands start with an `@` followed by a command name (letters and
    hyphens), and zero or more arguments separated by one or more whitespace
    characters and optionally delimited with single or double quotes. The `@`
    mark cannot be preceded by a non-whitespace character. Other lines
    (including every text up to the first `@`) are ignored, but it is
    recommended to avoid the use of `@` in the template file.
    There are a number of supported commands:
    * `@has PATH` checks for the existence of the given file.
    `PATH` is relative to the output directory. It can be given as `-`
    which repeats the most recently used `PATH`.
    * `@hasraw PATH PATTERN` and `@matchesraw PATH PATTERN` checks
    for the occurrence of the given pattern `PATTERN` in the specified file.
    Only one occurrence of the pattern is enough.
    For `@hasraw`, `PATTERN` is a whitespace-normalized (every consecutive
    whitespace being replaced by one single space character) string.
    The entire file is also whitespace-normalized including newlines.
    For `@matchesraw`, `PATTERN` is a Python-supported regular expression.
    The file remains intact but the regexp is matched without the `MULTILINE`
    and `IGNORECASE` options. You can still use a prefix `(?m)` or `(?i)`
    to override them, and `\A` and `\Z` for definitely matching
    the beginning and end of the file.
    (The same distinction goes to other variants of these commands.)
    * `@has PATH XPATH PATTERN` and `@matches PATH XPATH PATTERN` checks for
    the presence of the given XPath `XPATH` in the specified HTML file,
    and also the occurrence of the given pattern `PATTERN` in the matching
    node or attribute. Only one occurrence of the pattern in the match
    is enough.
    `PATH` should be a valid and well-formed HTML file. It does *not*
    accept arbitrary HTML5; it should have matching open and close tags
    and correct entity references at least.
    `XPATH` is an XPath expression to match. The XPath is fairly limited:
    `tag`, `*`, `.`, `//`, `..`, `[@attr]`, `[@attr='value']`, `[tag]`,
    `[POS]` (element located in given `POS`), `[last()-POS]`, `text()`
    and `@attr` (both as the last segment) are supported. Some examples:
    - `//pre` or `.//pre` matches any element with a name `pre`.
    - `//a[@href]` matches any element with an `href` attribute.
    - `//*[@class="impl"]//code` matches any element with a name `code`,
    which is an ancestor of some element which `class` attr is `impl`.
    - `//h1[@class="fqn"]/span[1]/a[last()]/@class` matches a value of
    `class` attribute in the last `a` element (can be followed by more
    elements that are not `a`) inside the first `span` in the `h1` with
    a class of `fqn`. Note that there cannot be any additional elements
    between them due to the use of `/` instead of `//`.
    Do not try to use non-absolute paths, it won't work due to the flawed
    ElementTree implementation. The script rejects them.
    For the text matches (i.e. paths not ending with `@attr`), any
    subelements are flattened into one string; this is handy for ignoring
    highlights for example. If you want to simply check for the presence of
    a given node or attribute, use an empty string (`""`) as a `PATTERN`.
    * `@count PATH XPATH COUNT` checks for the occurrence of the given XPath
    in the specified file. The number of occurrences must match the given
    count.
    * `@count PATH XPATH TEXT COUNT` checks for the occurrence of the given XPath
    with the given text in the specified file. The number of occurrences must
    match the given count.
    * `@snapshot NAME PATH XPATH` creates a snapshot test named NAME.
    A snapshot test captures a subtree of the DOM, at the location
    determined by the XPath, and compares it to a pre-recorded value
    in a file. The file's name is the test's name with the `.rs` extension
    replaced with `.NAME.html`, where NAME is the snapshot's name.
    htmldocck supports the `--bless` option to accept the current subtree
    as expected, saving it to the file determined by the snapshot's name.
    compiletest's `--bless` flag is forwarded to htmldocck.
    * `@has-dir PATH` checks for the existence of the given directory.
    * `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
    `[ENTRIES]`.
    All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
    checks if the given file does not exist, for example.
    """

    it has several issues:

    • it is hard to find, not linked to from rustc-dev-guide
    • it has not be updated to reflect the fact the syntax has changed from // @foo to //@ foo.
    • says "only absolute paths are supported", but then requires xpaths to start with //, not /.

    Metadata

    Metadata

    Assignees

    Labels

    A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsC-bugCategory: This is a bug.C-enhancementCategory: An issue proposing an enhancement or a PR with one.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

    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)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' htmldocck.py: replace outdated doc comment with link to updated docs · Issue #131974 · rust-lang/rust · GitHub
      Skip to content

      htmldocck.py: replace outdated doc comment with link to updated docs #131974

      Description

      @lolbinarycat

      the documentation is at

      r"""
      htmldocck.py is a custom checker script for Rustdoc HTML outputs.
      # How and why?
      The principle is simple: This script receives a path to generated HTML
      documentation and a "template" script, which has a series of check
      commands like `@has` or `@matches`. Each command is used to check if
      some pattern is present or not present in the particular file or in
      a particular node of the HTML tree. In many cases, the template script
      happens to be the source code given to rustdoc.
      While it indeed is possible to test in smaller portions, it has been
      hard to construct tests in this fashion and major rendering errors were
      discovered much later. This script is designed to make black-box and
      regression testing of Rustdoc easy. This does not preclude the needs for
      unit testing, but can be used to complement related tests by quickly
      showing the expected renderings.
      In order to avoid one-off dependencies for this task, this script uses
      a reasonably working HTML parser and the existing XPath implementation
      from Python's standard library. Hopefully, we won't render
      non-well-formed HTML.
      # Commands
      Commands start with an `@` followed by a command name (letters and
      hyphens), and zero or more arguments separated by one or more whitespace
      characters and optionally delimited with single or double quotes. The `@`
      mark cannot be preceded by a non-whitespace character. Other lines
      (including every text up to the first `@`) are ignored, but it is
      recommended to avoid the use of `@` in the template file.
      There are a number of supported commands:
      * `@has PATH` checks for the existence of the given file.
      `PATH` is relative to the output directory. It can be given as `-`
      which repeats the most recently used `PATH`.
      * `@hasraw PATH PATTERN` and `@matchesraw PATH PATTERN` checks
      for the occurrence of the given pattern `PATTERN` in the specified file.
      Only one occurrence of the pattern is enough.
      For `@hasraw`, `PATTERN` is a whitespace-normalized (every consecutive
      whitespace being replaced by one single space character) string.
      The entire file is also whitespace-normalized including newlines.
      For `@matchesraw`, `PATTERN` is a Python-supported regular expression.
      The file remains intact but the regexp is matched without the `MULTILINE`
      and `IGNORECASE` options. You can still use a prefix `(?m)` or `(?i)`
      to override them, and `\A` and `\Z` for definitely matching
      the beginning and end of the file.
      (The same distinction goes to other variants of these commands.)
      * `@has PATH XPATH PATTERN` and `@matches PATH XPATH PATTERN` checks for
      the presence of the given XPath `XPATH` in the specified HTML file,
      and also the occurrence of the given pattern `PATTERN` in the matching
      node or attribute. Only one occurrence of the pattern in the match
      is enough.
      `PATH` should be a valid and well-formed HTML file. It does *not*
      accept arbitrary HTML5; it should have matching open and close tags
      and correct entity references at least.
      `XPATH` is an XPath expression to match. The XPath is fairly limited:
      `tag`, `*`, `.`, `//`, `..`, `[@attr]`, `[@attr='value']`, `[tag]`,
      `[POS]` (element located in given `POS`), `[last()-POS]`, `text()`
      and `@attr` (both as the last segment) are supported. Some examples:
      - `//pre` or `.//pre` matches any element with a name `pre`.
      - `//a[@href]` matches any element with an `href` attribute.
      - `//*[@class="impl"]//code` matches any element with a name `code`,
      which is an ancestor of some element which `class` attr is `impl`.
      - `//h1[@class="fqn"]/span[1]/a[last()]/@class` matches a value of
      `class` attribute in the last `a` element (can be followed by more
      elements that are not `a`) inside the first `span` in the `h1` with
      a class of `fqn`. Note that there cannot be any additional elements
      between them due to the use of `/` instead of `//`.
      Do not try to use non-absolute paths, it won't work due to the flawed
      ElementTree implementation. The script rejects them.
      For the text matches (i.e. paths not ending with `@attr`), any
      subelements are flattened into one string; this is handy for ignoring
      highlights for example. If you want to simply check for the presence of
      a given node or attribute, use an empty string (`""`) as a `PATTERN`.
      * `@count PATH XPATH COUNT` checks for the occurrence of the given XPath
      in the specified file. The number of occurrences must match the given
      count.
      * `@count PATH XPATH TEXT COUNT` checks for the occurrence of the given XPath
      with the given text in the specified file. The number of occurrences must
      match the given count.
      * `@snapshot NAME PATH XPATH` creates a snapshot test named NAME.
      A snapshot test captures a subtree of the DOM, at the location
      determined by the XPath, and compares it to a pre-recorded value
      in a file. The file's name is the test's name with the `.rs` extension
      replaced with `.NAME.html`, where NAME is the snapshot's name.
      htmldocck supports the `--bless` option to accept the current subtree
      as expected, saving it to the file determined by the snapshot's name.
      compiletest's `--bless` flag is forwarded to htmldocck.
      * `@has-dir PATH` checks for the existence of the given directory.
      * `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
      `[ENTRIES]`.
      All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
      checks if the given file does not exist, for example.
      """

      it has several issues:

      • it is hard to find, not linked to from rustc-dev-guide
      • it has not be updated to reflect the fact the syntax has changed from // @foo to //@ foo.
      • says "only absolute paths are supported", but then requires xpaths to start with //, not /.

      Metadata

      Metadata

      Assignees

      Labels

      A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsC-bugCategory: This is a bug.C-enhancementCategory: An issue proposing an enhancement or a PR with one.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

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

        htmldocck.py: replace outdated doc comment with link to updated docs #131974

        Description

        @lolbinarycat

        the documentation is at

        r"""
        htmldocck.py is a custom checker script for Rustdoc HTML outputs.
        # How and why?
        The principle is simple: This script receives a path to generated HTML
        documentation and a "template" script, which has a series of check
        commands like `@has` or `@matches`. Each command is used to check if
        some pattern is present or not present in the particular file or in
        a particular node of the HTML tree. In many cases, the template script
        happens to be the source code given to rustdoc.
        While it indeed is possible to test in smaller portions, it has been
        hard to construct tests in this fashion and major rendering errors were
        discovered much later. This script is designed to make black-box and
        regression testing of Rustdoc easy. This does not preclude the needs for
        unit testing, but can be used to complement related tests by quickly
        showing the expected renderings.
        In order to avoid one-off dependencies for this task, this script uses
        a reasonably working HTML parser and the existing XPath implementation
        from Python's standard library. Hopefully, we won't render
        non-well-formed HTML.
        # Commands
        Commands start with an `@` followed by a command name (letters and
        hyphens), and zero or more arguments separated by one or more whitespace
        characters and optionally delimited with single or double quotes. The `@`
        mark cannot be preceded by a non-whitespace character. Other lines
        (including every text up to the first `@`) are ignored, but it is
        recommended to avoid the use of `@` in the template file.
        There are a number of supported commands:
        * `@has PATH` checks for the existence of the given file.
        `PATH` is relative to the output directory. It can be given as `-`
        which repeats the most recently used `PATH`.
        * `@hasraw PATH PATTERN` and `@matchesraw PATH PATTERN` checks
        for the occurrence of the given pattern `PATTERN` in the specified file.
        Only one occurrence of the pattern is enough.
        For `@hasraw`, `PATTERN` is a whitespace-normalized (every consecutive
        whitespace being replaced by one single space character) string.
        The entire file is also whitespace-normalized including newlines.
        For `@matchesraw`, `PATTERN` is a Python-supported regular expression.
        The file remains intact but the regexp is matched without the `MULTILINE`
        and `IGNORECASE` options. You can still use a prefix `(?m)` or `(?i)`
        to override them, and `\A` and `\Z` for definitely matching
        the beginning and end of the file.
        (The same distinction goes to other variants of these commands.)
        * `@has PATH XPATH PATTERN` and `@matches PATH XPATH PATTERN` checks for
        the presence of the given XPath `XPATH` in the specified HTML file,
        and also the occurrence of the given pattern `PATTERN` in the matching
        node or attribute. Only one occurrence of the pattern in the match
        is enough.
        `PATH` should be a valid and well-formed HTML file. It does *not*
        accept arbitrary HTML5; it should have matching open and close tags
        and correct entity references at least.
        `XPATH` is an XPath expression to match. The XPath is fairly limited:
        `tag`, `*`, `.`, `//`, `..`, `[@attr]`, `[@attr='value']`, `[tag]`,
        `[POS]` (element located in given `POS`), `[last()-POS]`, `text()`
        and `@attr` (both as the last segment) are supported. Some examples:
        - `//pre` or `.//pre` matches any element with a name `pre`.
        - `//a[@href]` matches any element with an `href` attribute.
        - `//*[@class="impl"]//code` matches any element with a name `code`,
        which is an ancestor of some element which `class` attr is `impl`.
        - `//h1[@class="fqn"]/span[1]/a[last()]/@class` matches a value of
        `class` attribute in the last `a` element (can be followed by more
        elements that are not `a`) inside the first `span` in the `h1` with
        a class of `fqn`. Note that there cannot be any additional elements
        between them due to the use of `/` instead of `//`.
        Do not try to use non-absolute paths, it won't work due to the flawed
        ElementTree implementation. The script rejects them.
        For the text matches (i.e. paths not ending with `@attr`), any
        subelements are flattened into one string; this is handy for ignoring
        highlights for example. If you want to simply check for the presence of
        a given node or attribute, use an empty string (`""`) as a `PATTERN`.
        * `@count PATH XPATH COUNT` checks for the occurrence of the given XPath
        in the specified file. The number of occurrences must match the given
        count.
        * `@count PATH XPATH TEXT COUNT` checks for the occurrence of the given XPath
        with the given text in the specified file. The number of occurrences must
        match the given count.
        * `@snapshot NAME PATH XPATH` creates a snapshot test named NAME.
        A snapshot test captures a subtree of the DOM, at the location
        determined by the XPath, and compares it to a pre-recorded value
        in a file. The file's name is the test's name with the `.rs` extension
        replaced with `.NAME.html`, where NAME is the snapshot's name.
        htmldocck supports the `--bless` option to accept the current subtree
        as expected, saving it to the file determined by the snapshot's name.
        compiletest's `--bless` flag is forwarded to htmldocck.
        * `@has-dir PATH` checks for the existence of the given directory.
        * `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
        `[ENTRIES]`.
        All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
        checks if the given file does not exist, for example.
        """

        it has several issues:

        • it is hard to find, not linked to from rustc-dev-guide
        • it has not be updated to reflect the fact the syntax has changed from // @foo to //@ foo.
        • says "only absolute paths are supported", but then requires xpaths to start with //, not /.

        Metadata

        Metadata

        Assignees

        Labels

        A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsC-bugCategory: This is a bug.C-enhancementCategory: An issue proposing an enhancement or a PR with one.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

        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)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' htmldocck.py: replace outdated doc comment with link to updated docs · Issue #131974 · rust-lang/rust · GitHub
          Skip to content

          htmldocck.py: replace outdated doc comment with link to updated docs #131974

          Description

          @lolbinarycat

          the documentation is at

          r"""
          htmldocck.py is a custom checker script for Rustdoc HTML outputs.
          # How and why?
          The principle is simple: This script receives a path to generated HTML
          documentation and a "template" script, which has a series of check
          commands like `@has` or `@matches`. Each command is used to check if
          some pattern is present or not present in the particular file or in
          a particular node of the HTML tree. In many cases, the template script
          happens to be the source code given to rustdoc.
          While it indeed is possible to test in smaller portions, it has been
          hard to construct tests in this fashion and major rendering errors were
          discovered much later. This script is designed to make black-box and
          regression testing of Rustdoc easy. This does not preclude the needs for
          unit testing, but can be used to complement related tests by quickly
          showing the expected renderings.
          In order to avoid one-off dependencies for this task, this script uses
          a reasonably working HTML parser and the existing XPath implementation
          from Python's standard library. Hopefully, we won't render
          non-well-formed HTML.
          # Commands
          Commands start with an `@` followed by a command name (letters and
          hyphens), and zero or more arguments separated by one or more whitespace
          characters and optionally delimited with single or double quotes. The `@`
          mark cannot be preceded by a non-whitespace character. Other lines
          (including every text up to the first `@`) are ignored, but it is
          recommended to avoid the use of `@` in the template file.
          There are a number of supported commands:
          * `@has PATH` checks for the existence of the given file.
          `PATH` is relative to the output directory. It can be given as `-`
          which repeats the most recently used `PATH`.
          * `@hasraw PATH PATTERN` and `@matchesraw PATH PATTERN` checks
          for the occurrence of the given pattern `PATTERN` in the specified file.
          Only one occurrence of the pattern is enough.
          For `@hasraw`, `PATTERN` is a whitespace-normalized (every consecutive
          whitespace being replaced by one single space character) string.
          The entire file is also whitespace-normalized including newlines.
          For `@matchesraw`, `PATTERN` is a Python-supported regular expression.
          The file remains intact but the regexp is matched without the `MULTILINE`
          and `IGNORECASE` options. You can still use a prefix `(?m)` or `(?i)`
          to override them, and `\A` and `\Z` for definitely matching
          the beginning and end of the file.
          (The same distinction goes to other variants of these commands.)
          * `@has PATH XPATH PATTERN` and `@matches PATH XPATH PATTERN` checks for
          the presence of the given XPath `XPATH` in the specified HTML file,
          and also the occurrence of the given pattern `PATTERN` in the matching
          node or attribute. Only one occurrence of the pattern in the match
          is enough.
          `PATH` should be a valid and well-formed HTML file. It does *not*
          accept arbitrary HTML5; it should have matching open and close tags
          and correct entity references at least.
          `XPATH` is an XPath expression to match. The XPath is fairly limited:
          `tag`, `*`, `.`, `//`, `..`, `[@attr]`, `[@attr='value']`, `[tag]`,
          `[POS]` (element located in given `POS`), `[last()-POS]`, `text()`
          and `@attr` (both as the last segment) are supported. Some examples:
          - `//pre` or `.//pre` matches any element with a name `pre`.
          - `//a[@href]` matches any element with an `href` attribute.
          - `//*[@class="impl"]//code` matches any element with a name `code`,
          which is an ancestor of some element which `class` attr is `impl`.
          - `//h1[@class="fqn"]/span[1]/a[last()]/@class` matches a value of
          `class` attribute in the last `a` element (can be followed by more
          elements that are not `a`) inside the first `span` in the `h1` with
          a class of `fqn`. Note that there cannot be any additional elements
          between them due to the use of `/` instead of `//`.
          Do not try to use non-absolute paths, it won't work due to the flawed
          ElementTree implementation. The script rejects them.
          For the text matches (i.e. paths not ending with `@attr`), any
          subelements are flattened into one string; this is handy for ignoring
          highlights for example. If you want to simply check for the presence of
          a given node or attribute, use an empty string (`""`) as a `PATTERN`.
          * `@count PATH XPATH COUNT` checks for the occurrence of the given XPath
          in the specified file. The number of occurrences must match the given
          count.
          * `@count PATH XPATH TEXT COUNT` checks for the occurrence of the given XPath
          with the given text in the specified file. The number of occurrences must
          match the given count.
          * `@snapshot NAME PATH XPATH` creates a snapshot test named NAME.
          A snapshot test captures a subtree of the DOM, at the location
          determined by the XPath, and compares it to a pre-recorded value
          in a file. The file's name is the test's name with the `.rs` extension
          replaced with `.NAME.html`, where NAME is the snapshot's name.
          htmldocck supports the `--bless` option to accept the current subtree
          as expected, saving it to the file determined by the snapshot's name.
          compiletest's `--bless` flag is forwarded to htmldocck.
          * `@has-dir PATH` checks for the existence of the given directory.
          * `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
          `[ENTRIES]`.
          All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
          checks if the given file does not exist, for example.
          """

          it has several issues:

          • it is hard to find, not linked to from rustc-dev-guide
          • it has not be updated to reflect the fact the syntax has changed from // @foo to //@ foo.
          • says "only absolute paths are supported", but then requires xpaths to start with //, not /.

          Metadata

          Metadata

          Assignees

          Labels

          A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsC-bugCategory: This is a bug.C-enhancementCategory: An issue proposing an enhancement or a PR with one.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

          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)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' htmldocck.py: replace outdated doc comment with link to updated docs · Issue #131974 · rust-lang/rust · GitHub
            Skip to content

            htmldocck.py: replace outdated doc comment with link to updated docs #131974

            Description

            @lolbinarycat

            the documentation is at

            r"""
            htmldocck.py is a custom checker script for Rustdoc HTML outputs.
            # How and why?
            The principle is simple: This script receives a path to generated HTML
            documentation and a "template" script, which has a series of check
            commands like `@has` or `@matches`. Each command is used to check if
            some pattern is present or not present in the particular file or in
            a particular node of the HTML tree. In many cases, the template script
            happens to be the source code given to rustdoc.
            While it indeed is possible to test in smaller portions, it has been
            hard to construct tests in this fashion and major rendering errors were
            discovered much later. This script is designed to make black-box and
            regression testing of Rustdoc easy. This does not preclude the needs for
            unit testing, but can be used to complement related tests by quickly
            showing the expected renderings.
            In order to avoid one-off dependencies for this task, this script uses
            a reasonably working HTML parser and the existing XPath implementation
            from Python's standard library. Hopefully, we won't render
            non-well-formed HTML.
            # Commands
            Commands start with an `@` followed by a command name (letters and
            hyphens), and zero or more arguments separated by one or more whitespace
            characters and optionally delimited with single or double quotes. The `@`
            mark cannot be preceded by a non-whitespace character. Other lines
            (including every text up to the first `@`) are ignored, but it is
            recommended to avoid the use of `@` in the template file.
            There are a number of supported commands:
            * `@has PATH` checks for the existence of the given file.
            `PATH` is relative to the output directory. It can be given as `-`
            which repeats the most recently used `PATH`.
            * `@hasraw PATH PATTERN` and `@matchesraw PATH PATTERN` checks
            for the occurrence of the given pattern `PATTERN` in the specified file.
            Only one occurrence of the pattern is enough.
            For `@hasraw`, `PATTERN` is a whitespace-normalized (every consecutive
            whitespace being replaced by one single space character) string.
            The entire file is also whitespace-normalized including newlines.
            For `@matchesraw`, `PATTERN` is a Python-supported regular expression.
            The file remains intact but the regexp is matched without the `MULTILINE`
            and `IGNORECASE` options. You can still use a prefix `(?m)` or `(?i)`
            to override them, and `\A` and `\Z` for definitely matching
            the beginning and end of the file.
            (The same distinction goes to other variants of these commands.)
            * `@has PATH XPATH PATTERN` and `@matches PATH XPATH PATTERN` checks for
            the presence of the given XPath `XPATH` in the specified HTML file,
            and also the occurrence of the given pattern `PATTERN` in the matching
            node or attribute. Only one occurrence of the pattern in the match
            is enough.
            `PATH` should be a valid and well-formed HTML file. It does *not*
            accept arbitrary HTML5; it should have matching open and close tags
            and correct entity references at least.
            `XPATH` is an XPath expression to match. The XPath is fairly limited:
            `tag`, `*`, `.`, `//`, `..`, `[@attr]`, `[@attr='value']`, `[tag]`,
            `[POS]` (element located in given `POS`), `[last()-POS]`, `text()`
            and `@attr` (both as the last segment) are supported. Some examples:
            - `//pre` or `.//pre` matches any element with a name `pre`.
            - `//a[@href]` matches any element with an `href` attribute.
            - `//*[@class="impl"]//code` matches any element with a name `code`,
            which is an ancestor of some element which `class` attr is `impl`.
            - `//h1[@class="fqn"]/span[1]/a[last()]/@class` matches a value of
            `class` attribute in the last `a` element (can be followed by more
            elements that are not `a`) inside the first `span` in the `h1` with
            a class of `fqn`. Note that there cannot be any additional elements
            between them due to the use of `/` instead of `//`.
            Do not try to use non-absolute paths, it won't work due to the flawed
            ElementTree implementation. The script rejects them.
            For the text matches (i.e. paths not ending with `@attr`), any
            subelements are flattened into one string; this is handy for ignoring
            highlights for example. If you want to simply check for the presence of
            a given node or attribute, use an empty string (`""`) as a `PATTERN`.
            * `@count PATH XPATH COUNT` checks for the occurrence of the given XPath
            in the specified file. The number of occurrences must match the given
            count.
            * `@count PATH XPATH TEXT COUNT` checks for the occurrence of the given XPath
            with the given text in the specified file. The number of occurrences must
            match the given count.
            * `@snapshot NAME PATH XPATH` creates a snapshot test named NAME.
            A snapshot test captures a subtree of the DOM, at the location
            determined by the XPath, and compares it to a pre-recorded value
            in a file. The file's name is the test's name with the `.rs` extension
            replaced with `.NAME.html`, where NAME is the snapshot's name.
            htmldocck supports the `--bless` option to accept the current subtree
            as expected, saving it to the file determined by the snapshot's name.
            compiletest's `--bless` flag is forwarded to htmldocck.
            * `@has-dir PATH` checks for the existence of the given directory.
            * `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
            `[ENTRIES]`.
            All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
            checks if the given file does not exist, for example.
            """

            it has several issues:

            • it is hard to find, not linked to from rustc-dev-guide
            • it has not be updated to reflect the fact the syntax has changed from // @foo to //@ foo.
            • says "only absolute paths are supported", but then requires xpaths to start with //, not /.

            Metadata

            Metadata

            Assignees

            Labels

            A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsC-bugCategory: This is a bug.C-enhancementCategory: An issue proposing an enhancement or a PR with one.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

            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)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' htmldocck.py: replace outdated doc comment with link to updated docs · Issue #131974 · rust-lang/rust · GitHub
              Skip to content

              htmldocck.py: replace outdated doc comment with link to updated docs #131974

              Description

              @lolbinarycat

              the documentation is at

              r"""
              htmldocck.py is a custom checker script for Rustdoc HTML outputs.
              # How and why?
              The principle is simple: This script receives a path to generated HTML
              documentation and a "template" script, which has a series of check
              commands like `@has` or `@matches`. Each command is used to check if
              some pattern is present or not present in the particular file or in
              a particular node of the HTML tree. In many cases, the template script
              happens to be the source code given to rustdoc.
              While it indeed is possible to test in smaller portions, it has been
              hard to construct tests in this fashion and major rendering errors were
              discovered much later. This script is designed to make black-box and
              regression testing of Rustdoc easy. This does not preclude the needs for
              unit testing, but can be used to complement related tests by quickly
              showing the expected renderings.
              In order to avoid one-off dependencies for this task, this script uses
              a reasonably working HTML parser and the existing XPath implementation
              from Python's standard library. Hopefully, we won't render
              non-well-formed HTML.
              # Commands
              Commands start with an `@` followed by a command name (letters and
              hyphens), and zero or more arguments separated by one or more whitespace
              characters and optionally delimited with single or double quotes. The `@`
              mark cannot be preceded by a non-whitespace character. Other lines
              (including every text up to the first `@`) are ignored, but it is
              recommended to avoid the use of `@` in the template file.
              There are a number of supported commands:
              * `@has PATH` checks for the existence of the given file.
              `PATH` is relative to the output directory. It can be given as `-`
              which repeats the most recently used `PATH`.
              * `@hasraw PATH PATTERN` and `@matchesraw PATH PATTERN` checks
              for the occurrence of the given pattern `PATTERN` in the specified file.
              Only one occurrence of the pattern is enough.
              For `@hasraw`, `PATTERN` is a whitespace-normalized (every consecutive
              whitespace being replaced by one single space character) string.
              The entire file is also whitespace-normalized including newlines.
              For `@matchesraw`, `PATTERN` is a Python-supported regular expression.
              The file remains intact but the regexp is matched without the `MULTILINE`
              and `IGNORECASE` options. You can still use a prefix `(?m)` or `(?i)`
              to override them, and `\A` and `\Z` for definitely matching
              the beginning and end of the file.
              (The same distinction goes to other variants of these commands.)
              * `@has PATH XPATH PATTERN` and `@matches PATH XPATH PATTERN` checks for
              the presence of the given XPath `XPATH` in the specified HTML file,
              and also the occurrence of the given pattern `PATTERN` in the matching
              node or attribute. Only one occurrence of the pattern in the match
              is enough.
              `PATH` should be a valid and well-formed HTML file. It does *not*
              accept arbitrary HTML5; it should have matching open and close tags
              and correct entity references at least.
              `XPATH` is an XPath expression to match. The XPath is fairly limited:
              `tag`, `*`, `.`, `//`, `..`, `[@attr]`, `[@attr='value']`, `[tag]`,
              `[POS]` (element located in given `POS`), `[last()-POS]`, `text()`
              and `@attr` (both as the last segment) are supported. Some examples:
              - `//pre` or `.//pre` matches any element with a name `pre`.
              - `//a[@href]` matches any element with an `href` attribute.
              - `//*[@class="impl"]//code` matches any element with a name `code`,
              which is an ancestor of some element which `class` attr is `impl`.
              - `//h1[@class="fqn"]/span[1]/a[last()]/@class` matches a value of
              `class` attribute in the last `a` element (can be followed by more
              elements that are not `a`) inside the first `span` in the `h1` with
              a class of `fqn`. Note that there cannot be any additional elements
              between them due to the use of `/` instead of `//`.
              Do not try to use non-absolute paths, it won't work due to the flawed
              ElementTree implementation. The script rejects them.
              For the text matches (i.e. paths not ending with `@attr`), any
              subelements are flattened into one string; this is handy for ignoring
              highlights for example. If you want to simply check for the presence of
              a given node or attribute, use an empty string (`""`) as a `PATTERN`.
              * `@count PATH XPATH COUNT` checks for the occurrence of the given XPath
              in the specified file. The number of occurrences must match the given
              count.
              * `@count PATH XPATH TEXT COUNT` checks for the occurrence of the given XPath
              with the given text in the specified file. The number of occurrences must
              match the given count.
              * `@snapshot NAME PATH XPATH` creates a snapshot test named NAME.
              A snapshot test captures a subtree of the DOM, at the location
              determined by the XPath, and compares it to a pre-recorded value
              in a file. The file's name is the test's name with the `.rs` extension
              replaced with `.NAME.html`, where NAME is the snapshot's name.
              htmldocck supports the `--bless` option to accept the current subtree
              as expected, saving it to the file determined by the snapshot's name.
              compiletest's `--bless` flag is forwarded to htmldocck.
              * `@has-dir PATH` checks for the existence of the given directory.
              * `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
              `[ENTRIES]`.
              All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
              checks if the given file does not exist, for example.
              """

              it has several issues:

              • it is hard to find, not linked to from rustc-dev-guide
              • it has not be updated to reflect the fact the syntax has changed from // @foo to //@ foo.
              • says "only absolute paths are supported", but then requires xpaths to start with //, not /.

              Metadata

              Metadata

              Assignees

              Labels

              A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsC-bugCategory: This is a bug.C-enhancementCategory: An issue proposing an enhancement or a PR with one.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

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

                htmldocck.py: replace outdated doc comment with link to updated docs #131974

                Description

                @lolbinarycat

                the documentation is at

                r"""
                htmldocck.py is a custom checker script for Rustdoc HTML outputs.
                # How and why?
                The principle is simple: This script receives a path to generated HTML
                documentation and a "template" script, which has a series of check
                commands like `@has` or `@matches`. Each command is used to check if
                some pattern is present or not present in the particular file or in
                a particular node of the HTML tree. In many cases, the template script
                happens to be the source code given to rustdoc.
                While it indeed is possible to test in smaller portions, it has been
                hard to construct tests in this fashion and major rendering errors were
                discovered much later. This script is designed to make black-box and
                regression testing of Rustdoc easy. This does not preclude the needs for
                unit testing, but can be used to complement related tests by quickly
                showing the expected renderings.
                In order to avoid one-off dependencies for this task, this script uses
                a reasonably working HTML parser and the existing XPath implementation
                from Python's standard library. Hopefully, we won't render
                non-well-formed HTML.
                # Commands
                Commands start with an `@` followed by a command name (letters and
                hyphens), and zero or more arguments separated by one or more whitespace
                characters and optionally delimited with single or double quotes. The `@`
                mark cannot be preceded by a non-whitespace character. Other lines
                (including every text up to the first `@`) are ignored, but it is
                recommended to avoid the use of `@` in the template file.
                There are a number of supported commands:
                * `@has PATH` checks for the existence of the given file.
                `PATH` is relative to the output directory. It can be given as `-`
                which repeats the most recently used `PATH`.
                * `@hasraw PATH PATTERN` and `@matchesraw PATH PATTERN` checks
                for the occurrence of the given pattern `PATTERN` in the specified file.
                Only one occurrence of the pattern is enough.
                For `@hasraw`, `PATTERN` is a whitespace-normalized (every consecutive
                whitespace being replaced by one single space character) string.
                The entire file is also whitespace-normalized including newlines.
                For `@matchesraw`, `PATTERN` is a Python-supported regular expression.
                The file remains intact but the regexp is matched without the `MULTILINE`
                and `IGNORECASE` options. You can still use a prefix `(?m)` or `(?i)`
                to override them, and `\A` and `\Z` for definitely matching
                the beginning and end of the file.
                (The same distinction goes to other variants of these commands.)
                * `@has PATH XPATH PATTERN` and `@matches PATH XPATH PATTERN` checks for
                the presence of the given XPath `XPATH` in the specified HTML file,
                and also the occurrence of the given pattern `PATTERN` in the matching
                node or attribute. Only one occurrence of the pattern in the match
                is enough.
                `PATH` should be a valid and well-formed HTML file. It does *not*
                accept arbitrary HTML5; it should have matching open and close tags
                and correct entity references at least.
                `XPATH` is an XPath expression to match. The XPath is fairly limited:
                `tag`, `*`, `.`, `//`, `..`, `[@attr]`, `[@attr='value']`, `[tag]`,
                `[POS]` (element located in given `POS`), `[last()-POS]`, `text()`
                and `@attr` (both as the last segment) are supported. Some examples:
                - `//pre` or `.//pre` matches any element with a name `pre`.
                - `//a[@href]` matches any element with an `href` attribute.
                - `//*[@class="impl"]//code` matches any element with a name `code`,
                which is an ancestor of some element which `class` attr is `impl`.
                - `//h1[@class="fqn"]/span[1]/a[last()]/@class` matches a value of
                `class` attribute in the last `a` element (can be followed by more
                elements that are not `a`) inside the first `span` in the `h1` with
                a class of `fqn`. Note that there cannot be any additional elements
                between them due to the use of `/` instead of `//`.
                Do not try to use non-absolute paths, it won't work due to the flawed
                ElementTree implementation. The script rejects them.
                For the text matches (i.e. paths not ending with `@attr`), any
                subelements are flattened into one string; this is handy for ignoring
                highlights for example. If you want to simply check for the presence of
                a given node or attribute, use an empty string (`""`) as a `PATTERN`.
                * `@count PATH XPATH COUNT` checks for the occurrence of the given XPath
                in the specified file. The number of occurrences must match the given
                count.
                * `@count PATH XPATH TEXT COUNT` checks for the occurrence of the given XPath
                with the given text in the specified file. The number of occurrences must
                match the given count.
                * `@snapshot NAME PATH XPATH` creates a snapshot test named NAME.
                A snapshot test captures a subtree of the DOM, at the location
                determined by the XPath, and compares it to a pre-recorded value
                in a file. The file's name is the test's name with the `.rs` extension
                replaced with `.NAME.html`, where NAME is the snapshot's name.
                htmldocck supports the `--bless` option to accept the current subtree
                as expected, saving it to the file determined by the snapshot's name.
                compiletest's `--bless` flag is forwarded to htmldocck.
                * `@has-dir PATH` checks for the existence of the given directory.
                * `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
                `[ENTRIES]`.
                All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
                checks if the given file does not exist, for example.
                """

                it has several issues:

                • it is hard to find, not linked to from rustc-dev-guide
                • it has not be updated to reflect the fact the syntax has changed from // @foo to //@ foo.
                • says "only absolute paths are supported", but then requires xpaths to start with //, not /.

                Metadata

                Metadata

                Assignees

                Labels

                A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsC-bugCategory: This is a bug.C-enhancementCategory: An issue proposing an enhancement or a PR with one.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions