Skip to content

Commit

Permalink
rustdoc: Restore --default-theme, etc, by restoring varname escaping
Browse files Browse the repository at this point in the history
In rust-lang#86157

    cd0f931
    Use Tera templates for rustdoc.

dropped the following transformation from the keys of the default
settings element's `data-` attribute names:

    .map(|(k, v)| format!(r#" data-{}="{}""#, k.replace('-', "_"), Escape(v)))

The `Escape` part is indeed no longer needed, because Tera does that
for us.  But the massaging of `-` to `_` is needed, for the (bizarre)
reasons explained in the new comments.

I have tested that the default theme function works again for me.  I
have also verified that passing

    --default-theme="zork&"

escapes the value in the HTML.

Closes rust-lang#87263.

CC: Jacob Hoffman-Andrews <github@hoffman-andrews.com>
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
  • Loading branch information
ijackson authored and GuillaumeGomez committed Jul 21, 2021
1 parent 05f2326 commit 155b055
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
24 changes: 23 additions & 1 deletion src/librustdoc/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,29 @@ impl Options {
})
.collect(),
];
let default_settings = default_settings.into_iter().flatten().collect();
let default_settings = default_settings.into_iter().flatten()
.map(
// The keys here become part of `data-` attribute names in the generated HTML. The
// browser does a strange mapping when converting them into attributes on the
// `dataset` property on the DOM HTML Node:
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset
//
// The original key values we have are the same as the DOM storage API keys and the
// command line options, so contain `-`. Our Javascript needs to be able to look
// these values up both in `dataset` and in the storage API, so it needs to be able
// to convert the names back and forth. Despite doing this kebab-case to
// StudlyCaps transformation automatically, the JS DOM API does not provide a
// mechanism for doing the just transformation on a string. So we want to avoid
// the StudlyCaps representation in the `dataset` property.
//
// We solve this by replacing all the `-`s with `_`s. We do that here, when we
// generate the `data-` attributes, and in the JS, when we look them up. (See
// `getSettingValue` in `storage.js.`) Converting `-` to `_` is simple in JS.
//
// The values will be HTML-escaped by the default Tera escaping.
|(k, v)| (k.replace('-', "_"), v)
)
.collect();

let test_args = matches.opt_strs("test-args");
let test_args: Vec<String> =
Expand Down
2 changes: 2 additions & 0 deletions src/librustdoc/html/static/js/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ function getSettingValue(settingName) {
return current;
}
if (settingsDataset !== null) {
// See the comment for `default_settings.into_iter()` etc. in
// `Options::from_matches` in `librustdoc/config.rs`.
var def = settingsDataset[settingName.replace(/-/g,'_')];
if (def !== undefined) {
return def;
Expand Down

0 comments on commit 155b055

Please sign in to comment.