Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move top part of print_item to Tera templates #89695

Merged
merged 3 commits into from
Oct 10, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 3 additions & 9 deletions src/librustdoc/html/render/context.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use std::cell::RefCell;
use std::collections::BTreeMap;
use std::error::Error as StdError;
use std::io;
use std::path::{Path, PathBuf};
use std::rc::Rc;
Expand All @@ -16,6 +15,7 @@ use rustc_span::symbol::sym;

use super::cache::{build_index, ExternalLocation};
use super::print_item::{full_path, item_path, print_item};
use super::templates;
use super::write_shared::write_shared;
use super::{
collect_spans_and_sources, print_sidebar, settings, AllTypes, LinkFromSrc, NameDoc, StylePath,
Expand All @@ -33,7 +33,6 @@ use crate::formats::FormatRenderer;
use crate::html::escape::Escape;
use crate::html::format::Buffer;
use crate::html::markdown::{self, plain_text_summary, ErrorCodes, IdMap};
use crate::html::static_files::PAGE;
use crate::html::{layout, sources};

/// Major driving force in all rustdoc rendering. This contains information
Expand Down Expand Up @@ -225,7 +224,7 @@ impl<'tcx> Context<'tcx> {
&self.shared.layout,
&page,
|buf: &mut _| print_sidebar(self, it, buf),
|buf: &mut _| print_item(self, it, buf, &page),
|buf: &mut _| print_item(self, &self.shared.templates, it, buf, &page),
&self.shared.style_files,
)
} else {
Expand Down Expand Up @@ -416,12 +415,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
};
let mut issue_tracker_base_url = None;
let mut include_sources = true;

let mut templates = tera::Tera::default();
templates.add_raw_template("page.html", PAGE).map_err(|e| Error {
file: "page.html".into(),
error: format!("{}: {}", e, e.source().map(|e| e.to_string()).unwrap_or_default()),
})?;
let templates = templates::load()?;

// Crawl the crate attributes looking for attributes which control how we're
// going to emit HTML
Expand Down
1 change: 1 addition & 0 deletions src/librustdoc/html/render/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ mod tests;
mod context;
mod print_item;
mod span_map;
mod templates;
mod write_shared;

crate use context::*;
Expand Down
107 changes: 63 additions & 44 deletions src/librustdoc/html/render/print_item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,41 @@ use crate::html::highlight;
use crate::html::layout::Page;
use crate::html::markdown::{HeadingOffset, MarkdownSummaryLine};

use serde::Serialize;

const ITEM_TABLE_OPEN: &'static str = "<div class=\"item-table\">";
const ITEM_TABLE_CLOSE: &'static str = "</div>";
const ITEM_TABLE_ROW_OPEN: &'static str = "<div class=\"item-row\">";
const ITEM_TABLE_ROW_CLOSE: &'static str = "</div>";

pub(super) fn print_item(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer, page: &Page<'_>) {
// A component in a `use` path, like `string` in std::string::ToString
#[derive(Serialize)]
struct PathComponent<'a> {
path: String,
name: &'a str,
}

#[derive(Serialize)]
struct ItemVars<'a> {
page: &'a Page<'a>,
static_root_path: &'a str,
typ: &'a str,
name: &'a str,
item_type: &'a str,
path_components: Vec<PathComponent<'a>>,
stability_since_raw: &'a str,
src_href: Option<&'a str>,
}

pub(super) fn print_item(
cx: &Context<'_>,
templates: &tera::Tera,
item: &clean::Item,
buf: &mut Buffer,
page: &Page<'_>,
) {
debug_assert!(!item.is_stripped());
// Write the breadcrumb trail header for the top
buf.write_str("<h1 class=\"fqn\"><span class=\"in-band\">");
let name = match *item.kind {
let typ = match *item.kind {
clean::ModuleItem(_) => {
if item.is_crate() {
"Crate "
Expand Down Expand Up @@ -73,60 +98,54 @@ pub(super) fn print_item(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer,
unreachable!();
}
};
buf.write_str(name);
if !item.is_primitive() && !item.is_keyword() {
let cur = &cx.current;
let amt = if item.is_mod() { cur.len() - 1 } else { cur.len() };
for (i, component) in cur.iter().enumerate().take(amt) {
write!(
buf,
"<a href=\"{}index.html\">{}</a>::<wbr>",
"../".repeat(cur.len() - i - 1),
component
);
}
}
write!(buf, "<a class=\"{}\" href=\"#\">{}</a>", item.type_(), item.name.as_ref().unwrap());
write!(
buf,
"<button id=\"copy-path\" onclick=\"copy_path(this)\" title=\"Copy item path to clipboard\">\
<img src=\"{static_root_path}clipboard{suffix}.svg\" \
width=\"19\" height=\"18\" \
alt=\"Copy item path\">\
</button>",
static_root_path = page.get_static_root_path(),
suffix = page.resource_suffix,
);

buf.write_str("</span>"); // in-band
buf.write_str("<span class=\"out-of-band\">");
let mut stability_since_raw = Buffer::new();
render_stability_since_raw(
buf,
&mut stability_since_raw,
item.stable_since(cx.tcx()).as_deref(),
item.const_stability(cx.tcx()),
None,
None,
);
buf.write_str(
"<span id=\"render-detail\">\
<a id=\"toggle-all-docs\" href=\"javascript:void(0)\" \
title=\"collapse all docs\">\
[<span class=\"inner\">&#x2212;</span>]\
</a>\
</span>",
);
let stability_since_raw: String = stability_since_raw.into_inner();

// Write `src` tag
//
// When this item is part of a `crate use` in a downstream crate, the
// [src] link in the downstream documentation will actually come back to
// this page, and this link will be auto-clicked. The `id` attribute is
// used to find the link to auto-click.
if cx.include_sources && !item.is_primitive() {
write_srclink(cx, item, buf);
}
let src_href =
if cx.include_sources && !item.is_primitive() { cx.src_href(item) } else { None };

let path_components = if item.is_primitive() || item.is_keyword() {
vec![]
} else {
let cur = &cx.current;
let amt = if item.is_mod() { cur.len() - 1 } else { cur.len() };
cur.iter()
.enumerate()
.take(amt)
.map(|(i, component)| PathComponent {
path: "../".repeat(cur.len() - i - 1),
name: component,
})
.collect()
};

let item_vars = ItemVars {
page: page,
static_root_path: page.get_static_root_path(),
typ: typ,
name: &item.name.as_ref().unwrap().as_str(),
item_type: &item.type_().to_string(),
path_components: path_components,
stability_since_raw: &stability_since_raw,
src_href: src_href.as_deref(),
};

buf.write_str("</span></h1>"); // out-of-band
let teractx = tera::Context::from_serialize(item_vars).unwrap();
let heading = templates.render("print_item.html", &teractx).unwrap();
buf.write_str(&heading);

match *item.kind {
clean::ModuleItem(ref m) => item_module(buf, cx, item, &m.items),
Expand Down
20 changes: 20 additions & 0 deletions src/librustdoc/html/render/templates.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use std::error::Error as StdError;

use crate::error::Error;

pub(crate) fn load() -> Result<tera::Tera, Error> {
let mut templates = tera::Tera::default();

macro_rules! include_template {
($file:literal, $fullpath:literal) => {
templates.add_raw_template($file, include_str!($fullpath)).map_err(|e| Error {
file: $file.into(),
error: format!("{}: {}", e, e.source().map(|e| e.to_string()).unwrap_or_default()),
})?
};
}

include_template!("page.html", "../templates/page.html");
include_template!("print_item.html", "../templates/print_item.html");
Ok(templates)
}
2 changes: 0 additions & 2 deletions src/librustdoc/html/static_files.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,6 @@ crate static RUST_FAVICON_SVG: &[u8] = include_bytes!("static/images/favicon.svg
crate static RUST_FAVICON_PNG_16: &[u8] = include_bytes!("static/images/favicon-16x16.png");
crate static RUST_FAVICON_PNG_32: &[u8] = include_bytes!("static/images/favicon-32x32.png");

crate static PAGE: &str = include_str!("templates/page.html");

/// The built-in themes given to every documentation site.
crate mod themes {
/// The "light" theme, selected by default when no setting is available. Used as the basis for
Expand Down
26 changes: 26 additions & 0 deletions src/librustdoc/html/templates/print_item.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<h1 class="fqn"> {#- -#}
<span class="in-band"> {#- -#}
{{-typ-}}
{#- The breadcrumbs of the item path, like std::string -#}
{%- for component in path_components -%}
<a href="{{component.path | safe}}index.html">{{component.name}}</a>::<wbr>
GuillaumeGomez marked this conversation as resolved.
Show resolved Hide resolved
{%- endfor -%}
<a class="{{item_type}}" href="#">{{name}}</a> {#- -#}
<button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"> {#- -#}
<img src="{{static_root_path | safe}}clipboard{{page.resource_suffix}}.svg"
width="19" height="18"
alt="Copy item path">
</button> {#- -#}
</span> {#- -#}
<span class="out-of-band"> {#- -#}
{{- stability_since_raw | safe -}}
<span id="render-detail"> {#- -#}
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs"> {#- -#}
[<span class="inner">&#x2212;</span>] {#- -#}
</a> {#- -#}
</span> {#- -#}
{%- if src_href -%}
<a class="srclink" href="{{src_href | safe}}" title="goto source code">[src]</a>
{%- endif -%}
</span> {#- -#}
</h1> {#- -#}